
1、本代码主要功能为实现贪吃蛇游戏,图形用户界面界面做到尽量简洁和原游戏相仿。目前版本包含计分,统计最高分,长度自动缩短计时功能。
2、运行时请把Java。语言(一种计算机语言,尤用于创建网站)文件放入默认包即可运行。
答文件位置
b)进入游戏
c)游戏进行中
Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)实现代码
版权所有3导入Java。awt。*;
导入Java。awt。事件。*;
导入静态Java。郎。字符串。格式;导入Java。util。*;
导入Java。util。列表;导入javax。挥棒。*;
Publicclass扩展JPanel实现可运行{
枚举目录{
向上(0,-1),向右(1,0),向下(0,1),向左(-1,0);
Dir(intx,inty){ this。x=xthis.y=y
}
finalintx,y;
}
静态最终随机rand=new Random();
staticfinalintWALL=-1;
staticfinalintMAX _ ENERGY=1500
volatilebooleangameOver=true
线程gameThreadintscore,hiScoreintnRows=44
intnCols=64
直接能源
int[][]网格;
列举《点蛇,请客;
字体小字体
公共蛇(){
setPreferredSize(新维度(640,440));
设置背景(颜色。白色);
设置字体(新字体(“SansSerif”,字体。粗体,48));
setFocusable(true);
smallFont=getFont().衍生字体(字体。粗体,18);
初始化网格();
addMouseListener(新的MouseAdapter() {
@覆盖
按下公共void鼠标(鼠标事件e){
if (gameOver) {
开始新游戏();
repaint();
}
}
});
addkey侦听器(新密钥适配器(){
@覆盖
公共无效按键(按键事件e) {
switch (e.getKeyCode()) {
案例关键事件VK_UP:如果(dir!=dir。向下)dir=dir。向上;打破;
案例关键事件VK _左:如果(dir!=dir。右)dir=dir。左;打破;
案例关键事件VK _右:如果(dir!=dir。左)dir=dir。对;打破;
案例关键事件VK _唐:如果(dir!=dir。向上)dir=dir。向下;打破;
}
repaint();
}
});
}
void start new game(){ game over=false;
stop();
初始化网格();
treats=新链表();
dir=左方向
能量=最大能量
if(score hiScore)他的核心=score得分=0;
snake=new ArrayList();for(intx=0;x7;x ) snake.add(新点(nCols/2 x,nRows/2));
do添加treat();而(请客。isempty());
(游戏线程=新线程(这个)).start();
}
无效停止(){
如果(gameThread!=null) {
thread tmp=gameThreadgameThread=nulltmp。中断();
}
}
void init grid(){ grid=new int[nRows][nCols];for(intr=0;
r”n行;r){ for(intc=0;cif(c==0 | | c==nCols-1 | | r==0 | | r==nRows-1)grid[r][c]=WALL;
}
}
}
@覆盖
publicvoid run() {
while(线程。当前线程()==游戏线程){ try { thread。睡觉(数学。最大值(75分,25));
} catch (InterruptedException e) {
返回;
} if(能量消耗()| |击中墙壁()| |击中蛇()){
游戏结束();
}否则{
if(eatsTreat()){ score;能量=最大能量
长蛇();
}
moveSnake();
添加treat();
}
repaint();
}
}布尔使用的能量(){ energy-=10;
返回能量=0;
}
布尔hitsWall() {
点头=蛇。get(0);
int nextcol=head。x方向。x;
int nextrow=head。y方向。y;
return grid[next row][next col]==WALL;
}
布尔hitsSnake() {
点头=蛇。get(0);
int nextcol=head。x方向。x;
int nextrow=head。y方向。y;
for(点p:snake)if(p . x==nextcolp。y==nextRow)返回true返回假的;
}
布尔eatsTreat() {
点头=蛇。get(0);
int nextcol=head。x方向。x;int nextrow=head。y方向。y;for(点p:treats)if(p . x==nextcolp。y==nextRow){回请。移除(p);
}
返回假的;
} void gameOver(){ gameOver=true;
stop();
} void moveSnake() {
for(inti=snake。size()-1;I 0;我- ) {
点P1=蛇。get(I-1);
点p2=蛇。get(I);p2。x=P1。x;
p2。x=P1。x;p2。y=P1。y;
}
点头=蛇。get(0);头。x=方向。x;头。y=方向。y;
}
void growSnake() {
点尾=蛇。获取(蛇。size()-1);intx=tail。x方向。x;inty=tail。y方向。y;snake.add(新点(x,y));
} void add treat(){ if(treats。size()《3》{
如果(兰特。nextint(10)==0){//1 in 10 if(rand。nextint(4)!=0) { //3 in 4 intx,y;while (true) {
x=兰特。nextint(nCols);
y=兰特。nextint(nRows);if (grid[y][x]!=0)继续;
点p=新点(x,y);
如果(蛇。包含(p)| | treats。包含(p))继续;
款待。添加(p);打破;
}
}
else if(请客。大小()1)对待。删除(0);
}
}
}
void绘制网格(图形2d g){ g .设置颜色(颜色。浅灰色);
for(intr=0;r}
}
}
void绘制蛇(图形2d g){ g .设置颜色(颜色。蓝色);对于(点p : snake) g.fillRect(p.x * 10,p.y * 10,10,10);
g.setColor(能量500?颜色。红色:颜色。橙色);
点头=蛇。get(0);
g.fillRect(head.x * 10,head.y * 10,10,10);
}
void drawTreats(Graphics2D g) {
g。设置颜色(颜色。绿色);对于(点p : treats) g.fillRect(p.x * 10,p.y * 10,10,10);}
void draw开始屏幕(图形2d g){ g .设置颜色(颜色。蓝色);
g。设置字体(get font());
g。拉带("蛇",240,190);
g。设置颜色(颜色。橙色);g .设置字体(小字体);
g .拉绳((点击开始)",250,240);
}
void draw score(graphics 2d g){ inth=getHeight();
g。设置字体(小字体);
g。设置颜色(get foreground());
string s=format("hiscore % d score % d",his core,score);
g。拉带(s,30,h-30);
g.drawString(format("energy %d",energy),getWidth() - 150,h-30);
}
@覆盖
公共空油漆组件(图形gg){ super。油漆成分(gg);
图形2d g=(图形2d)gg;
g。setrenderinghint(呈现提示.钥匙_抗锯齿,渲染提示VALUE _ ANTIALIAS _ ON);
绘图网格(克);
if (gameOver) {
绘制开始屏幕(g);
}否则{
画蛇(g);
抽奖活动(克);
抽奖分数(克);
}
}
publicstaticvoid main(String[]args){
摇摆公用事业。稍后调用(()-{
JFrame f=new JFrame();
f。setdefaultcloseoperation(JFrame .EXIT _ ON _ CLOSE);
塞蒂特莱(《蛇》);
f。setresizable(false);
f.add(new Snake(),BorderLayout .中心);
f。pack();
f。setlocationrelativeto(null);
f。设置可见(真);
});
}
}









