志在指尖
用双手敲打未来

java贪吃蛇(代码详解)

java贪吃蛇

package 贪吃蛇;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import 贪吃蛇.Snake.OritentionEum;

//游戏的主窗口
public class GameFrame {
private Frame f ; //其实GameFrame直接继承Frame窗口就好
private int fLocationX = 300;
private int fLocationY = 50;
private int fWidth = 450; //窗口宽
private int fHeight=450; //窗口高
private StartPanel sp; //开始界面Panel
private GameCanvas gc; //贪吃蛇画布
private OerationList ol; //相关信息
private int rate = 5;
private Snake sk ;
private Food fd;
//窗口初始化
public void frameinit() {
f = new Frame(“游戏窗口”);
f.setLayout(null); //不使用布局管理,Panel用绝对定位
sp = new StartPanel(this).panelInit();
//sp =sp.panelInit();
sp.setBounds(fWidth/3, 100, fWidth/3, fHeight/2); //这个是相对于sp的上一级的component的
f.add(sp);
this.setAtt(fLocationX,fLocationY);
}
//窗口的属性,单独拿出来,在切换到游戏运行时还要用
public void setAtt(int x,int y) {
if(f!=null) {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setLocation(x, y); //设置组件在桌面显示的位置
f.setSize(fWidth, fHeight); //设置组件的大小 ,也可用setBounds同时设置位置和大小
f.setVisible(true);
}
}
//游戏开始窗口
public void createGame() {
f.setVisible(false);
int x=f.getX();
int y = f.getY();
f = new Frame(“贪吃蛇游戏开始”);
sk = new Snake(); //蛇
fd = new Food();
this.setAtt(x,y); //为了随时更新位置
f.setLayout(null);
gc = new GameCanvas();
gc.canvasInit(); //所以
gc.setBounds(0, 0, fWidth*2/3, fHeight); //gc宽度为300,高度为450
gc.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_UP: sk.setOritention(OritentionEum.UP);break;
case KeyEvent.VK_DOWN: sk.setOritention(OritentionEum.DOWN);break;
case KeyEvent.VK_LEFT: sk.setOritention(OritentionEum.LEFT);break;
case KeyEvent.VK_RIGHT: sk.setOritention(OritentionEum.RIGHT);break;
}
}
});
gc.setFocusable(true); //画布获取焦点
f.add(gc);
ol = new OerationList().listInit();
ol.setBounds(310, 75, fWidth/4, fHeight*2/3);
f.add(ol);
new updateTimeThread().start(); //更新时间线程
new updateCanvasThread().start();//绘画线程更新
}
public int getWidth() {
return f.getWidth();
}
public int getHeight() {
return f.getHeight();
}
public int getX() { //返回当前窗口的X坐标
return f.getX();
}
public int getY() {
return f.getY();
}
//绘画线程
class updateCanvasThread extends Thread{
public void run() {
while(true) {
gc.repaint();
String sp = ol.getSpeed();
try {
switch(sp) {
case “一级” : Thread.sleep(100);break;
case “二级” : Thread.sleep(300);break;
case “三级” : Thread.sleep(500);break;
}
} catch(Exception e) {e.printStackTrace();}
}
}
}
//更新界面线程
class updateTimeThread extends Thread{
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ol.updateTime();
}
}
}
//画布
class GameCanvas extends Canvas{
public GameCanvas canvasInit() {
this.setVisible(true);
return this;
}
public void update(Graphics g) {
Image img = this.createImage(fWidth*2/3,fHeight); //不能直接创建Image对象
Graphics gg = img.getGraphics();
gg.setColor(Color.GRAY); //灰色
gg.fillRect(0, 0, fWidth*2/3, fHeight);
gg.setColor(Color.BLACK);
gg.drawRect(10, 50, 250, 350); //起点10,,50,宽 250 高350 70行 50列的矩阵
if(!sk.crashed()) {
if(sk.eatFood(fd)) { //蛇如果吃到食物就尾部增长
fd.updateFood();
sk.growTail();
ol.updateScore();
}
sk.drawSnake(gg,rate); //画蛇的时候传入一个rate来控制大小
fd.drawFood(gg, rate);
} else { //游戏结束画面
gg.setFont(new Font(“微软雅黑”,2,15)); //设置字体
gg.setColor(Color.WHITE);
gg.fillRect(60, 175, 150, 40);
gg.setColor(Color.RED);
gg.drawString(“游戏结束 得分”+ol.getScore(), 80 , 200);
}
g.drawImage(img, 0, 0, this);
paint(g);
}
public void paint(Graphics g) {
}
}
public static void main(String[] args) {
GameFrame game = new GameFrame();
game.frameinit();
}

}

