首页编程java编程java小游戏贪吃蛇?java怎么让贪吃蛇游戏暂停

java小游戏贪吃蛇?java怎么让贪吃蛇游戏暂停

编程之家2026-06-011101次浏览

大家好,java小游戏贪吃蛇相信很多的网友都不是很明白,包括java怎么让贪吃蛇游戏暂停也是一样,不过没有关系,接下来就来为大家分享关于java小游戏贪吃蛇和java怎么让贪吃蛇游戏暂停的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

java小游戏贪吃蛇?java怎么让贪吃蛇游戏暂停

如何用java实现一个贪吃蛇小游戏

1、设计游戏,首先就要设计界面。首先看一下我设计的一个界面。界面分为左边的游戏区与右边的控制区。游戏区包含“得分信息”和贪吃蛇的游戏区,右边控制区有“开始”“暂停”“停止”按钮,等级选择单选框以及游戏排行榜。

2、所以我们需要定义swing组件,并在类初始化时初始化这些组件,添加组件。因为后面设计游戏的时候,我们要确切知道游戏区的大小,所以这里设置游戏区固定大小值。本来想用布局来更好的管理,但作者对布局也掌握不够,所以就先设置固定大小吧。

3、定义我们的游戏。贪吃蛇游戏其实就是包含很多细小网格,然后蛇在网格中移动。蛇由一连串的网格组成,为了视觉效果,蛇身用蓝色标记,食物用红色标记,背景白色。如第一张图片所示。所以,我们需要定义二维数组,保存网格信息,保存蛇身和食物的位置信息等。初始化时,还需要添加键盘事件控制上下左右移动。

4、食物的位置信息是二维的,所以我简单定义了一个类用来保存二维信息。

5、接着就是实现游戏的功能了。开始,暂停,停止按钮添加事件控制游戏开始。等级按钮定义游戏难度等。

6、开始游戏后,我们定义一个定时器。蛇身按照指定的方向移动,方向是通过初始化时添加的键盘事件,键盘的上下左右按钮来控制。蛇身是连续的位置信息,保存到队列中,所以蛇身的移动就是队首增加一个位置,队尾减少位置,然后重新绘画游戏区就可以了。

java小游戏贪吃蛇?java怎么让贪吃蛇游戏暂停

谁会用java编写“贪吃蛇”小游戏

汗要程序怎么这么点分啊哭了

呵呵不过你还是挺幸运给你吧

连连看的代码(基本算法)加了部分注释

import java.awt.*;

import java.awt.event.*;

public class lianliankan implements ActionListener

java小游戏贪吃蛇?java怎么让贪吃蛇游戏暂停

{

static String s="no";//用来纪录点击按钮的信息

int x0=0,y0=0,x=0,y=0,n1=0,n2=0;//用来纪录按钮的位置信息

Frame f,f1;

Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b10;//用比较笨的方法添加了

Button b11,b12,b13,b14,b15,b16,b17,b18;//30个按钮来实现游戏界面

Button b19,b20,b21,b22,b23,b24,b25;//可以用数组实现,这是本人

Button b26,b27,b28,b29,b30,bc;//学java时,入门的联系,所以

Button b,ba,br,bt1,bt2;//有些东西很业余!!嘻嘻

Panel p1,p2,p3;

TextField t;//用来显示一些随机信息,方法是下面的guli().

Label l;

int d[][]={//用来和界面的按钮建立映射关系

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0}

};

public static void main(String[] args)

{

lianliankan t=new lianliankan();

t.suiji();

t.go();

}

public void actionPerformed(ActionEvent e)//再来一次按钮的响应事件。

{

int d[][]={

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0}

};

this.d=d;

suiji();

f.setVisible(false);

f1.setVisible(false);

s="no";

go();

}

public void go()//初始化界面

