日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

分享狂神贪吃蛇代码及图片素材,包含部分个人优化

發(fā)布時(shí)間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分享狂神贪吃蛇代码及图片素材,包含部分个人优化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

按照狂神貪吃蛇教程做出的成品程序,和大家分享

???????使用CSDN這么久,第一次自己寫(xiě)文章,如有低級(jí)錯(cuò)誤,請(qǐng)多包涵。

???????我最近在學(xué)習(xí)JavaSE進(jìn)階,按照狂神 (B站ID:遇見(jiàn)狂神說(shuō)) 推薦的學(xué)習(xí)路徑,學(xué)習(xí)到了GUI部分,受益匪淺。如果你也在自學(xué)Java,不妨去關(guān)注up,他的講課風(fēng)格很好,而且涉及全面,從Java基礎(chǔ),到MVC,再到SpringBoot,值得一看。

???????這篇文章的目的是分享一下狂神貪吃蛇項(xiàng)目的全部代碼,其中包含我做出改進(jìn)的部分,也有我個(gè)人的疑惑,希望和大家分享。

???????這個(gè)貪吃蛇項(xiàng)目實(shí)現(xiàn)了簡(jiǎn)單的GUI界面和鍵盤(pán)監(jiān)聽(tīng)用戶交互,美中不足是比較簡(jiǎn)陋,而且不是完全的面向?qū)ο箜?xiàng)目。由于經(jīng)驗(yàn)與理解尚不足,我暫時(shí)沒(méi)有能力將它更加完善。如果您有好的意見(jiàn),歡迎與我聯(lián)系。

基礎(chǔ)功能:
1.鍵盤(pán)方向鍵控制小蛇移動(dòng)
2.空格鍵暫停游戲
新增功能:
1.小蛇運(yùn)動(dòng)時(shí)無(wú)法回頭直接吃自己
2.增加了難度機(jī)制,蛇的長(zhǎng)度越長(zhǎng),難度越高
3.按c鍵進(jìn)入作弊模式
未解決部分:
1.無(wú)法通過(guò)修改timer的參數(shù),來(lái)根據(jù)難度調(diào)整小蛇運(yùn)動(dòng)的速度

啟動(dòng)類:

