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();
}
}
總結
以上是生活随笔為你收集整理的JAVA 实现贪吃蛇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA当前文件内容替换
- 下一篇: 运行Apache Mahout的Tast