贪食蛇

贪吃蛇游戏: 一个游戏最核心的部分是游戏的业务逻辑代码。  

分析里面的有几个事物:
    1. 地图
    2. 蛇
    3. 食物

了解游戏规则: 
    1.蛇初始化的时候是三个节点,而且一开始蛇是出现在地图的中间位置。
    2. 蛇吃到东西会长长一节。 
    3. 蛇咬到自己会死,蛇撞墙也会死。
    4. 食物是随机生成的,食物不能长在石头上,食物可以长在蛇身上。

业务逻辑部分SnakeGame.java

package cn.itcast.snake;

import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

import cn.itcast.util.FrameUtil;

public class SnakeGame {
	
	//地图的宽(列数)
	public static final int WIDTH = 35;
	
	//地图高(行数)
	public static final int HEIGHT = 9;	
	
	
	//地图
	private char[][] background = new char[HEIGHT][WIDTH];
	
	//使用集合保存蛇节点的所有信息
	LinkedList  snake = new LinkedList(); 
	
	
	//食物
	Point	food;
	
	//使用四个常量表示四个方向
	public static final int UP_DIRECTION = 1;  //上
	
	public static final int DOWN_DIRECTION = -1;  //下
	
	public static final int LEFT_DIRECTION = 2;  //左
	
	public static final int RIGHT_DIRECTION =-2;  //右


	//蛇当前的方向
	int currentDrection = -2; // 蛇默认是向右行走
	
	
	//记录游戏是否结束
	static	boolean isGameOver = false; //默认游戏没有结束的。
	
	
	//蛇移动的方法
	public void move(){
		Point head = snake.getFirst();
		//蛇是根据当前的方向移动的
		switch (currentDrection) {
			case UP_DIRECTION:
				//添加新的蛇头
				snake.addFirst(new Point(head.x,head.y-1));
				break;
			case DOWN_DIRECTION:
				//添加新的蛇头
				snake.addFirst(new Point(head.x,head.y+1));
				break;
			case LEFT_DIRECTION:
				if(head.x==0){
					snake.addFirst(new Point(WIDTH-1,head.y));
				}else{
					//添加新的蛇头
					snake.addFirst(new Point(head.x-1,head.y));
				}
				break;
			case RIGHT_DIRECTION:
				if(head.x==WIDTH-1){
					snake.addFirst(new Point(0,head.y));
				}else{
					//添加新的蛇头
					snake.addFirst(new Point(head.x+1,head.y));
				}
				break;
			default:
				break;
		}
		
		if(eat()){
			//吃到了食物
			createFood();
		}else{
			//删除蛇尾
			snake.removeLast(); 		
		}
	}
	
	
	//改变当前方向的方法
	public  void changeDirection(int newDirection){
		//判断新方向是否与当前方向是否是相反方向,才允许其改变
		if(newDirection+currentDrection!=0){
			this.currentDrection = newDirection;
		}
	}
	
	
	
	

	//生成食物 
	public void createFood(){
		//创建一个随机数对象
		Random random = new Random();
		while(true){
			int x = random.nextInt(WIDTH); 
			int y = random.nextInt(HEIGHT);
			if(background[y][x]!='*'){
				food = new Point(x,y);
				break;
			}
		}
	}
	
	//显示食物
	public void showFood(){
		background[food.y][food.x] ='@';
	}
	

	
	//初始化蛇
	public void initSnake(){
		int x = WIDTH/2;
		int y = HEIGHT/2;
		snake.addFirst(new Point(x-1,y));
		snake.addFirst(new Point(x,y));
		snake.addFirst(new Point(x+1,y));
	}
	
	
	//显示蛇--->实际上就是将蛇节点 的坐标信息反馈到地图上,在地图上画上对应的字符而已
	public void showSnake(){
	
		//画蛇身
		for(int i =1; i

游戏窗口部分

1.初始化窗口FrameUtil.java

package cn.itcast.util;

import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;

//初始化窗体的工具类
public class FrameUtil {

	
	public static void initFrame(JFrame frame,int width , int height){
		Toolkit toolkit = Toolkit.getDefaultToolkit(); //获取一个与系统相关工具类对象
		//获取屏幕的分辨率
		Dimension d = toolkit.getScreenSize();
		int x = (int) d.getWidth();
		int y = (int) d.getHeight();
		frame.setBounds((x-width)/2, (y-height)/2, width, height);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

2.具体窗口设置 Demo1.java 

package cn.itcast.view;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

import cn.itcast.util.FrameUtil;

public class Demo1 extends JPanel {  //Demo1 也是一个面板
	
	
	@Override
	public void paint(Graphics g) {  // Graphics g 画笔  使用该画笔可以画任何的东西。
		//设置画笔的颜色
		g.setColor(Color.GRAY);
		//画矩形
		g.fill3DRect(0, 0, 20, 20, true);
		g.fill3DRect(20, 0, 20, 20, true);
		g.setColor(Color.GREEN);
		g.fill3DRect(20,20, 20, 20, true);
		
		//写字
		g.setColor(Color.RED);
		//设置画笔 的字体
		g.setFont(new Font("宋体", Font.BOLD, 30));
		g.drawString("GAME OVER", 300, 200);
		
	}
	
	public static void main(String[] args) {
		JFrame frame = new JFrame("测试");
		Demo1 d = new Demo1();
		frame.add(d);
		FrameUtil.initFrame(frame,700, 500);
		
	}

	
	
	

}

 3.蛇设计

package cn.itcast.view;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;

import javax.swing.JFrame;
import javax.swing.JPanel;

import cn.itcast.util.FrameUtil;

public class SnakeView  extends JPanel{

	//地图的宽(列数)
	public static final int WIDTH = 40;
	
	//地图高(行数)
	public static final int HEIGHT = 30;	
	
	
	//格子宽
	public static final int CELLWIDTH = 20;
	
	//格子高
	public static final int CELLHEIGHT = 20;
	
	//地图
	private boolean[][] background = new boolean[HEIGHT][WIDTH];
	

	//使用集合保存蛇节点的所有信息
	LinkedList  snake = new LinkedList(); 
	
	
	//初始化蛇
	public void initSnake(){
		int x = WIDTH/2;
		int y = HEIGHT/2;
		snake.addFirst(new Point(x-1,y));
		snake.addFirst(new Point(x,y));
		snake.addFirst(new Point(x+1,y));
	}
		
	
	//向上移动
	public void moveUp(){
		//获取原来蛇头 
		Point head = snake.getFirst();
		//添加新的蛇头
		snake.addFirst(new Point(head.x,head.y-1));
		//删除蛇尾
		snake.removeLast();
	}
	
	
	//初始化地图
	public void initBackground(){
		for(int rows = 0 ; rows

具体运行效果如下:

贪食蛇_第1张图片 

 


    

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(小项目)