{

l=new Label("亲爱的玩家,");

f=new Frame("连连看");

t=new TextField();

p2=new Panel();

p1=new Panel();

p3=new Panel();

bc=new Button("退出");

br=new Button("重列");

b=new Button();

b1=new Button(String.valueOf(d[1][1]));

b2=new Button(String.valueOf(d[1][2]));

b3=new Button(String.valueOf(d[1][3]));

b4=new Button(String.valueOf(d[1][4]));

b5=new Button(String.valueOf(d[1][5]));

b6=new Button(String.valueOf(d[2][1]));

b7=new Button(String.valueOf(d[2][2]));

b8=new Button(String.valueOf(d[2][3]));

b9=new Button(String.valueOf(d[2][4]));

b10=new Button(String.valueOf(d[2][5]));

b11=new Button(String.valueOf(d[3][1]));

b12=new Button(String.valueOf(d[3][2]));

b13=new Button(String.valueOf(d[3][3]));

b14=new Button(String.valueOf(d[3][4]));

b15=new Button(String.valueOf(d[3][5]));

b16=new Button(String.valueOf(d[4][1]));

b17=new Button(String.valueOf(d[4][2]));

b18=new Button(String.valueOf(d[4][3]));

b19=new Button(String.valueOf(d[4][4]));

b20=new Button(String.valueOf(d[4][5]));

b21=new Button(String.valueOf(d[5][1]));

b22=new Button(String.valueOf(d[5][2]));

b23=new Button(String.valueOf(d[5][3]));

b24=new Button(String.valueOf(d[5][4]));

b25=new Button(String.valueOf(d[5][5]));

b26=new Button(String.valueOf(d[6][1]));

b27=new Button(String.valueOf(d[6][2]));

b28=new Button(String.valueOf(d[6][3]));

b29=new Button(String.valueOf(d[6][4]));

b30=new Button(String.valueOf(d[6][5]));

p3.setLayout(null);

p1.setSize(250,300);

p2.setSize(100,40);

p3.setSize(300,30);

t.setSize(60,30);

l.setSize(70,30);

p1.setLayout(new GridLayout(6,5));

p1.setBackground(Color.pink);

p1.setLocation(100,100);

p2.setLocation(0,400);

p3.setLocation(50,50);

t.setLocation(230,2);

l.setLocation(150,2);

bc.setLocation(0,40);

br.setLocation(0,100);

f.add(p1);

f.add(p2);

f.add(p3);

p3.add(l);

p3.add(t);

p2.add(bc);

p2.add(br);

p1.add(b1);

p1.add(b2);

p1.add(b3);

p1.add(b4);

p1.add(b5);

p1.add(b6);

p1.add(b7);

p1.add(b8);

p1.add(b9);

p1.add(b10);

p1.add(b11);

p1.add(b12);

p1.add(b13);

p1.add(b14);

p1.add(b15);

p1.add(b16);

p1.add(b17);

p1.add(b18);

p1.add(b19);

p1.add(b20);

p1.add(b21);

p1.add(b22);

p1.add(b23);

p1.add(b24);

p1.add(b25);

p1.add(b26);

p1.add(b27);

p1.add(b28);

p1.add(b29);

p1.add(b30);

f.pack();

f.setBounds(280,100,500,450);

f.setResizable(false);

f.setVisible(true);

bc.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

ex();

}

});

br.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

chonglie();

}

});

b1.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(1,1,b1);

}

});

b2.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(1,2,b2);

}

});

b3.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(1,3,b3);

}

});

b4.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(1,4,b4);

}

});

b5.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(1,5,b5);

}

});

b6.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(2,1,b6);

}

});

b7.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(2,2,b7);

}

});

b8.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(2,3,b8);

}

});

b9.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(2,4,b9);

}

});

b10.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(2,5,b10);

}

});

b11.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(3,1,b11);

}

});

b12.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(3,2,b12);

}

});

b13.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(3,3,b13);

}

});

b14.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(3,4,b14);

}

});

b15.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(3,5,b15);

}

});

b16.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(4,1,b16);

}

});

b17.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(4,2,b17);

}

});

b18.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(4,3,b18);

}

});

b19.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(4,4,b19);

}

});

b20.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(4,5,b20);

}

});

b21.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(5,1,b21);

}

});

b22.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(5,2,b22);

}

});

b23.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(5,3,b23);

}

});

b24.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(5,4,b24);

}

});

b25.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(5,5,b25);

}

});

b26.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(6,1,b26);

}

});

b27.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(6,2,b27);

}

});

b28.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(6,3,b28);

}

});

