JAVA 实现贪吃蛇

本人为初学者:

         背景可以换成你自己的图片。(有注释)

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Game extends JFrame{
Container c=this.getContentPane();
private static final long serialVersionUID = 1L;
//TODO:变量声明
gameKeyListener keyListener;
//蛇的位置
int[] snakeColum=new int[400];//列
int[] snakeRow=new int[400];//行
//食物的位置
int foodcolum=(int)(Math.random()*20);//列
int foodRow=(int)(Math.random()*20);//行


//蛇当前的长度
int snakeLength=3;
//游戏运行的线程
MyThread m=new MyThread(200);

//方向
/*

*上0 下1 左2 右3 
**/
int drirection=0;

public Game() {
//TODO:初始化
snakeColum[0]=10;
snakeRow[0]=10;
snakeColum[1]=11;
snakeRow[1]=10;
snakeColum[2]=12;
snakeRow[2]=10;
init();

//添加键盘监听事件
keyListener= new gameKeyListener();
this.addKeyListener(keyListener);

//设置窗体为绘图对象面板
repaint();
c.add(new DrawPanel());
//setContentPane(new DrawPanel());
//窗体可视化
this.setVisible(true);
}


//初始化窗体
private void init() {
// 窗口的特征
this.setTitle("贪吃蛇");
this.setSize(620, 650);// 设置窗口大小==设置蛇活动的范围
// this.pack();// 自动适应窗口大小
this.setResizable(false);// 禁止放大按钮
this.setLocationRelativeTo(null);// 窗体居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//画蛇图
class DrawPanel extends JPanel{

private static final long serialVersionUID = 1L;


/* (non-Javadoc)
* @see javax.swing.JComponent#paint(java.awt.Graphics)
*/
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
/*//画背景图
Image image=new ImageIcon(this.getClass().getResource("bg1.jpg")).getImage();
g.drawImage(image, 0, 0, null);*/

/*
* 哪个先画,重复时候谁就被覆盖先
* 运动的时候,先画蛇身,移动时候就不会把蛇头覆盖了
*/

        //画蛇身
        for(int i=1;i<snakeLength;i++) {
        g.setColor(Color.green);
        g.fillRect((snakeColum[i])*30,(snakeRow[i])*30, 30, 30);//画实心矩形,位置在(0,0),长为30,宽为30
        }
      //画蛇头
g.setColor(Color.BLUE);
        g.fillRect(snakeColum[0]*30,snakeRow[0]*30, 30, 30);//画实心矩形,位置在(0,0),长为30,宽为30
        //画食物
        g.setColor(Color.red);
        g.fillOval(foodcolum*30,foodRow*30, 30, 30);
}
}
//蛇运动的线程
class MyThread implements Runnable{
//游戏运行的速度
        int time;
        Thread t=null;
public MyThread(int time) {
this.time=time;
t=new Thread(this);
//当条用构造函数时,线程开启。
t.start();
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true) {
Thread.sleep(time);
/*
* 哪个先画,重复时候谁就被覆盖先
* 运动的时候,先画蛇身,移动时候就不会把蛇头覆盖了
*/
//蛇身体动
for(int i=snakeLength-1;i>=1;i--) {
snakeColum[i]=snakeColum[i-1];
snakeRow[i]=snakeRow[i-1];
}
//蛇头动
/*

*上0 下1 左2 右3 
**/
switch(drirection) {
case 0:
snakeRow[0]--;
break;
case 1:
snakeRow[0]++;
break;
case 2:
snakeColum[0]--;
break;
case 3:
snakeColum[0]++;
break;
}
//判断是否吃豆--就是判断蛇头坐标是否和豆的坐标重合
if(snakeColum[0]==foodcolum && snakeRow[0]==foodRow) {
//从新生成食物的位置
foodcolum=(int)(Math.random()*20);//列
foodRow=(int)(Math.random()*20);//行
snakeLength++;
 
//在尾巴生成一节蛇身
snakeColum[snakeLength-1]=snakeColum[snakeLength-2];
snakeRow[snakeLength-1]=snakeRow[snakeLength-2];
}
//判断死亡
//撞墙死
if(snakeRow[0]< 0||snakeRow[0]>19 ||snakeColum[0]<0||snakeColum[0]>19) {
System.exit(-1);
}
//自咬死
//就是判断蛇头的位置是否和蛇身的位置有没有重合的
for(int i=1;i<snakeLength;i++) {
if(snakeRow[0]==snakeRow[i] && snakeColum[0]==snakeColum[i]) {
System.exit(-1);
}
}
repaint();

}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

}
//键盘监听事件
class gameKeyListener implements KeyListener{


/* (non-Javadoc)
* @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
*/
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:// 左
drirection=2;
break;
case KeyEvent.VK_RIGHT:// 右
drirection=3;
break;
case KeyEvent.VK_UP:// 上
drirection=0;
break;
case KeyEvent.VK_DOWN:// 下
drirection=1;
break;
}
repaint();
}


/* (non-Javadoc)
* @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
*/
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}


/* (non-Javadoc)
* @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
*/
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}

}
public static void main(String[] args) {
new Game();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值