Java實現(xiàn)簡單的貪吃蛇游戲
更新時間:2021年07月11日 17:28:48 作者:wuhuizzj
這篇文章主要介紹了Java實現(xiàn)簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Java實現(xiàn)簡單貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
代碼
啟動類
package snake; import javax.swing.*; //游戲的主啟動類 public class StartGame { public static void main(String[] args) { JFrame frame = new JFrame("貪吃蛇"); frame.setBounds(10,10,900,720); frame.setResizable(false); //窗口不可調(diào)整 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //正常游戲界面都應(yīng)該在面板上 frame.add(new GamePanel()); frame.setVisible(true); } }
游戲畫板
package snake; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; //游戲面板 public class GamePanel extends JPanel implements KeyListener, ActionListener { int lenth; //蛇的長度 int [] snakeX = new int[600]; //定義蛇的坐標(biāo)X int [] snakeY = new int[500]; //定義蛇的坐標(biāo)Y String fx ;//定義方向R:右 L:左 U:上 D:下 boolean isStart = false; //游戲是否開始 Timer timer = new Timer(120,this);//定時器 //定義一個食物 int foodx; int foody; Random random = new Random(); //定義死亡判斷 boolean isFail = false;//默認不失敗 //積分系統(tǒng) int score; //構(gòu)造器 public GamePanel(){ init(); //獲取鍵盤的監(jiān)聽事件 this.setFocusable(true); this.addKeyListener(this); timer.start(); } //初始化 public void init(){ lenth = 3; snakeX[0] = 100;snakeY[0] = 100;//頭部坐標(biāo) snakeX[1] = 75;snakeY[1] = 100;//第一個身體坐標(biāo) snakeX[2] = 50;snakeY[2] = 100;//第二個身體坐標(biāo) fx = "R";//蛇頭初始方向 //初始化食物 foodx = 25 + 25 * random.nextInt(34); foody = 75 + 25 * random.nextInt(24); score = 0; } //繪制面板,游戲中的所以東西都使用這個東西來畫 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); //清屏作用 //繪制靜態(tài)的面板 this.setBackground(Color.white); Data.header.paintIcon(this,g,25,11); //放進頭部廣告 g.fillRect(25,75,850,600); //默認游戲界面 //畫一條靜態(tài)的小蛇 if (fx.equals("R")){ Data.right.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("L")){ Data.left.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("U")){ Data.up.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("D")){ Data.down.paintIcon(this,g,snakeX[0],snakeY[0]); } //蛇的身體長度通過length來控制 for (int i = 1;i < lenth;i++){ Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); } //畫積分 g.setColor(Color.white); g.setFont(new Font("微軟雅黑",Font.BOLD,20)); g.drawString("長度"+lenth,700,45); g.drawString("分數(shù)"+score,780,45); //畫食物 Data.food.paintIcon(this,g,foodx,foody); //游戲提示:是否開始 if (isStart == false){ //畫一個文字String來提示開始 g.setColor(Color.white); //定義顏色 g.setFont(new Font("微軟雅黑",Font.BOLD,40)); //設(shè)置字體 g.drawString("按下空格開始游戲",300,300); } //失敗提醒 if (isFail){ //畫一個文字String來提示失敗 g.setColor(Color.RED); //定義顏色 g.setFont(new Font("微軟雅黑",Font.BOLD,40)); //設(shè)置字體 g.drawString("游戲失敗,按下空格重新開始",200,300); } } //接收鍵盤的輸入:監(jiān)聽事件 @Override//鍵盤按下,未釋放 public void keyPressed(KeyEvent e) { //獲取按下鍵盤的信息 int keyCode = e.getKeyCode(); if(keyCode==KeyEvent.VK_SPACE){//如果按下空格鍵 if (isFail){//游戲失敗,重新開始 isFail = false; init();//重新初始化游戲 }else {//暫停游戲 isStart = !isStart; } repaint();//刷新界面,重置 } //鍵盤控制走向 if (keyCode==KeyEvent.VK_LEFT){ fx = "L"; }else if (keyCode==KeyEvent.VK_RIGHT){ fx = "R"; }else if (keyCode==KeyEvent.VK_UP) { fx = "U"; }else if (keyCode==KeyEvent.VK_DOWN) { fx = "D"; } } //定時器,監(jiān)聽時間,幀,執(zhí)行定時操作 @Override public void actionPerformed(ActionEvent e) { //如果游戲處于開始狀態(tài),并且游戲沒有失敗 if (isStart && isFail == false){ //右移 for (int i = lenth-1 ;i > 0;i--){ //身體向前移動 snakeX[i] = snakeX[i-1]; snakeY[i] = snakeY[i-1]; } //通過控制方向讓頭部移動 if (fx.equals("R")){ snakeX[0] = snakeX[0] + 25;//頭部移動 if (snakeX[0]>850){ snakeX[0] = 25; }//右邊界判斷 }else if (fx.equals("L")){ snakeX[0] =snakeX[0] - 25;//頭部移動 if (snakeX[0]<25){ snakeX[0] = 850;}//左邊界判斷 }else if (fx.equals("U")){ snakeY[0] =snakeY[0] - 25;//頭部移動 if (snakeY[0]<75){ snakeY[0] = 650;}//上邊界判斷 }else if (fx.equals("D")){ snakeY[0] =snakeY[0] + 25;//頭部移動 if (snakeY[0]>650){ snakeY[0] = 75;}//下邊界判斷 } //如果食物和蛇頭坐標(biāo)重合 if (snakeX[0]==foodx && snakeY[0]==foody){ lenth ++;//蛇的身體長度加一 score = score + 10; //重新生成食物 foodx = 25 +25 * random.nextInt(34); foody = 75 +25 * random.nextInt(24); } //結(jié)束判斷 for (int i = 1; i<lenth;i++){ if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){ isFail = true; } } repaint();//刷新界面 } timer.start();//讓時間動起來 } @Override//鍵盤按下,彈起 public void keyTyped(KeyEvent e) { } @Override//釋放某個鍵 public void keyReleased(KeyEvent e) { } }
游戲數(shù)據(jù)(存放圖片)
package snake; import javax.swing.*; import java.net.URL; //數(shù)據(jù)中心 public class Data { //相對路徑 tx.jpg 絕對路徑 /相當(dāng)于當(dāng)前的項目 //頭部圖片 URL 定位圖片地址 public static URL headerURL = Data.class.getResource("/statics/header.png"); public static ImageIcon header = new ImageIcon(headerURL); //上下左右移動 public static URL upUrl = Data.class.getResource("/statics/up.png"); public static ImageIcon up = new ImageIcon(upUrl); public static URL downUrl = Data.class.getResource("/statics/down.png"); public static ImageIcon down = new ImageIcon(downUrl); public static URL leftUrl = Data.class.getResource("/statics/left.png"); public static ImageIcon left = new ImageIcon(leftUrl); public static URL rightUrl = Data.class.getResource("/statics/right.png"); public static ImageIcon right = new ImageIcon(rightUrl); //身體 public static URL bodyUrl = Data.class.getResource("/statics/body.png"); public static ImageIcon body = new ImageIcon(bodyUrl); //食物 public static URL foodUrl = Data.class.getResource("/statics/food.png"); public static ImageIcon food = new ImageIcon(foodUrl); }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java鏈接redis_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java鏈接redis,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08SpringAOP中基于注解實現(xiàn)通用日志打印方法詳解
這篇文章主要介紹了SpringAOP中基于注解實現(xiàn)通用日志打印方法詳解,在日常開發(fā)中,項目里日志是必不可少的,一般有業(yè)務(wù)日志,數(shù)據(jù)庫日志,異常日志等,主要用于幫助程序猿后期排查一些生產(chǎn)中的bug,需要的朋友可以參考下2023-12-12淺談Java中SimpleDateFormat 多線程不安全原因
SimpleDateFormat是Java中用于日期時間格式化的一個類,本文主要介紹了淺談Java中SimpleDateFormat 多線程不安全原因,感興趣的可以了解一下2024-01-01springboot 配置DRUID數(shù)據(jù)源的方法實例分析
這篇文章主要介紹了springboot 配置DRUID數(shù)據(jù)源的方法,結(jié)合實例形式分析了springboot 配置阿里DRUID數(shù)據(jù)源的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2019-12-12Java避免死鎖_動力節(jié)點Java學(xué)院整理
在有些情況下死鎖是可以避免的。本文將展示三種用于避免死鎖的技術(shù)。對java避免死鎖的相關(guān)知識感興趣的朋友一起通過本文學(xué)習(xí)吧2017-06-06