贪吃蛇游戏: 一个游戏最核心的部分是游戏的业务逻辑代码。
分析里面的有几个事物:
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
具体运行效果如下: