<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
貪吃蛇大作戰在設計與實驗的過程中需要在Window 10系統中進行,並使用開發工具IntelliJ IDEA Community Edition 2020.3.2(jdk-15)完成程式碼的編寫、編譯、偵錯、測試等工作。程式需要的元件如貪吃蛇的蛇頭、蛇身及背景圖片等均使用影象軟體Adobe Photoshop 2020製作。
1.遊戲達到50分:
2.遊戲達到100分:
按下F時,速度提高到100。
貪吃蛇遊戲是一個小型益智遊戲,可用於人們日常的休閒、娛樂等場景。本次遊戲設計涉及一維陣列、Swing中的常用元件、GUI中的事件處理(事件監聽器、鍵盤監聽器)、類的封裝與繼承、static靜態變數、包裝類、亂數等方面的知識。
具體需求概要如下:
1.初始化介面為800×800大小,且遊戲介面應保持在螢幕中央,視窗應有“貪吃蛇”字樣;
2.遊戲介面應有必要的提示文字,提示遊戲的得分和蛇的當前速度。開始介面應有操作提示文字(輕按空格遊戲以開始/暫停遊戲、按住F以加速),文字顏色應美觀;
3.在程式中初始化蛇的位置(靠近面板左側)、蛇的方向(預設向右)、蛇的長度(預設為3),並初始化食物的位置;
4.遊戲的開始與暫停的實現:通過空格鍵控制遊戲的開始與暫停;
5.蛇移動功能的實現:用W、S、A、D或↑、↓、←、→控制蛇的運動方向為上、下、左、右進行遊戲;
6.當蛇頭接觸活動外圍時:蛇頭接觸介面最右(左)端則從對稱的左(右)端出現,以此類推,當蛇頭接觸介面最上(下)端則從對稱的下(上)端出現;
7.蛇吃食物的功能的實現:遊戲過程中,蛇頭觸碰到食物時,即為吃食物。此時蛇的長度應加1,速度應增加10,得分增加10,並重新整理食物的位置(隨機位置);
8.蛇加速功能的實現:當按住“F”鍵時,蛇加速運動,速度值達到100;當鬆開“F”鍵時,蛇恢復至預設速度10;
9.蛇的死亡判定:當蛇頭觸碰到蛇身時,蛇死亡,遊戲結束,介面靠近中央提示:“你的小蛇已經死亡,按下空格重新開始!”;
10.遊戲的獎勵機制的實現:當得分為10時,遊戲提示“Good!”字樣;當得分為50時,遊戲提示“Good!!!”字樣;當得分為100時,遊戲提示“Perfect!!!”字樣;當得分達到200時,則遊戲提示“無人能擋!!!”的字樣;以上提示字樣均位於蛇頭;
基本操作表如下:
此貪吃蛇程式大方向上包含貪吃蛇的移動功能、貪吃蛇的主動加速功能、遊戲規則判斷功能、主介面控制功能、貪吃蛇吃食物功能。其中貪吃蛇的移動功能中包含移動方向的按鍵控制以及貪吃蛇的自動移動;遊戲規則判斷功能包括蛇的死亡判斷、遊戲開始與暫停判斷以及越界規則;主介面控制功能包含蛇的初始化以及食物的初始化;貪吃蛇吃食物功能包括蛇身增長、蛇速度增加、積分增加和食物重新整理位置。具體功能結構圖如下:
開始進入貪吃蛇程式時首先判斷是否按下空格鍵,如果按下空格鍵則遊戲開始。遊戲開始後判斷是否有按鍵輸入,若有按鍵輸入則根據按鍵設定改變蛇的移動方向或者進行加速操作;若沒有按鍵操作則蛇繼續保持原方向運動。在蛇運動過程中判斷蛇是否吃到食物,若吃到食物則遊戲得分加10,蛇的移動速度也相應增加;不管是否吃到食物都進行蛇是否死亡的判斷,若死亡則遊戲結束;若蛇沒有死亡則繼續判斷是否有空格輸入,若有則遊戲暫停,反之則繼續判斷按鍵,根據按鍵改變蛇的運動狀態,繼續遊戲,直到蛇死亡,遊戲結束。
貪吃蛇的移動功能主要依賴於選擇語句和鍵盤監聽器來實現,用W、S、A、D或↑、↓、←、→控制蛇的運動方向為上、下、左、右進行遊戲。當按下F鍵時,蛇加速運動。
在貪吃蛇吃食物以及死亡判定的過程中,使用到了以下引數:
以下使用上述引數時便不再贅述。
4.2.1 貪吃蛇吃食物加速功能的設計
當蛇頭的座標snakeX[0]與snakeY[0]分別與食物的座標foodX,foodY相等時,得分score增加10,蛇身長度length加1,Timer引數time減10,從而完成蛇吃到食物後的加分,蛇身加長及加速功能。該功能的流程設計圖如下:
4.2.2 貪吃蛇死亡判定功能的設計
當貪吃蛇吃到自己的時候蛇死亡,即蛇頭座標snakeX[0]與snakeY[0]分別與蛇身座標snakeX[i]和snakeY[i]相等時,即蛇死亡。此時isDied=!isDied。
貪吃蛇的主動加速功能即在遊戲過程中按住F鍵,蛇的移動速度加快,若按住後鬆開,則蛇的速度恢復預設值。這主要通過GUI中的鍵盤監聽器來實現,實現了鍵盤監聽器的兩個方法,keyPressed()與keyReleased()分別監聽按下F鍵的操作和鬆開F鍵的操作。其次用到了引數time,程式中改變time的值通過呼叫timer.setDelay(time)方法(timer為Timer類的一個物件)從而改變定時器的頻率,達到蛇速度加快的效果。
貪吃蛇獎勵機制功能主要使用了選擇結構以及通過paintComponent(Graphics g)方法中的畫筆工具來實現。當遊戲達到一定的得分時,程式會呼叫畫筆工具中的g.drawString(“XXX”,snakeX[0],snakeY[0])方法,在蛇頭位置繪製出提示文字。
5.2.1 Images類
該類為靜態類,主要儲存貪吃蛇元件的圖片物件。
package snakegame; import javax.swing.*; import java.net.URL; //Images類用於封裝圖片路徑以及獲取圖片(使用靜態物件便於用類名直接存取) public class Images { //將圖片的路徑封裝成一個物件 public static URL bodyURL=Images.class.getResource("/snake_images/body.jpg"); public static URL backURL=Images.class.getResource("/snake_images/back.jpg"); public static URL snakeDownURL=Images.class.getResource("/snake_images/snakeDown.jpg"); public static URL snakeLeftURL=Images.class.getResource("/snake_images/snakeLeft.jpg"); public static URL snakeRightURL=Images.class.getResource("/snake_images/snakeRight.jpg"); public static URL snakeUpURL=Images.class.getResource("/snake_images/snakeUp.png"); public static URL foodURL=Images.class.getResource("/snake_images/food.jpg"); //將圖片封裝為程式中的物件 public static ImageIcon bodyImg=new ImageIcon(bodyURL); public static ImageIcon backImg=new ImageIcon(backURL); public static ImageIcon snakeDownImg=new ImageIcon(snakeDownURL); public static ImageIcon snakeUpImg=new ImageIcon(snakeUpURL); public static ImageIcon snakeRightImg=new ImageIcon(snakeRightURL); public static ImageIcon snakeLeftImg=new ImageIcon(snakeLeftURL); public static ImageIcon foodImg=new ImageIcon(foodURL); }
5.2.2 HighestScore
該類實現歷史最高分功能。
package snakegame; import org.w3c.dom.Text; import java.io.*; //該類用於給遊戲新增歷史最高分功能 public class HighestScore { static int score = 0;//最高分的儲存 public void highest() throws IOException { //得分為最高分時儲存 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(String.valueOf(Text.class.getResourceAsStream("貪吃蛇大作戰/score.txt")))); if (GamePanel.score > score) { score = GamePanel.score; String s1 = String.valueOf(score); bos.write(s1.getBytes()); } bos.close(); } //用於遊戲開始時從檔案讀取最高分的值 public void readHighest() throws IOException { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(String.valueOf(Text.class.getResourceAsStream("貪吃蛇大作戰/score.txt")))); byte[] bys = new byte[1024]; int len; while ((len = bis.read(bys)) != -1) { System.out.print(new String(bys, 0, len));//測試用 String s2 = new String(bys, 0, len); score = Integer.valueOf(s2); } bis.close(); } }
5.2.3 GamePanel類
該類用於繪製貪吃蛇遊戲面板,以及實現遊戲具體邏輯功能。
package snakegame; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.IOException; import java.util.Random; //貪吃蛇遊戲面板的繪製 public class GamePanel extends JPanel { Timer timer; int time=100; static int score;//記錄遊戲分數 //蛇屬性部分 boolean isDied; int length;//設定蛇長 String direction;//蛇頭朝向 //分別儲存蛇身的X,Y座標 int[] snakeX=new int[300]; int[] snakeY=new int[300]; //判斷遊戲是否開始 boolean isStart=false; int foodX,foodY;//食物的X,Y座標 //貪吃蛇初始化方法 public void init(){ length=3; snakeX[0]=175; snakeY[0]=275; snakeX[1]=150; snakeY[1]=275; snakeX[2]=125; snakeY[2]=275; foodX=300; foodY=400; score=0; isDied=false;//蛇預設狀態為活著 direction="R";//U,D,L,R分別表示蛇頭朝向上,下,左,右 } //構造方法 public GamePanel() throws IOException { init(); if(GamePanel.score>HighestScore.score){ new HighestScore().highest(); } //焦點定位到當前面板 this.setFocusable(true); //監聽器的實現部分 this.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { super.keyPressed(e); int keyCode = e.getKeyCode(); //按下空格以開始遊戲,以及方向鍵的控制 if (keyCode == KeyEvent.VK_SPACE) { if(isDied){ init(); }else { isStart = !isStart; repaint();//重繪 } } else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) { direction = "U"; } else if (keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) { direction = "D"; } else if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) { direction = "L"; } else if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) { direction = "R"; } } }); //貪吃蛇加速功能的實現 this.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int keyCode=e.getKeyCode(); if(keyCode==KeyEvent.VK_F){ time=10; timer.setDelay(time);//按下F時加速 } } @Override public void keyReleased(KeyEvent e) { int keyCode=e.getKeyCode(); if(keyCode==KeyEvent.VK_F){ time=100; timer.setDelay(time);//鬆開F鍵減速恢復預設速度 } } }); //對定時器進行初始化,並實現監聽器 timer = new Timer(time, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //當遊戲處於開始狀態且蛇活著時蛇活動,且後一節身子到前一節身子的位置上(每一節身子為25乘25畫素) if (isStart && isDied == false) { //蛇身運動部分 for (int i = length - 1; i > 0; i--) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } //蛇頭運動部分 if ("D".equals(direction)) { snakeY[0] += 25; } if ("U".equals(direction)) { snakeY[0] -= 25; } if ("L".equals(direction)) { snakeX[0] -= 25; } if ("R".equals(direction)) { snakeX[0] += 25; } //防止超出邊界 if (snakeX[0] > 750) { snakeX[0] = 25; } if (snakeX[0] < 25) { snakeX[0] = 750; } if (snakeY[0] < 100) { snakeY[0] = 725; } if (snakeY[0] > 725) { snakeY[0] = 100; } //吃食物的動作,吃食物加10分且蛇身變長,蛇的速度提升10 if ((snakeX[0] == foodX && snakeY[0] == foodY)) { length++;//蛇身長度加1 foodX = (new Random().nextInt(30) + 1) * 25;//隨機生成X座標[25,750] foodY = (new Random().nextInt(26) + 4) * 25;//隨機生成Y座標[100,725] score += 10;//吃一次食物積分加10 try { new HighestScore().highest(); } catch (IOException ioException) { ioException.printStackTrace(); } if(time>10) timer.setDelay(time-=10);//吃一次食物速度增加10 } //蛇的死亡機制判定 for (int i = 1; i < length; i++) { if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { isDied = !isDied; } } repaint(); } } }); timer.start();//定時器啟動 } //繪製面板部分 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); //填充背景顏色 this.setBackground(new Color(164, 219, 246)); //繪製初始蛇頭的圖片(預設右方朝向) Images.backImg.paintIcon(this,g,10,10); //調整畫筆的顏色並繪製一個矩形面板 g.setColor(new Color(219,226,219)); g.fillRect(10,70,770,685); //蛇頭的繪製;上下左右不同情況 if("L".equals(direction)){ Images.snakeLeftImg.paintIcon(this,g,snakeX[0],snakeY[0]); } if("R".equals(direction)){ Images.snakeRightImg.paintIcon(this,g,snakeX[0],snakeY[0]); } if("U".equals(direction)){ Images.snakeUpImg.paintIcon(this,g,snakeX[0],snakeY[0]); } if("D".equals(direction)){ Images.snakeDownImg.paintIcon(this,g,snakeX[0],snakeY[0]); } //蛇身的繪製 for(int i=1;i<length;i++) { Images.bodyImg.paintIcon(this, g, snakeX[i], snakeY[i]); } //食物繪製 Images.foodImg.paintIcon(this,g,foodX,foodY); //遊戲的文字提示語 if(!isStart&&!isDied){ g.setColor(new Color(12, 191, 222)); g.setFont(new Font("楷體",Font.BOLD,40)); g.drawString("輕按空格以開始/暫停遊戲!",150,330); g.setColor(new Color(246, 2, 31)); g.setFont(new Font("宋體",Font.CENTER_BASELINE,30)); g.drawString("按住F以加速",300,380); } //遊戲的得分顯示 g.setColor(new Color(248, 4, 74)); g.setFont(new Font("楷體",Font.BOLD,30)); g.drawString("得分:"+score,420,90); //遊戲的最高分展示模組 try { new HighestScore().readHighest(); } catch (IOException e) { e.printStackTrace(); } g.setColor(new Color(183, 25, 238)); g.setFont(new Font("楷體",Font.BOLD,30)); g.drawString("歷史最高分:"+HighestScore.score,10,90); //蛇的速度提示 g.setColor(new Color(248, 136, 36)); g.setFont(new Font("楷體",Font.BOLD,30)); g.drawString("當前速度:"+String.valueOf(110-time),550,90); //遊戲的獎勵鼓勵機制 if(score==10){ g.setColor(new Color(127, 232, 20)); g.setFont(new Font("微軟雅黑",Font.BOLD,50)); g.drawString("Good!",snakeX[0],snakeY[0]); } else if(score==50){ g.setColor(new Color(17, 231, 250)); g.setFont(new Font("微軟雅黑",Font.BOLD,50)); g.drawString("Good!!!",snakeX[0],snakeY[0]); }else if(score==100){ g.setColor(new Color(248, 196, 6)); g.setFont(new Font("微軟雅黑",Font.BOLD,50)); g.drawString("Perfect!!!",snakeX[0],snakeY[0]); }else if(score==200){ g.setColor(new Color(248, 245, 26)); g.setFont(new Font("微軟雅黑",Font.BOLD,50)); g.drawString("無人能擋!!!",snakeX[0],snakeY[0]); } //小蛇死亡時面板的繪製 if(isDied){ g.setColor(new Color(6, 115, 248)); g.setFont(new Font("微軟雅黑",Font.BOLD,30)); g.drawString("你的小蛇已經死亡,按下空格重新開始!",170,330); } } }
5.2.4 Start類
頁面的總體佈局與程式的入口。
package snakegame; import javax.swing.*; import java.awt.*; import java.io.IOException; //貪吃蛇總體介面佈局以及程式的主方法 public class Start { public static void main(String[] args) throws IOException { JFrame jf=new JFrame("貪吃蛇"); //獲取螢幕的大小,並使用資料使視窗位置居中 int width= Toolkit.getDefaultToolkit().getScreenSize().width; int height= Toolkit.getDefaultToolkit().getScreenSize().height; jf.setBounds((width-800)/2,(height-800)/2,800,800); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setResizable(false);//設定視窗大小不能更改 //新增GamePanel面板 GamePanel panel=new GamePanel(); jf.add(panel); jf.setVisible(true); } }
以上就是Java實現貪吃蛇大作戰小遊戲(附原始碼)的詳細內容,更多關於Java貪吃蛇遊戲的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45