本人为初学者:
背景可以换成你自己的图片。(有注释)
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();
}
}