先来个效果图,回头看看,自己都吓一跳,好...呃
程序实现就是 在一个线程里不断的让蛇爬行,同时监听鼠标和键盘的动作,根据动作做响应的转向,每次的转向判断下是否吃到豆豆,是否迟到自己了 ,是否碰壁了。如果吃到了豆豆,加一个长度,移动位置。没迟到的就继续爬呀爬。如果迟到自己了,game over!
上代码吧!
package 贪吃蛇;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JFrame;
import Util.SJQ;
import Util.TP;
public class Game
{
//f
//窗口
ChuangKou ck;
//定时器
DingShiQi ds1;
//DingShiQi ds2;
//蛇
She she=new She();
//豆豆
Dou dou=new Dou(she);
//c
Game()
{
ck = new ChuangKou();
ds1 = new DingShiQi(200);
//ds2 = new DingShiQi(5000);
ck.setSize(600+2*5, 600+2*5+25);
ck.setVisible(true);
//点击关闭退出
ck.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//she=new She();
//dou=new Dou(she);
}
//m
//窗口
class ChuangKou extends JFrame
{
//f
//键盘事件监听
JianPanQi jp;
//鼠标事件监听
ShuBiaoQi sb;
//话蛇和豆豆
HuaBu hb;
//c
ChuangKou()
{
jp = new JianPanQi();
sb = new ShuBiaoQi();
hb = new HuaBu();
//添加监听
addKeyListener(jp);
addMouseListener(sb);
add(hb);
//重画
repaint();
}
//键盘事件监听
class JianPanQi extends KeyAdapter
{
@Override
public void keyPressed(KeyEvent e)
{
switch (e.getKeyCode())
{
case KeyEvent.VK_LEFT:
//可以用枚举代替 当年都没意识,嘿嘿
she.zhuan(3);
break;
case KeyEvent.VK_UP:
she.zhuan(2);
break;
case KeyEvent.VK_RIGHT:
she.zhuan(1);
break;
case KeyEvent.VK_DOWN:
she.zhuan(4);
break;
}
repaint();
}
}
//鼠标监听,这个貌似没用么
class ShuBiaoQi extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
int mx = e.getX();
int my = e.getY();
if (e.getButton() == MouseEvent.BUTTON1)
{
System.out.println("left clicked");
}
else if (e.getButton() == MouseEvent.BUTTON3)
{
System.out.println("right clicked");
}
repaint();
}
}
//在Graphic上显示蛇和豆豆
class HuaBu extends JComponent
{
public void paint(Graphics g)
{
she.xianShi(g, this);
dou.xianShi(g, this);
}
}
}
//记得当时是用的死循环来做的,后来老师给我一顿夸啊 o(∩_∩)o 哈哈
class DingShiQi implements Runnable
{
//线程
Thread ds;
//间隔时间
long jg;
//c
DingShiQi(long jg)
{
this.jg = jg;
ds = new Thread(this);
ds.start();
}
public void run()
{
while (true)
{
try
{
ds.sleep(jg);
she.pa();
//出界 || 咬到自己
if (she.isChuJie()||she.isZiYao())
{
System.exit(0);
}
//终于吃到豆豆了
if (she.isChiDou(dou) )
{
she.chang++;//加长
she.pa();//继续爬
dou=new Dou(she);//在生成一个豆豆
//ck.repaint();
}
}
catch (InterruptedException e)
{
//异常处理什么滴都么啊 嘿嘿
e.printStackTrace();
}
//重画啊啊
ck.repaint();
}
}
}
public static void main(String[] args)
{
new Game();
}
}
/**
* 蛇
* @author xuhy
*
*/
class She
{
//f
//行数组
int[] hs;
//列数组
int[] ls;
//方向
int fang;
//长度
int chang;
Image t1;
Image t2;
//c
//构造蛇
She()
{
fang=2;
chang=6;
hs=new int[20];
ls=new int[20];
for (int i=0;i<chang ;i++ )//循环:知次
{
hs[i]=10+i;
ls[i]=10;
}
t2=TP.huoDe("图\\贪吃蛇图片\\身.png");
}
//m
//显示图片
void xianShi(Graphics g,Game.ChuangKou.HuaBu hb)
{
t1=TP.huoDe("图\\贪吃蛇图片\\头"+fang+".png");
g.drawImage(t1, 30*ls[0], 30*hs[0], hb);
for (int i=1;i<chang ;i++ )//循环:知次
{
//g2d.drawRect(30*ls[i], 30*hs[i],30 ,30 );//画矩形 参数:左,上,宽,高
g.drawImage(t2, 30*ls[i], 30*hs[i], hb);
}
}
/**
* 爬行
*/
void pa()
{
for (int i=chang-1;i>=1 ;i-- )//循环:知次
{
hs[i]=hs[i-1];
ls[i]=ls[i-1];
}
switch (fang)///进行选择的依据
{
case 1://当 :
ls[0]++;
break;
case 2://当 :
hs[0]--;
break;
case 3://当 :
ls[0]--;
break;
case 4://当 :
hs[0]++;
break;
}
}
/**
* 是否出界
* @return
*/
boolean isChuJie()
{
if (hs[0]==-1||hs[0]==20||ls[0]==-1||ls[0]==20)//如果
{
return true;
}
else//否则
{
return false;
}
}
/**
* 是否咬到了自己
* @return
*/
boolean isZiYao()
{
for (int i=1; i<chang;i++ )//循环:知次
{
if (hs[0]==hs[i]&&ls[0]==ls[i])//如果
{
return true;
}
}
return false;
}
/**
* 是否吃到了豆豆
* @param dou
* @return
*/
boolean isChiDou(Dou dou)
{
if (hs[0]==dou.h&&ls[0]==dou.l)//如果
{
return true;
}
else//否则
{
return false;
}
}
/**
* 转向
* @param fang
*/
void zhuan(int fang)
{
if (this.fang%2!=fang%2)//如果
{
this.fang=fang;
}
}
}
class Dou
{
//f
int h;
int l;
Image tu;
//c
Dou(She she)
{
boolean zi=false;
do//豆造在蛇身上
{
tu=TP.huoDe("图\\贪吃蛇图片\\豆.png");
h=SJQ.zao(0, 19);
l=SJQ.zao(0, 19);
for (int i=0;i<she.chang ;i++ )//循环:知次
{
if (h==she.hs[i]&&l==she.ls[i])//如果
{
zi=false;
}
}
}
while (zi==true);//每当
}
//m
void xianShi(Graphics g,Game.ChuangKou.HuaBu hb)
{
//g2d.fillRect(l*30, h*30,30 ,30 );//画矩形 参数:左,上,宽,高
g.drawImage(tu, l*30, h*30, hb);
}
}
贪吃蛇这个经典的东西,对于当年刚上道的俺来说还是相当费劲的。这是俺第一个成功的Program。现在回想,当年还真是不知有多兴奋。玩的那个不亦乐乎,o(∩_∩)o 拿出来分享,虽然不如意的地方太多,全当做个纪念吧!。写的不好不要拍我砖啊!,当然更欢迎您留言,大家可以多交流么。。嘿嘿。。