b29.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(6,4,b29);

}

});

b30.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

wei(6,5,b30);

}

});

}

public void ex()//退出界面,可用diolog来实现有模式的类型,更加符合

{

f1=new Frame("游戏作业");

f1.setLayout(new GridLayout(1,1));

bt1=new Button("确定退出");

bt2=new Button("再来一局");

f1.add(bt1);

f1.add(bt2);

f1.pack();

f1.setBounds(400,250,90,60);

f1.setResizable(false);

f1.show();

f1.setVisible(true);

bt1.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e)

{

System.exit(0);

}

});

bt2.addActionListener(this);

}

public void suiji()//产生随机数,来填充游戏界面对应的数组的各个位置

{

int m,n,k=0,k1,k2,k3;

for(m=1;m<=15;m++)

{

k1=(int)(Math.random()*25+1);

for(n=1;n<=2;n++)

{

k2=(int)(Math.random()*6+1);

k3=(int)(Math.random()*5+1);

while(d[k2][k3]!=0&& k!=30)

{

k2=(int)(Math.random()*6+1);

k3=(int)(Math.random()*5+1);

}

this.d[k2][k3]=k1;

k++;

}

}

}

public void guli()//随机信息

{

int l=0;

t.setText("");

l=(int)(Math.random()*10);

System.out.println(l);

switch(l)

{

case 1:

t.setText("好!加油!");

break;

case 3:

t.setText("你真棒!");

break;

case 5:

t.setText("加快速度!");

break;

case 6:

t.setText("不错啊!");

break;

case 8:

t.setText("加油吧!");

break;

case 9:

t.setText("够聪明!");

break;

default:

break;

}

}

public void chonglie()//重列方法

{

int save[],i,j,n=0,k2,k3,k;

int d[][]={

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0},

{0,0,0,0,0,0,0}

};

save=new int[30];

for(n=0;n<30;n++)

save[n]=0;//定义一个数组来保存当前的每个按钮位置上的信息

n=0;

for(i=0;i<=6;i++)

for(j=0;j<=5;j++)

{

if(this.d[i][j]!=0)

{

save[n]=this.d[i][j];

n++;

}

}

n=n-1;

this.d=d;

while(n>=0)//产生随机位置,放置按钮

{

k2=(int)(Math.random()*6+1);

k3=(int)(Math.random()*5+1);

while(d[k2][k3]!=0)

{

k2=(int)(Math.random()*6+1);

k3=(int)(Math.random()*5+1);

}

this.d[k2][k3]=save[n];

n--;

}

f.setVisible(false);

s="no";//这里一定要将按钮点击信息归为初始

go();

ling();

}

public void ling()//将数组中为零的成员对应的按钮消去

{//用按钮类型的数组实现会简化得多,

if(d[1][1]==0)

b1.setVisible(false);

if(d[1][2]==0)

b2.setVisible(false);

if(d[1][3]==0)

b3.setVisible(false);

if(d[1][4]==0)

b4.setVisible(false);

if(d[1][5]==0)

b5.setVisible(false);

if(d[2][1]==0)

b6.setVisible(false);

if(d[2][2]==0)

b7.setVisible(false);

if(d[2][3]==0)

b8.setVisible(false);

if(d[2][4]==0)

b9.setVisible(false);

if(d[2][5]==0)

b10.setVisible(false);

if(d[3][1]==0)

b11.setVisible(false);

if(d[3][2]==0)

b12.setVisible(false);

if(d[3][3]==0)

b13.setVisible(false);

if(d[3][4]==0)

b14.setVisible(false);

if(d[3][5]==0)

b15.setVisible(false);

if(d[4][1]==0)

b16.setVisible(false);

if(d[4][2]==0)

b17.setVisible(false);

if(d[4][3]==0)

b18.setVisible(false);

if(d[4][4]==0)

b19.setVisible(false);

if(d[4][5]==0)

b20.setVisible(false);

if(d[5][1]==0)

b21.setVisible(false);

if(d[5][2]==0)

b22.setVisible(false);

if(d[5][3]==0)

b23.setVisible(false);

if(d[5][4]==0)

b24.setVisible(false);

if(d[5][5]==0)

b25.setVisible(false);

if(d[6][1]==0)

b26.setVisible(false);

if(d[6][2]==0)

b27.setVisible(false);

if(d[6][3]==0)

b28.setVisible(false);

if(d[6][4]==0)

b29.setVisible(false);

if(d[6][5]==0)

b30.setVisible(false);

}

