java小游戏贪吃蛇?java怎么让贪吃蛇游戏暂停
大家好,java小游戏贪吃蛇相信很多的网友都不是很明白,包括java怎么让贪吃蛇游戏暂停也是一样,不过没有关系,接下来就来为大家分享关于java小游戏贪吃蛇和java怎么让贪吃蛇游戏暂停的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
如何用java实现一个贪吃蛇小游戏
1、设计游戏,首先就要设计界面。首先看一下我设计的一个界面。界面分为左边的游戏区与右边的控制区。游戏区包含“得分信息”和贪吃蛇的游戏区,右边控制区有“开始”“暂停”“停止”按钮,等级选择单选框以及游戏排行榜。
2、所以我们需要定义swing组件,并在类初始化时初始化这些组件,添加组件。因为后面设计游戏的时候,我们要确切知道游戏区的大小,所以这里设置游戏区固定大小值。本来想用布局来更好的管理,但作者对布局也掌握不够,所以就先设置固定大小吧。
3、定义我们的游戏。贪吃蛇游戏其实就是包含很多细小网格,然后蛇在网格中移动。蛇由一连串的网格组成,为了视觉效果,蛇身用蓝色标记,食物用红色标记,背景白色。如第一张图片所示。所以,我们需要定义二维数组,保存网格信息,保存蛇身和食物的位置信息等。初始化时,还需要添加键盘事件控制上下左右移动。
4、食物的位置信息是二维的,所以我简单定义了一个类用来保存二维信息。
5、接着就是实现游戏的功能了。开始,暂停,停止按钮添加事件控制游戏开始。等级按钮定义游戏难度等。
6、开始游戏后,我们定义一个定时器。蛇身按照指定的方向移动,方向是通过初始化时添加的键盘事件,键盘的上下左右按钮来控制。蛇身是连续的位置信息,保存到队列中,所以蛇身的移动就是队首增加一个位置,队尾减少位置,然后重新绘画游戏区就可以了。
谁会用java编写“贪吃蛇”小游戏
汗要程序怎么这么点分啊哭了
呵呵不过你还是挺幸运给你吧
连连看的代码(基本算法)加了部分注释
import java.awt.*;
import java.awt.event.*;
public class lianliankan implements ActionListener
{
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怎么让贪吃蛇游戏暂停问题对您有所帮助,还望关注下本站哦!