package com.zcy.JavaSE.GUI.Snake;import javax.swing.*; /*** @author 睿智的倉(cāng)鼠**-學(xué)習(xí)自B站up 遇見(jiàn)狂神說(shuō),代碼非原創(chuàng),僅供學(xué)習(xí)參考!**-基礎(chǔ)功能:*1.鍵盤(pán)方向鍵控制小蛇移動(dòng)*2.空格鍵暫停游戲**-新增功能:*1.小蛇運(yùn)動(dòng)時(shí)無(wú)法回頭直接吃自己*2.增加了難度機(jī)制,蛇的長(zhǎng)度越長(zhǎng),難度越高*3.按c鍵進(jìn)入作弊模式**-未解決部分:*1.無(wú)法通過(guò)修改timer的參數(shù),來(lái)根據(jù)難度調(diào)整小蛇運(yùn)動(dòng)的速度**///主啟動(dòng)類 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; //創(chuàng)建主窗口 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{//定義游戲數(shù)據(jù)int panel_Width;//游戲界面寬度int panel_Height;//游戲界面高度int snake_Speed = 200;//刷新時(shí)間(毫秒),越大越慢//定義蛇的數(shù)據(jù)結(jié)構(gòu)int length; //蛇的長(zhǎng)度int[] snake_X = new int[600]; //蛇的x坐標(biāo)int[] snake_Y = new int[600]; //蛇的y坐標(biāo)String snake_Orientation; //蛇頭朝向//食物的坐標(biāo)int food_X;int food_Y;Random random = new Random();//定義游戲狀態(tài):開(kāi)始、暫停boolean isStrat = false; //默認(rèn)暫停狀態(tài)//游戲失敗boolean isFail = false;//游戲積分int score;int food_Value;//吃一個(gè)食物給幾分//游戲難度int level;//cheatboolean cheat = false;//定時(shí)器Timer timer = new Timer(snake_Speed, this); //刷新時(shí)間(毫秒), 監(jiān)聽(tīng)的目標(biāo)對(duì)象//構(gòu)造器public GamePanel() {init();//獲得焦點(diǎn)和鍵盤(pán)事件this.setFocusable(true); //獲得焦點(diǎn)事件this.addKeyListener(new keyboardListener());timer.start();//游戲一開(kāi)始,定時(shí)器就啟動(dòng)}//初始化方法public void init(){panel_Width = 850;panel_Height = 600;length = 3;snake_X[0] = 100;snake_Y[0] = 100; //頭的坐標(biāo)snake_X[1] = 75;snake_Y[1] = 100; //第一節(jié)身體的坐標(biāo)snake_X[2] = 50;snake_Y[2] = 100; //第二節(jié)身體的坐標(biāo)snake_Orientation = "right"; //初始頭的方向?yàn)橛?/span>//食物隨機(jī)分布在界面上food_X = 25 + 25*random.nextInt(33);//生成1到34的隨機(jī)數(shù)food_Y = 75 + 25*random.nextInt(23);score = 0;food_Value = 5;level = 1;}//繪制面板@Overrideprotected void paintComponent(Graphics g) { //paintComponent無(wú)需調(diào)用,自動(dòng)執(zhí)行super.paintComponent(g);//清屏//繪制靜態(tài)面板this.setBackground(Color.lightGray);//畫(huà)上方廣告欄Data.header.paintIcon(this, g, 25, 11);//在哪個(gè)組件畫(huà), 用哪個(gè)畫(huà)筆畫(huà), X, Y//畫(huà)下方游戲界面g.fillRect(25, 75, panel_Width, panel_Height);//畫(huà)積分g.setColor(Color.white);g.setFont(new Font("微軟雅黑", Font.BOLD, 15)); //設(shè)置字體g.drawString("長(zhǎng)度:"+length, 750, 25);g.drawString("分?jǐn)?shù):"+score, 750, 40);g.drawString("難度:"+level, 750, 55);//畫(huà)食物Data.food.paintIcon(this, g, food_X, food_Y);//畫(huà)小蛇if (snake_Orientation.equals("right")){Data.right.paintIcon(this, g, snake_X[0], snake_Y[0]);//畫(huà)朝右的頭部}else if(snake_Orientation.equals("left")){Data.left.paintIcon(this, g, snake_X[0], snake_Y[0]);//畫(huà)朝左的頭部}else if(snake_Orientation.equals("up")){Data.up.paintIcon(this, g, snake_X[0], snake_Y[0]);//畫(huà)朝上的頭部}else if(snake_Orientation.equals("down")){Data.down.paintIcon(this, g, snake_X[0], snake_Y[0]);//畫(huà)朝下的頭部}for (int i = 1; i < length; i++) {Data.body.paintIcon(this, g, snake_X[i], snake_Y[i]);//畫(huà)每一節(jié)身體}//游戲狀態(tài)if (isStrat == false){g.setColor(Color.white);g.setFont(new Font("微軟雅黑", Font.BOLD, 40)); //設(shè)置字體g.drawString("按下空格開(kāi)始游戲", 300, 300);}//游戲失敗if (isFail == true){g.setColor(Color.red);g.setFont(new Font("微軟雅黑", Font.BOLD, 40)); //設(shè)置字體g.drawString("失敗,按下空格重新開(kāi)始", 220, 300);}}//鍵盤(pán)監(jiān)聽(tīng)器class keyboardListener extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//獲得按下的鍵//空格if (keyCode == KeyEvent.VK_SPACE){ //按下空格if (isFail == true){//空格控制重新開(kāi)始isFail = false;init();}else {//空格控制游戲暫停isStrat = !isStrat; //isStart取反}repaint();}//控制小蛇移動(dòng)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;}}}//事件監(jiān)聽(tīng),通過(guò)固定的時(shí)間來(lái)刷新@Overridepublic void actionPerformed(ActionEvent e) {if (isStrat == true && isFail == false){ //游戲開(kāi)始狀態(tài),則小蛇開(kāi)始運(yùn)動(dòng)//身體跟隨移動(dòng)for (int i = length-1; i > 0; i--) {//向前移動(dòng)一節(jié)(每個(gè)身體都到上一節(jié)身體的坐標(biāo))//新生成的身體不可見(jiàn)snake_X[length] = -50;snake_Y[length] = -50;snake_X[i] = snake_X[i-1]; snake_Y[i] = snake_Y[i-1];}//頭部運(yùn)動(dòng)判斷,只需要控制頭部的運(yùn)動(dòng),其他身體都會(huì)跟著動(dòng)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){//身體變長(zhǎng)length++;//分?jǐn)?shù)增加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++) { //遍歷所有身體坐標(biāo)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();//定時(shí)器開(kāi)始}}

數(shù)據(jù)部分:

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

圖片素材下載地址:

鏈接:百度網(wǎng)盤(pán) 下載地址
提取碼:qbm4

初來(lái)乍到,請(qǐng)多關(guān)照。

我會(huì)寫(xiě)更多文章來(lái)分享我覺(jué)得有意義的項(xiàng)目,記錄學(xué)習(xí)歷程。

總結(jié)

以上是生活随笔為你收集整理的分享狂神贪吃蛇代码及图片素材,包含部分个人优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。