public void wei(int w1,int w2,Button bz)//判断并纪录每次点击按钮的信息

{//当两次的按钮相同才能消去

if((s.trim()).equals("no"))

{

s=b1.getLabel();

x0=w1;

y0=w2;

n1=d[x0][y0];

b=bz;

x=w1;

y=w2;

n2=d[x][y];

ba=bz;

}

else

{

x0=x;

y0=y;

n1=d[x0][y0];

b=ba;

x=w1;

y=w2;

n2=d[x][y];

ba=bz;

if(n1==n2&& ba!=b)

{

xiao();

}

}

}

public void xiao()//这里是整个游戏最重要的部分,就是判断两个按钮在信息

{//相同的情况下能不能消去。仔细分析,不一条条注释

int i=0, j=0,n=0,k=0;

if((x0==x&&(y0==y+1||y0==y-1))||((x0==x+1||x0==x-1)&&(y0==y)))//相邻的情况

{

ba.setVisible(false);

b.setVisible(false);

guli();

s="no";

d[x0][y0]=0;

d[x][y]=0;

}

else

{

for(j=0;j<7;j++)//两个按钮按行分析,看能否消去

{

if(d[x0][j]==0)

{

if(y>j)

{

for(i=y-1;i>=j;i--)

{

if(d[x][i]!=0)

{

k=0;

break;

}

else

{

k=1;

}

}

if(k==1)

{

if(y0>j)

{

for(i=y0-1;i>=j;i--)

{

if(d[x0][i]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

if(y0<j)

{

for(i=y0+1;i<=j;i++)

{

if(d[x0][i]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

}

}

if(y<j)

{

for(i=y+1;i<=j;i++)

{

if(d[x][i]!=0)

{

k=0;

break;

}

else

{

k=1;

}

}

if(k==1)

{

if(y0>j)

{

for(i=y0-1;i>=j;i--)

{

if(d[x0][i]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

if(y0<j)

{

for(i=y0+1;i<=j;i++)

{

if(d[x0][i]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

}

}

if(y==j)

{

if(y0>j)

{

for(i=y0-1;i>=j;i--)

{

if(d[x0][i]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

if(y0<j)

{

for(i=y0+1;i<=j;i++)

{

if(d[x0][i]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

}

}

if(k==2)

{ if(x0==x)

{

b.setVisible(false);

ba.setVisible(false);

guli();

s="no";

k=0;

d[x0][y0]=0;

d[x][y]=0;

}

if(x0<x)

{

for(n=x0;n<=x-1;n++)

{

if(d[n][j]!=0)

{

k=0;

break;

}

if(d[n][j]==0&& n==x-1)

{

b.setVisible(false);

ba.setVisible(false);

guli();

s="no";

k=0;

d[x0][y0]=0;

d[x][y]=0;

}

}

}

if(x0>x)

{

for(n=x0;n>=x+1;n--)

{

if(d[n][j]!=0)

{

k=0;

break;

}

if(d[n][j]==0&& n==x+1)

{

b.setVisible(false);

ba.setVisible(false);

guli();

s="no";

k=0;

d[x0][y0]=0;

d[x][y]=0;

}

}

}

}

}

for(i=0;i<8;i++)//按列分析,看能不能消去

{

if(d[i][y0]==0)

{

if(x>i)

{

for(j=x-1;j>=i;j--)

{

if(d[j][y]!=0)

{

k=0;

break;

}

else

{

k=1;

}

}

if(k==1)

{

if(x0>i)

{

for(j=x0-1;j>=i;j--)

{

if(d[j][y0]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

if(x0<i)

{

for(j=x0+1;j<=i;j++)

{

if(d[j][y0]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

}

}

if(x<i)

{

for(j=x+1;j<=i;j++)

{

if(d[j][y]!=0)

{

k=0;

break;

}

else

{

k=1;

}

}

if(k==1)

{

if(x0>i)

{

for(j=x0-1;j>=i;j--)

{

if(d[j][y0]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

if(x0<i)

{

for(j=x0+1;j<=i;j++)

{

if(d[j][y0]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

}

}

if(x==i)

{

if(x0>i)

{

for(j=x0-1;j>=i;j--)

{

if(d[j][y0]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

if(x0<i)

{

for(j=x0+1;j<=i;j++)

{

if(d[j][y0]!=0)

{

k=0;

break;

}

else

{

k=2;

}

}

}

}

}

if(k==2)

{

if(y0==y)

{

b.setVisible(false);

ba.setVisible(false);

guli();

s="no";

k=0;

d[x0][y0]=0;

d[x][y]=0;

}

if(y0<y)

{

for(n=y0;n<=y-1;n++)

{

if(d[i][n]!=0)

{

k=0;

break;

}

if(d[i][n]==0&& n==y-1)

{

b.setVisible(false);

ba.setVisible(false);

guli();

s="no";

k=0;

d[x0][y0]=0;

d[x][y]=0;

}

}

}

if(y0>y)

{

for(n=y0;n>=y+1;n--)

{

if(d[i][n]!=0)

{

k=0;

break;

}

if(d[i][n]==0&& n==y+1)

{

b.setVisible(false);

ba.setVisible(false);

guli();

s="no";

k=0;

d[x0][y0]=0;

d[x][y]=0;

}

}

}

}

}

}

}

}

用JAVA设计游戏:贪吃蛇游戏

用MVC方式实现的贪吃蛇游戏,共有4个类。运行GreedSnake运行即可。主要是观察者模式的使用,我已经添加了很多注释了。

1、

/*

*程序名称:贪食蛇

*原作者:BigF

*修改者:algo

*说明:我以前也用C写过这个程序,现在看到BigF用Java写的这个,发现虽然作者自称是Java的初学者,

*但是明显编写程序的素养不错,程序结构写得很清晰,有些细微得地方也写得很简洁,一时兴起之

*下,我认真解读了这个程序,发现数据和表现分开得很好,而我近日正在学习MVC设计模式,

*因此尝试把程序得结构改了一下,用MVC模式来实现,对源程序得改动不多。

*我同时也为程序增加了一些自己理解得注释,希望对大家阅读有帮助。

*/

package mvcTest;

/**

*@author WangYu

*@version 1.0

* Description:

*</pre>

* Create on:Date:2005-6-13 Time:15:57:16

* LastModified:

* History:

*/

public class GreedSnake{

public static void main(String[] args){

SnakeModel model= new SnakeModel(20,30);

SnakeControl control= new SnakeControl(model);

SnakeView view= new SnakeView(model,control);

//添加一个观察者,让view成为model的观察者

model.addObserver(view);

(new Thread(model)).start();

}

}

-------------------------------------------------------------

2、

package mvcTest;

//SnakeControl.java

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

/**

* MVC中的Controler,负责接收用户的操作,并把用户操作通知Model

*/

public class SnakeControl implements KeyListener{

SnakeModel model;

public SnakeControl(SnakeModel model){

this.model= model;

}

public void keyPressed(KeyEvent e){

int keyCode= e.getKeyCode();

if(model.running){//运行状态下,处理的按键

switch(keyCode){

case KeyEvent.VK_UP:

model.changeDirection(SnakeModel.UP);

break;

case KeyEvent.VK_DOWN:

model.changeDirection(SnakeModel.DOWN);

break;

case KeyEvent.VK_LEFT:

model.changeDirection(SnakeModel.LEFT);

break;

case KeyEvent.VK_RIGHT:

model.changeDirection(SnakeModel.RIGHT);

break;

case KeyEvent.VK_ADD:

case KeyEvent.VK_PAGE_UP:

model.speedUp();

break;

case KeyEvent.VK_SUBTRACT:

case KeyEvent.VK_PAGE_DOWN:

model.speedDown();

break;

case KeyEvent.VK_SPACE:

case KeyEvent.VK_P:

model.changePauseState();

break;

default:

}

}

//任何情况下处理的按键,按键导致重新启动游戏

if(keyCode== KeyEvent.VK_R||

keyCode== KeyEvent.VK_S||

keyCode== KeyEvent.VK_ENTER){

model.reset();

}

}

public void keyReleased(KeyEvent e){

}

public void keyTyped(KeyEvent e){

}

}

-------------------------------------------------------------

3、

/*

*

*/

package mvcTest;

/**

*游戏的Model类,负责所有游戏相关数据及运行

*@author WangYu

*@version 1.0

* Description:

*</pre>

* Create on:Date:2005-6-13 Time:15:58:33

* LastModified:

* History:

*/

//SnakeModel.java

import javax.swing.*;

import java.util.Arrays;

import java.util.LinkedList;

import java.util.Observable;

import java.util.Random;

/**

*游戏的Model类,负责所有游戏相关数据及运行

*/

class SnakeModel extends Observable implements Runnable{

boolean[][] matrix;//指示位置上有没蛇体或食物

LinkedList nodeArray= new LinkedList();//蛇体

Node food;

int maxX;

int maxY;

int direction= 2;//蛇运行的方向

boolean running= false;//运行状态

int timeInterval= 200;//时间间隔,毫秒

double speedChangeRate= 0.75;//每次得速度变化率

boolean paused= false;//暂停标志

int score= 0;//得分

int countMove= 0;//吃到食物前移动的次数

// UP and DOWN should be even

// RIGHT and LEFT should be odd

public static final int UP= 2;

public static final int DOWN= 4;

public static final int LEFT= 1;

public static final int RIGHT= 3;

public SnakeModel( int maxX, int maxY){

this.maxX= maxX;

this.maxY= maxY;

reset();

}

public void reset(){

direction= SnakeModel.UP;//蛇运行的方向

timeInterval= 200;//时间间隔,毫秒

paused= false;//暂停标志

score= 0;//得分

countMove= 0;//吃到食物前移动的次数

// initial matirx,全部清0

matrix= new boolean[maxX][];

for(int i= 0; i< maxX;++i){

matrix[i]= new boolean[maxY];

Arrays.fill(matrix[i], false);

}

// initial the snake

//初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半

int initArrayLength= maxX> 20? 10: maxX/ 2;

nodeArray.clear();

for(int i= 0; i< initArrayLength;++i){

int x= maxX/ 2+ i;//maxX被初始化为20

int y= maxY/ 2;//maxY被初始化为30

//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]

//默认的运行方向向上,所以游戏一开始nodeArray就变为:

// [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]

nodeArray.addLast(new Node(x, y));

matrix[x][y]= true;

}

//创建食物

food= createFood();

matrix[food.x][food.y]= true;

}

public void changeDirection(int newDirection){

//改变的方向不能与原来方向同向或反向

if(direction% 2!= newDirection% 2){

direction= newDirection;

}

}

/**

*运行一次

*@return

*/

public boolean moveOn(){

Node n=(Node) nodeArray.getFirst();

int x= n.x;

int y= n.y;

//根据方向增减坐标值

switch(direction){

case UP:

y--;

break;

case DOWN:

y++;

break;

case LEFT:

x--;

break;

case RIGHT:

x++;

break;

}

//如果新坐标落在有效范围内,则进行处理

if((0<= x&& x< maxX)&&(0<= y&& y< maxY)){

if(matrix[x][y]){//如果新坐标的点上有东西(蛇体或者食物)

if(x== food.x&& y== food.y){//吃到食物,成功

nodeArray.addFirst(food);//从蛇头赠长

//分数规则,与移动改变方向的次数和速度两个元素有关

int scoreGet=(10000- 200* countMove)/ timeInterval;

score+= scoreGet> 0? scoreGet: 10;

countMove= 0;

food= createFood();//创建新的食物

matrix[food.x][food.y]= true;//设置食物所在位置

return true;

} else//吃到蛇体自身,失败

return false;

} else{//如果新坐标的点上没有东西(蛇体),移动蛇体

nodeArray.addFirst(new Node(x, y));

matrix[x][y]= true;

n=(Node) nodeArray.removeLast();

matrix[n.x][n.y]= false;

countMove++;

return true;

}

}

return false;//触到边线,失败

}

public void run(){

running= true;

while(running){

try{

Thread.sleep(timeInterval);

} catch(Exception e){

break;

}

if(!paused){

if(moveOn()){

setChanged();// Model通知View数据已经更新

notifyObservers();

} else{

JOptionPane.showMessageDialog(null,

"you failed",

"Game Over",

JOptionPane.INFORMATION_MESSAGE);

break;

}

}

}

running= false;

}

private Node createFood(){

int x= 0;

int y= 0;

//随机获取一个有效区域内的与蛇体和食物不重叠的位置

do{

Random r= new Random();

x= r.nextInt(maxX);

y= r.nextInt(maxY);

} while(matrix[x][y]);

return new Node(x, y);

}

public void speedUp(){

timeInterval*= speedChangeRate;

}

public void speedDown(){

timeInterval/= speedChangeRate;

}

public void changePauseState(){

paused=!paused;

}

public String toString(){

String result="";

for(int i= 0; i< nodeArray.size();++i){

Node n=(Node) nodeArray.get(i);

result+="["+ n.x+","+ n.y+"]";

}

return result;

}

}

class Node{

int x;

int y;

Node(int x, int y){

this.x= x;

this.y= y;

}

}

------------------------------------------------------------

4、

package mvcTest;

//SnakeView.java

import javax.swing.*;

import java.awt.*;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.Observable;

import java.util.Observer;

/**

* MVC模式中得Viewer,只负责对数据的显示,而不用理会游戏的控制逻辑

*/

public class SnakeView implements Observer{

SnakeControl control= null;

SnakeModel model= null;

JFrame mainFrame;

Canvas paintCanvas;

JLabel labelScore;

public static final int canvasWidth= 200;

public static final int canvasHeight= 300;

public static final int nodeWidth= 10;

public static final int nodeHeight= 10;

public SnakeView(SnakeModel model, SnakeControl control){

this.model= model;

this.control= control;

mainFrame= new JFrame("GreedSnake");

Container cp= mainFrame.getContentPane();

//创建顶部的分数显示

labelScore= new JLabel("Score:");

cp.add(labelScore, BorderLayout.NORTH);

//创建中间的游戏显示区域

paintCanvas= new Canvas();

paintCanvas.setSize(canvasWidth+ 1, canvasHeight+ 1);

paintCanvas.addKeyListener(control);

cp.add(paintCanvas, BorderLayout.CENTER);

//创建底下的帮助栏

JPanel panelButtom= new JPanel();

panelButtom.setLayout(new BorderLayout());

JLabel labelHelp;

labelHelp= new JLabel("PageUp, PageDown for speed;", JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.NORTH);

labelHelp= new JLabel("ENTER or R or S for start;", JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.CENTER);

labelHelp= new JLabel("SPACE or P for pause", JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.SOUTH);

cp.add(panelButtom, BorderLayout.SOUTH);

mainFrame.addKeyListener(control);

mainFrame.pack();

mainFrame.setResizable(false);

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

mainFrame.setVisible(true);

}

void repaint(){

Graphics g= paintCanvas.getGraphics();

//draw background

g.setColor(Color.WHITE);

g.fillRect(0, 0, canvasWidth, canvasHeight);

// draw the snake

g.setColor(Color.BLACK);

LinkedList na= model.nodeArray;

Iterator it= na.iterator();

while(it.hasNext()){

Node n=(Node) it.next();

drawNode(g, n);

}

// draw the food

g.setColor(Color.RED);

Node n= model.food;

drawNode(g, n);

updateScore();

}

private void drawNode(Graphics g, Node n){

g.fillRect(n.x* nodeWidth,

n.y* nodeHeight,

nodeWidth- 1,

nodeHeight- 1);

}

public void updateScore(){

String s="Score:"+ model.score;

labelScore.setText(s);

}

public void update(Observable o, Object arg){

repaint();

}

}

-------------------------------------------------------------

好了,文章到这里就结束啦,如果本次分享的java小游戏贪吃蛇和java怎么让贪吃蛇游戏暂停问题对您有所帮助,还望关注下本站哦!

少儿编程主要是学啥 儿童编程学什么内容《java从入门到精通》 Java入门到精通七版pdf