贪吃蛇游戏的开发
一: 项目要求
1)实现贪吃蛇游戏的基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后蛇得身体加长一点。
2)“蛇”碰到边界或蛇头与蛇身相撞的时候,蛇死亡,游戏结束。
3)为游戏设计友好的交互界面:如欢迎,游戏,结束等界面。要求要有开始、暂停、和停止,退出的选项。
4)对蛇吃到豆子进行得分计算,可以设置游戏速度,音乐等拓展元素
二:项目分析
1)建立类Snake
2)建立GUI界面
3)重写接口的方法
三、已完成的功能和不足之处
1)游戏的基本逻辑已实现
2)欢迎结束的界面和游戏速度尚未添加
四、Snake类和GUI的建立
4.1snake基本的参数
int len;//蛇长度
int score;//得分
int isstart = 0;//游戏是否开始(=0不开始(暂停),=1游戏开始,=2游戏结束),默认不开始
int direc;//运动方向 (1向右运动 2向上运动 -1向左运动 -2向下运动)
int[] Snakex = new int[500];
int[] Snakey = new int[500];
int foodx;
int foody;
Timer timer = new Timer(200, (ActionListener) this);
Random random = new Random();//生成随机数
4.2窗体的建立
public void myJFrame() {
this.setTitle("贪吃蛇");
this.setSize(800, 600);
this.setResizable(false);
this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setFocusable(true);
this.addKeyListener(this);
this.setVisible(true);
// 蛇的初识位置
Snakex[0] = 60;
Snakey[0] = 100;
Snakex[1] = 40;
Snakey[1] = 100;
// 随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
}
4.3paint方法绘图
public void paint(Graphics g) {
// 绘制背景
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, 800, 600);
//绘制游戏区域
g.setColor(Color.white);
g.fillRect(0, 80, 800, 520);
//绘制蛇
for (int i = 0; i < slong; i++) {
g.setColor(Color.CYAN);
g.fillRect(Snakex[i], Snakey[i], 20, 20);
}
// 绘制食物
g.setColor(Color.yellow);
g.fillOval(foodx, foody, 20, 20);
if (started == 1) {
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
g.drawString("当前分数为:", 300, 65); //绘制字符
g.drawString(String.valueOf(slong - 2), 420, 65); //绘制字符
} else if (started == 2) {
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
g.drawString("游戏结束-", 250, 65); //绘制字符
g.drawString("最终分数为:", 350, 65); //绘制字符
g.drawString(String.valueOf(slong - 2), 470, 65); //绘制字符
}
}
4.4键盘事件
@Override
public void keyPressed(KeyEvent e) {
// 获取从键盘输入的键
int key = e.getKeyCode();
// 判断是否为空格
if (key == KeyEvent.VK_SPACE) {
if (started == 0) {
started = 1;
} else if (started == 1) {
started = 0;
} else if (started == 2) {
started = 0;
slong = 2;//蛇当前长度
// 蛇的初识位置
Snakex[0] = 60;
Snakey[0] = 100;
Snakex[1] = 40;
Snakey[1] = 100;
// 随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
// 初始化方向
fx = 1;
}
repaint();
timer.start();
// 左
} else if (key == KeyEvent.VK_LEFT) {
if (fx != 1) {
fx = 0;
}
// 右
} else if (key == KeyEvent.VK_RIGHT) {
if (fx != 0) {
fx = 1;
}
// 上
} else if (key == KeyEvent.VK_UP) {
if (fx != 3) {
fx = 2;
}
//下
} else if (key == KeyEvent.VK_DOWN) {
if (fx != 2) {
fx = 3;
}
}
}
4.5操作监听
@Override
public void actionPerformed(ActionEvent e) {
// 判断游戏是否开始
if (started == 1) {
// 通过循环控制蛇移动
for (int i = slong - 1; i > 0; i--) {
Snakex[i] = Snakex[i - 1];
Snakey[i] = Snakey[i - 1];
}
// 判断蛇移动的方向
if (fx == 0) {
Snakex[0] = Snakex[0] - 20;
} else if (fx == 1) {
Snakex[0] = Snakex[0] + 20;
} else if (fx == 2) {
Snakey[0] = Snakey[0] - 20;
} else if (fx == 3) {
Snakey[0] = Snakey[0] + 20;
}
// 判断蛇是否撞到墙外
if (Snakex[0] < 0 || Snakex[0] > 780 || Snakey[0] < 80 || Snakey[0] > 580) {
started = 2;
}
// 判断蛇是否吃到了食物
if (Snakex[0] == foodx && Snakey[0] == foody) {
slong++;
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
System.out.println(foodx + "," + foody);
}
// 判断是否吃到了自己
for (int i = 1; i < slong; i++) {
if (Snakex[0] == Snakex[i] && Snakey[0] == Snakey[i]) {
started = 2;
break;
}
}
// 判断食物是否随机在了蛇身上
for (int i = 0; i < slong; i++) {
if (foodx == Snakex[i] && foody == Snakey[i]) {
// 随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
System.out.println(foodx + "," + foody);
}
}
repaint();
}
timer.start();
}