分享狂神贪吃蛇代码及图片素材,包含部分个人优化
生活随笔
收集整理的這篇文章主要介紹了
分享狂神贪吃蛇代码及图片素材,包含部分个人优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
按照狂神貪吃蛇教程做出的成品程序,和大家分享
???????使用CSDN這么久,第一次自己寫文章,如有低級錯誤,請多包涵。
???????我最近在學習JavaSE進階,按照狂神 (B站ID:遇見狂神說) 推薦的學習路徑,學習到了GUI部分,受益匪淺。如果你也在自學Java,不妨去關注up,他的講課風格很好,而且涉及全面,從Java基礎,到MVC,再到SpringBoot,值得一看。
???????這篇文章的目的是分享一下狂神貪吃蛇項目的全部代碼,其中包含我做出改進的部分,也有我個人的疑惑,希望和大家分享。
???????這個貪吃蛇項目實現了簡單的GUI界面和鍵盤監聽用戶交互,美中不足是比較簡陋,而且不是完全的面向對象項目。由于經驗與理解尚不足,我暫時沒有能力將它更加完善。如果您有好的意見,歡迎與我聯系。
基礎功能:
1.鍵盤方向鍵控制小蛇移動
2.空格鍵暫停游戲
新增功能:
1.小蛇運動時無法回頭直接吃自己
2.增加了難度機制,蛇的長度越長,難度越高
3.按c鍵進入作弊模式
未解決部分:
1.無法通過修改timer的參數,來根據難度調整小蛇運動的速度
啟動類:
package com.zcy.JavaSE.GUI.Snake;import javax.swing.*; /*** @author 睿智的倉鼠**-學習自B站up 遇見狂神說,代碼非原創,僅供學習參考!**-基礎功能:*1.鍵盤方向鍵控制小蛇移動*2.空格鍵暫停游戲**-新增功能:*1.小蛇運動時無法回頭直接吃自己*2.增加了難度機制,蛇的長度越長,難度越高*3.按c鍵進入作弊模式**-未解決部分:*1.無法通過修改timer的參數,來根據難度調整小蛇運動的速度**///主啟動類 public class StartGame {public static void main(String[] args) {new MainFrame();} }主窗口類:
package com.zcy.JavaSE.GUI.Snake;import javax.swing.JFrame; import javax.swing.WindowConstants; //創建主窗口 public class MainFrame{public MainFrame(){init();}public void init(){JFrame frame = new JFrame();frame.setSize(915, 745);frame.setResizable(false);//窗口不可拉伸frame.setTitle("貪吃蛇小游戲");frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.add(new GamePanel());frame.setVisible(true);} }游戲面板:
package com.zcy.JavaSE.GUI.Snake;import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Random;import javax.swing.JPanel; import javax.swing.Timer;//游戲面板 public class GamePanel extends JPanel implements ActionListener{//定義游戲數據int panel_Width;//游戲界面寬度int panel_Height;//游戲界面高度int snake_Speed = 200;//刷新時間(毫秒),越大越慢//定義蛇的數據結構int length; //蛇的長度int[] snake_X = new int[600]; //蛇的x坐標int[] snake_Y = new int[600]; //蛇的y坐標String snake_Orientation; //蛇頭朝向//食物的坐標int food_X;int food_Y;Random random = new Random();//定義游戲狀態:開始、暫停boolean isStrat = false; //默認暫停狀態//游戲失敗boolean isFail = false;//游戲積分int score;int food_Value;//吃一個食物給幾分//游戲難度int level;//cheatboolean cheat = false;//定時器Timer timer = new Timer(snake_Speed, this); //刷新時間(毫秒), 監聽的目標對象//構造器public GamePanel() {init();//獲得焦點和鍵盤事件this.setFocusable(true); //獲得焦點事件this.addKeyListener(new keyboardListener());timer.start();//游戲一開始,定時器就啟動}//初始化方法public void init(){panel_Width = 850;panel_Height = 600;length = 3;snake_X[0] = 100;snake_Y[0] = 100; //頭的坐標snake_X[1] = 75;snake_Y[1] = 100; //第一節身體的坐標snake_X[2] = 50;snake_Y[2] = 100; //第二節身體的坐標snake_Orientation = "right"; //初始頭的方向為右//食物隨機分布在界面上food_X = 25 + 25*random.nextInt(33);//生成1到34的隨機數food_Y = 75 + 25*random.nextInt(23);score = 0;food_Value = 5;level = 1;}//繪制面板@Overrideprotected void paintComponent(Graphics g) { //paintComponent無需調用,自動執行super.paintComponent(g);//清屏//繪制靜態面板this.setBackground(Color.lightGray);//畫上方廣告欄Data.header.paintIcon(this, g, 25, 11);//在哪個組件畫, 用哪個畫筆畫, X, Y//畫下方游戲界面g.fillRect(25, 75, panel_Width, panel_Height);//畫積分g.setColor(Color.white);g.setFont(new Font("微軟雅黑", Font.BOLD, 15)); //設置字體g.drawString("長度:"+length, 750, 25);g.drawString("分數:"+score, 750, 40);g.drawString("難度:"+level, 750, 55);//畫食物Data.food.paintIcon(this, g, food_X, food_Y);//畫小蛇if (snake_Orientation.equals("right")){Data.right.paintIcon(this, g, snake_X[0], snake_Y[0]);//畫朝右的頭部}else if(snake_Orientation.equals("left")){Data.left.paintIcon(this, g, snake_X[0], snake_Y[0]);//畫朝左的頭部}else if(snake_Orientation.equals("up")){Data.up.paintIcon(this, g, snake_X[0], snake_Y[0]);//畫朝上的頭部}else if(snake_Orientation.equals("down")){Data.down.paintIcon(this, g, snake_X[0], snake_Y[0]);//畫朝下的頭部}for (int i = 1; i < length; i++) {Data.body.paintIcon(this, g, snake_X[i], snake_Y[i]);//畫每一節身體}//游戲狀態if (isStrat == false){g.setColor(Color.white);g.setFont(new Font("微軟雅黑", Font.BOLD, 40)); //設置字體g.drawString("按下空格開始游戲", 300, 300);}//游戲失敗if (isFail == true){g.setColor(Color.red);g.setFont(new Font("微軟雅黑", Font.BOLD, 40)); //設置字體g.drawString("失敗,按下空格重新開始", 220, 300);}}//鍵盤監聽器class keyboardListener extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//獲得按下的鍵//空格if (keyCode == KeyEvent.VK_SPACE){ //按下空格if (isFail == true){//空格控制重新開始isFail = false;init();}else {//空格控制游戲暫停isStrat = !isStrat; //isStart取反}repaint();}//控制小蛇移動if (keyCode == KeyEvent.VK_UP){if (snake_Orientation != "down"){snake_Orientation = "up"; //蛇頭變向}}else if (keyCode == KeyEvent.VK_DOWN){if (snake_Orientation != "up"){snake_Orientation = "down";}}else if (keyCode == KeyEvent.VK_LEFT){if (snake_Orientation != "right"){snake_Orientation = "left";}}else if (keyCode == KeyEvent.VK_RIGHT){if (snake_Orientation != "left"){snake_Orientation = "right";}}if (keyCode == KeyEvent.VK_C){cheat = !cheat;}}}//事件監聽,通過固定的時間來刷新@Overridepublic void actionPerformed(ActionEvent e) {if (isStrat == true && isFail == false){ //游戲開始狀態,則小蛇開始運動//身體跟隨移動for (int i = length-1; i > 0; i--) {//向前移動一節(每個身體都到上一節身體的坐標)//新生成的身體不可見snake_X[length] = -50;snake_Y[length] = -50;snake_X[i] = snake_X[i-1]; snake_Y[i] = snake_Y[i-1];}//頭部運動判斷,只需要控制頭部的運動,其他身體都會跟著動if (snake_Orientation == "up"){snake_Y[0] = snake_Y[0]-25;if (snake_Y[0] < 75){//邊界判斷snake_Y[0] = panel_Height+50;}}else if (snake_Orientation == "down"){snake_Y[0] = snake_Y[0]+25;if (snake_Y[0] > panel_Height+50){//邊界判斷snake_Y[0] = 75;}}else if (snake_Orientation == "left"){snake_X[0] = snake_X[0]-25;if (snake_X[0] < 25){//邊界判斷snake_X[0] = panel_Width;}}else if (snake_Orientation == "right"){snake_X[0] = snake_X[0]+25;if (snake_X[0] > panel_Width){//邊界判斷snake_X[0] = 25;}}//吃食物if (snake_X[0] == food_X && snake_Y[0] == food_Y){//身體變長length++;//分數增加score += food_Value;//重新生成食物food_X = 25 + 25*random.nextInt(34);food_Y = 75 + 25*random.nextInt(24);}//失敗判定,頭碰到身體就算失敗if (cheat == false){for (int i = 1; i < length; i++) { //遍歷所有身體坐標if (snake_X[0] == snake_X[i] && snake_Y[0] == snake_Y[i]){isFail = true;break;} }}if (length > 4 && length < 13){level = 2;timer.stop();snake_Speed = 1000;}repaint();}timer.start();//定時器開始}}數據部分:
package com.zcy.JavaSE.GUI.Snake;import java.net.URL;import javax.swing.ImageIcon;public class Data {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 URL downURL = Data.class.getResource("statics/down.png");public static URL leftURL = Data.class.getResource("statics/left.png");public static URL rightURL = Data.class.getResource("statics/right.png");public static ImageIcon up = new ImageIcon(upURL);public static ImageIcon down = new ImageIcon(downURL);public static ImageIcon left = new ImageIcon(leftURL);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);}圖片素材保存目錄:
Snake.statics
圖片素材下載地址:
鏈接:百度網盤 下載地址
提取碼:qbm4
初來乍到,請多關照。
我會寫更多文章來分享我覺得有意義的項目,記錄學習歷程。
總結
以上是生活随笔為你收集整理的分享狂神贪吃蛇代码及图片素材,包含部分个人优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.2. XSS
- 下一篇: 模仿网易云音乐鲸云特效动效