java

java贪吃蛇代码详解

今天我就从零开始来完结这个小游戏,完结的办法也是一步一步的增加功用这样的办法来完结。
第一步完结的功用:写一个界面
咱们见到的贪吃蛇小游戏,界面肯定是少不了的。因此,第一步便是写一个小界面。
完结代码如下:
第二步完结的功用:在界面上画成一格一格的
咱们见过的贪吃蛇游戏,是有一个格子一个格子构成,然后蛇在这个里边运动。
重写paint办法,单元格便是横着画几条线竖着画几条线即可。
代码如下:
作用如下:
第三步完结的功用:建立另外的线程来操控重画
由于,蛇的运动便是改变蛇地点的位置,然后进行重画,便是咱们所看到的运动。因此,在这儿,咱们单独用一个线程来操控重画。
1、新建一个MyPaintThread类,完结了Runnable接口
2、在SnakeFrame的launchFrame办法中增加代码:
newThread(newMyPaintThread()).start();即可。
完结功用:使用双缓冲来处理闪耀的问题
第四步完结的功用:在界面上画一个蛇出来
贪吃蛇游戏中的蛇便是用一系列的点来表示,这儿咱们来模仿一个链表。链表上的每个元素代表一个节点。
首要,咱们先新建一个Node类来表示构成蛇的节点,用面向对象的思想,发现,这个类应该有如下的属性和办法:
1、位置
2、大小,即长度、宽度
3、方向
4、结构办法
5、draw办法
Node类的代码如下:
irection是一个enum,详细如下:
而在Snake类中,用面向对象的思想,可以发现,Snake类中应该有如下的属性和办法
1、头结点
2、尾结点
3、结构函数
3、draw办法
详细代码如下:
在SnakeFrame类中new一个Snake对象,然后调用Snake对象的draw办法即可。
作用如下:
第五步完结的功用:经过键盘操控蛇的上下左右移动
首要想到的是这样:在Snake类中增加一个keyPressed办法,然后在SnakeFrame的键盘事情中调用Snake对象的keyPressed办法。
留意:蛇的移动是经过在头部增加一个单元格,在尾部删去一个单元格这样的思想来完结。
详细如下:
Snake类中增加一个keyPressed办法,主要是根据键盘的上下左右键来确定蛇的头结点的方向,然后move办法再根据头结点的方向来在头部增加一个单元格。
这样就完结了经过键盘来完结蛇的移动。
完结的功用:蛇吃蛋
首要咱们新建一个蛋Egg的类。
类的属性和办法有:
1、位置、大小
2、结构办法
3、draw办法
4、getRect办法:用于碰撞检测
5、reAppear办法:用于从头产生蛋的办法
代码如下:
蛇吃蛋,怎么样才能判别蛇吃到蛋了呢,这就需求用到碰撞检测了。
这儿咱们在Snake类中增加一个eatEgg办法。当蛇吃到蛋之后,就需求将蛇的长度+1,这儿处理的是在蛇的头部增加一个节点,当蛋被吃掉之后,就需求再从头随机产生一个蛋。
代码如下:
publicRectanglegetRect(){
returnnewRectangle(head.col*BLOCK_WIDTH,head.row*BLOCK_HEIGHT,BLOCK_WIDTH,BLOCK_HEIGHT);}
以上就完结了蛇吃蛋的功用。
完结的功用:增加鸿沟处理
在咱们熟悉的贪吃蛇游戏中,咱们一般都知道,当蛇撞到墙或者是撞到自己身体的某一部分,则游戏就完毕。下面咱们就来完结这一功用。
在Snake类中,增加checkDead办法
假如蛇撞墙或是撞到自己本身的某一个部分。则调用SnakeFrame类中的gameOver()办法来进行必定的处理。
本游戏的处理办法为:经过设置一个boolean变量,来中止游戏并提示相关信息。
详细代码如下:
以上就完结了蛇是否撞墙或是撞到自身一部分的功用。
小结
以上基本上完结了贪吃蛇的基本功用。剩下的一些功用不再介绍,例如:增加得分记载、经过键盘某按键来操控游戏的中止、从头开始、再来一局等。
以上的功用尽管没有介绍,但是在代码中,我有完结这些相应的功用。

未经允许不得转载:IT技术网站 » java贪吃蛇(代码详解)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载