JAVA 实现贪吃蛇
本人為初學(xué)者:
? ? ? ? ?背景可以換成你自己的圖片。(有注釋)
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);//行
//蛇當(dāng)前的長(zhǎng)度
int snakeLength=3;
//游戲運(yùn)行的線(xiàn)程
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();
//添加鍵盤(pán)監(jiān)聽(tīng)事件
keyListener= new gameKeyListener();
this.addKeyListener(keyListener);
//設(shè)置窗體為繪圖對(duì)象面板
repaint();
c.add(new DrawPanel());
//setContentPane(new DrawPanel());
//窗體可視化
this.setVisible(true);
}
//初始化窗體
private void init() {
// 窗口的特征
this.setTitle("貪吃蛇");
this.setSize(620, 650);// 設(shè)置窗口大小==設(shè)置蛇活動(dòng)的范圍
// this.pack();// 自動(dòng)適應(yīng)窗口大小
this.setResizable(false);// 禁止放大按鈕
this.setLocationRelativeTo(null);// 窗體居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//畫(huà)蛇圖
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);
/*//畫(huà)背景圖
Image image=new ImageIcon(this.getClass().getResource("bg1.jpg")).getImage();
g.drawImage(image, 0, 0, null);*/
/*
* 哪個(gè)先畫(huà),重復(fù)時(shí)候誰(shuí)就被覆蓋先
* 運(yùn)動(dòng)的時(shí)候,先畫(huà)蛇身,移動(dòng)時(shí)候就不會(huì)把蛇頭覆蓋了
*/
? ? ? ? //畫(huà)蛇身
? ? ? ? for(int i=1;i<snakeLength;i++) {
? ? ? ? g.setColor(Color.green);
? ? ? ? g.fillRect((snakeColum[i])*30,(snakeRow[i])*30, 30, 30);//畫(huà)實(shí)心矩形,位置在(0,0),長(zhǎng)為30,寬為30
? ? ? ? }
? ? ? //畫(huà)蛇頭
g.setColor(Color.BLUE);
? ? ? ? g.fillRect(snakeColum[0]*30,snakeRow[0]*30, 30, 30);//畫(huà)實(shí)心矩形,位置在(0,0),長(zhǎng)為30,寬為30
? ? ? ? //畫(huà)食物
? ? ? ? g.setColor(Color.red);
? ? ? ? g.fillOval(foodcolum*30,foodRow*30, 30, 30);
}
}
//蛇運(yùn)動(dòng)的線(xiàn)程
class MyThread implements Runnable{
//游戲運(yùn)行的速度
? ? ? ? int time;
? ? ? ? Thread t=null;
public MyThread(int time) {
this.time=time;
t=new Thread(this);
//當(dāng)條用構(gòu)造函數(shù)時(shí),線(xiàn)程開(kāi)啟。
t.start();
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true) {
Thread.sleep(time);
/*
* 哪個(gè)先畫(huà),重復(fù)時(shí)候誰(shuí)就被覆蓋先
* 運(yùn)動(dòng)的時(shí)候,先畫(huà)蛇身,移動(dòng)時(shí)候就不會(huì)把蛇頭覆蓋了
*/
//蛇身體動(dòng)
for(int i=snakeLength-1;i>=1;i--) {
snakeColum[i]=snakeColum[i-1];
snakeRow[i]=snakeRow[i-1];
}
//蛇頭動(dòng)
/*
*?
*上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;
}
//判斷是否吃豆--就是判斷蛇頭坐標(biāo)是否和豆的坐標(biāo)重合
if(snakeColum[0]==foodcolum && snakeRow[0]==foodRow) {
//從新生成食物的位置
foodcolum=(int)(Math.random()*20);//列
foodRow=(int)(Math.random()*20);//行
snakeLength++;
?
//在尾巴生成一節(jié)蛇身
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);
}
//自咬死
//就是判斷蛇頭的位置是否和蛇身的位置有沒(méi)有重合的
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();
}
}
}
//鍵盤(pán)監(jiān)聽(tīng)事件
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();
}
}
總結(jié)
以上是生活随笔為你收集整理的JAVA 实现贪吃蛇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IDEA当前文件内容替换
- 下一篇: 运行Apache Mahout的Tast