使用JAVA制作一个贪吃蛇小游戏
1.要求
本实例用Applet实现4种级别的玩法,可以通过方向键控制蛇的运动来靠近前面的食物并吃掉食物,当碰到墙壁时作为游戏失败。
2.原理
实现4个级别,分别为 PRIMARY(初级)、 INTERMEDIATE(中级)、 SENIOR(高级)和 EXTRA(特级),选择级别进入游戏界面。
方向键用来控制蛇的运动。小蛇向着食物的方向前进,如果不小心碰到墙壁则游戏结束。上方显示本次的成绩(得分)。小蛇本身在直行时由小段组成,碰到拐弯变成两段,每段由黑色的方格组成。
3.语法
- Move类设置小蛇或食物的位置,其中move_X表示小蛇或食物所在的横坐标,Y表示小蛇或食物所在的纵坐标。
- MoveOperate类实现 Runnable接口,实现接口必须实现接口run()方法,继承Observablea类表时该类是一个被观察的对象,当它有任何修改操作时都在别人的观察控制中。声明isHave二维布尔数组来存储游戏区域各个位置的状态,如果数值为真则表明在该位置上有小蛇的身体或食物,否则没有。声明 snake来存储蛇身体的各个部分,由于蛇身和蛇尾都要操作,而 Linkedlist是双向链表,在操作数据的头和尾时速度相对其他的集合都是比较快的声明move_Direction表明小蛇初始是向左移动。声明timeSpace来控制小蛇移动的间隔时间,时间越小,小蛇移动的越快。声明 Running标识小蛇是否在移动。声明 moveout来获得小蛇在吃到食物前移动的次数,移动的次数越小,则分数越高。声明四个静态变量来操作小蛇移动的方向。
- MoveOperate类的run()方法根据标识为真进行循环判断小蛇的状态,如果小蛇正在移动,那么调用 Observable类的setChanged()方法标识被观察者对象发生改变,调用Observable类的notifyObservers()方法通知该对象的观察者,否则弹出显示游戏结束的对话框。如果小蛇暂停或停止,则弹出停止游戏的对话框。
- MoveOperate类的resetGame()方法重置游戏,初始化小蛇移动的方向、时间间隔、在吃到食物之前移动的次数以及初始化蛇的身体和食物等。循环中Array.fill()方法将数组的元素统一赋值为false。Move()方法是小蛇移动一步。通过双向链表集合LinkedList的getFirst()方法取得小蛇的蛇头的信息,包括其所在的横坐标和纵坐标。可以用来修改小蛇头的坐标,如果修改后的坐标落在游戏区域内,而且该位置上没有蛇的身体,则允许移动,将小蛇的头的新坐标构建一个新的对象,通过LinkedList类的addFirst()方法可以将新小蛇头加到蛇的身体中,通过 LinkedList类的removeLast()方法去掉小蛇的尾部,小蛇的长度保持不变,整体前进一步。如果修改后的蛇头位置上有食物,则吃掉食物,把食物位置添加到小蛇的头部,小蛇的尾部保持不变,可以看作是小蛇的身体长度加1,同时增加成绩值。成绩值与小蛇移动的次数和移动的频率有关。在计算成绩时,随机创建一个新的食物。
- MoveOperate类的changeDirection()方法改变小蛇运动的方向,如果小蛇的前进方向与被改变的方向不在同一直线上,才改变小蛇前进的方向。 createAliment()方法在游戏区域随机生成一个食物类, Random类的 nextInt()方法生成一个随机的整数作为坐标,如果坐标上没有小蛇的身体,则将该坐标上放食物,否则继续生成新的坐标,直到新的食物生成。
- SnakeFramea类继承JFrame类实现Observer接口,实现该接口须实现 updated()方法,表明该类是一个观察者对象,可以观察别人的一切变化情况。 SnakeFrame类的构造方法中初始化格子的宽度和高度、画面的宽度和高度。init()方法初始化一个游残界面。设置界面的标题和初始位置,创建一个显示分数的标签,创建一个容器用来放置小蛇和食物。
- SnakeFrame类的update()方法实现了Observer接口,作为一个观察者对象,当观察的对象发生变化或改变时,会调用该方法。即当被观察者 MoveOperate对象调用notifyobservers()方法时,观察者SnakeFrame对象将会收到信息,并且调用 update()方法做相应的修改处理。其从方法的参数中获得被观察者对象,转换成MoveOperate对象。通过 Canvas类的getGraphics()方法获得画板的上下文环境Graphics, Graphics的fillRect()方法画一个矩形,表示游戏的区域,通过MoveOperate类的get Move List()和 getAliment方法获得小蛇和食物的数据,实质上是一组Move对象,调用draw Node()方法画Move。
- SnakeFrame类的drawMove()方法画Move对象,一个Move表示一个坐标,赋一定宽度和高度可以画一个矩形,使用 Graphics类的 Ifilirecto方法可以画一个矩形。
- ControlSnake类实现 KeyListener接口来处理键盘事件必须实现key Pressed()方法、keyReleased()方法和keyType方法。InitSnake()方法初始化游戏界面和小蛇以及食物。创建MoveOperate()对象和 SnakeFrame对象,再通过addObserver()方法将对象SnakeFrame添加到MoveOperate的观察者中。调用addKeyListener()方法为SnakeFrame添加键盘监听器,用于处理键盘事件。启动小蛇游戏的线程使小蛇移动起来。
- ControlSnake类的keyPressed()方法根据参数KeyEvent获得被按下键盘的码,不同的码调用不同的方法实现不同的操作。
4.代码
主程序:
public class rw37 {
//操作实现小蛇吃食物的操作
public static void main(String[] args) {
// TODO Auto-generated method stub
//JAVA程序主入口处
new ControlSnake(40,30);//实例化对象
}
}
控制蛇的运动:
class ControlSnake implements KeyListener{
//控制蛇的运动
private MoveOperate snake;//贪吃的小蛇模型
private SnakeFrame frame;//蛇的视图对象
private int X;//蛇移动区域横坐标
private int Y;//蛇移动区域纵坐标
public ControlSnake() {
//默认构造方法进行初始化
this.X=30;
this.Y=40;
}
public ControlSnake(int X,int Y) {
//带参数的构造方法进行初始化
this();
if((10<X)&&(X<200)&&(10<Y)&&(Y<200)) {
//判断移动区域
this.X=X;
this.Y=Y;
}else {
System.out.println("初始化参数出错!");
}
initSnake();//调用 初始化方法
}
private void initSnake() {
//初始化
this.snake=new MoveOperate(X,Y);//创建蛇模型
this.frame=new SnakeFrame(X,Y,500