1.貪吃蛇游戲介紹:(該游戲代碼不是很完善,可后續(xù)不斷優(yōu)化哦)
2.貪吃蛇游戲的代碼操作步驟/講解:
* 1:設(shè)計(jì)游戲圖紙
* 2:設(shè)計(jì)游戲窗體
* 3:在窗體上添加面板
* 4:在面板上添加畫筆方法(paintComponent方法)
*5 用super調(diào)用父類的paintComponent (來(lái)每一次刷新界面)
* 6:在面板上添加標(biāo)題:用ImageIcon導(dǎo)入圖片類來(lái)導(dǎo)入圖片,然后調(diào)用有關(guān)方法
* 7:在面板上添加黑色游戲區(qū)框(添加黑色方框)-----在畫新成分的paintComponent方 法中 直接用畫筆的天面方框的g.fillRect()來(lái)填滿方框(已達(dá)到添加黑色方框的)
* 8:放靜態(tài)的蛇(包括身體和頭):—與在畫板上添加標(biāo)題是差不多的。都是放入圖片,與其格式類似
* 9:定義蛇的數(shù)據(jù)結(jié)構(gòu) ----記錄蛇的長(zhǎng)度并把蛇能達(dá)到的x y 坐標(biāo)記錄在數(shù)組中。數(shù)據(jù)結(jié) 構(gòu):意思是將蛇的部位的x y坐標(biāo)放入到數(shù)組中(存放在數(shù)組中,以方便調(diào)用,此即為蛇 的數(shù)據(jù)結(jié)構(gòu))
* 10:控制蛇頭的方向----通過(guò)設(shè)置變量 +if else語(yǔ)句來(lái)控制蛇頭的方向變化。
* 11:放上開始字符提示----用畫筆的g.drawString方法在面板直接有字符串出現(xiàn) (要先改變畫 筆的顏色,用setColor()方法來(lái)改變畫筆的顏色 +設(shè)計(jì)字體的有關(guān)內(nèi)容,如字體類型、大 小、是否粗體等的setFont方法)
* 12 :設(shè)置boolean變量來(lái)顯示是否是開始狀態(tài),且結(jié)合此狀態(tài)來(lái)判斷開始字符提示是否應(yīng) 該沒(méi)有(不打印了)----只有狀態(tài)是false才輸出開始提示
* 13:設(shè)置獲取鍵盤事件-----設(shè)置獲取焦點(diǎn)的setFocusable()方法,這樣就可獲取鍵盤事件
* 14:設(shè)置鍵盤監(jiān)聽器 ----通過(guò)addKeyListener()方法來(lái)設(shè)置鍵盤監(jiān)聽器,(自己監(jiān)聽自己 是鍵盤事件,那就要實(shí)現(xiàn)KeyListener的接口)
* 15:重寫實(shí)現(xiàn)KeyListener接口的方法
* 16:通過(guò)設(shè)置變量 + getKeyCode()方法 來(lái)獲取到鍵盤敲了哪個(gè)數(shù)字 (因?yàn)槊恳粋€(gè)按鍵都 對(duì)應(yīng)一個(gè)數(shù)字,getKeyCode()方法能獲取到鍵盤敲了哪個(gè)數(shù)字)
* 17:判斷鍵盤是否敲了空格鍵,如果敲了就改變isstarted的狀態(tài) (KeyEvent.VK_SPACA : 表示空格鍵)
* 18:按空格鍵開始游戲
* 19:設(shè)置時(shí)鐘—讓程序到成運(yùn)行結(jié)束和 運(yùn)行結(jié)束后找數(shù): 一般游戲是找回自身的即找 回this。 (要實(shí)現(xiàn)ActionListener接口才能設(shè)置時(shí)鐘)(時(shí)間到了就會(huì)調(diào)用重寫的 ActionListener的方法)
* 20 :實(shí)現(xiàn)ActionListener接口—讓時(shí)鐘能夠設(shè)置
* 21 :重寫接口方法
* 22:在重寫的方法中,重寫paintComponent方法(即repaint) +通過(guò)Timer.start() 讓時(shí)鐘再次開始
* 23:在構(gòu)造方法中讓時(shí)鐘啟動(dòng)起來(lái)。
* 24 :讓身體移動(dòng)起來(lái)
* 25 :讓頭發(fā)生移動(dòng) ----通過(guò)snakex[0] =snakex[0] + 25;讓蛇一直向右移動(dòng)
* 26 :給頭的移動(dòng)范圍增加邊界----用if語(yǔ)句 +如果snakex[0] =850,就有snakex[0] =25, 通過(guò)此讓其回到反方向的邊界處。(到了邊界就從反方向邊界出現(xiàn))
* 27:實(shí)現(xiàn)暫停 ----按空格就可有蛇不再跑 —(反正括號(hào)里是true則輸出其語(yǔ)句,如果 是false則不輸出)
* 28:根據(jù)鍵盤事件改編direction的值
* 29 :根據(jù)direction的值的變化來(lái)改變頭的移動(dòng)方向—actionPerformed(ActionEvent) 方法處寫代碼。因?yàn)檫@是這是與移動(dòng)有關(guān)的內(nèi)容
*30:添加食物—打印食物的圖片 + 隨機(jī)生成食物的坐標(biāo)
* 31:吃掉食物
* 32 :判斷蛇是否失敗 ----設(shè)置變量isFiled =false; --當(dāng)沒(méi)死的時(shí)候才會(huì)移動(dòng)
? —用for語(yǔ)句判斷如果蛇頭的坐標(biāo)與食物的坐標(biāo)重合的時(shí)候,把 isFiled =true(這樣會(huì)讓蛇沒(méi)法移動(dòng)了)
* 33:游戲結(jié)束提示----當(dāng)isFiled = true的時(shí)候就用drawString輸出一個(gè)結(jié)束字符串提 示游戲結(jié)束 (和打印開始提示很類似)
* 34:當(dāng)游戲結(jié)束后,有紅色提示出現(xiàn)后,再按空格時(shí)不想要白色的開始提示---- 在監(jiān)聽空格鍵那里把開始提示的變量改為相反的值即可(即把)-
* 34:游戲結(jié)束提示 和 實(shí)現(xiàn)重新開始功能
* 35:添加分?jǐn)?shù)和長(zhǎng)度
……….
( 接下來(lái)的步驟可自己結(jié)合代碼深入理解 )文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-764043.html
3.貪吃蛇游戲的詳細(xì)代碼 :
3.1MPanel.java
package moonsnake;
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.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
*
*創(chuàng)建游戲面板格式:(講解:可new對(duì)象 或者直接繼承JPnanel,讓其為父類,獲得其屬性和方法)
*關(guān)鍵字為:JPanel
*/
/**
* 要在面板中畫東西,如設(shè)置顏色等,前面都要有這兩行內(nèi)容
* public void paintComponent(Graphics g) {
* super.paintComponent(g);
*
*/
public class MPanel extends JPanel implements KeyListener, ActionListener { //實(shí)現(xiàn)接口,讓該面板能監(jiān)聽
//創(chuàng)建圖像類,傳入圖片到面板中。
ImageIcon title = new ImageIcon("src/title.jpg"); //用ImageIcon有關(guān)的知識(shí)點(diǎn)來(lái)引入圖片
ImageIcon body= new ImageIcon("src/body.png");
ImageIcon up= new ImageIcon("src/up.png");
ImageIcon down= new ImageIcon("src/down.png");
ImageIcon left= new ImageIcon("src/left.png");
ImageIcon right= new ImageIcon("src/right.png");
ImageIcon food= new ImageIcon("src/food.png"); //然后用畫筆畫出來(lái)
/**
* 蛇的數(shù)據(jù)結(jié)構(gòu),即是有記憶的長(zhǎng)度、寬度等是有記錄的,長(zhǎng)度是會(huì)增加的
*/
//設(shè)置長(zhǎng)度
int len = 3; //蛇的身體長(zhǎng)度默認(rèn)是3
//設(shè)置分?jǐn)?shù)
int score = 0;
//定義數(shù)組來(lái)存放蛇的x坐標(biāo)和y坐標(biāo): 即蛇能在框移動(dòng)的位置范圍為750x750
int [] snakex = new int[750]; //蛇移動(dòng)的位置:蛇移動(dòng)產(chǎn)生的x、y坐標(biāo)
int [] snakey = new int[750];
/**
* 定義變量來(lái)確定蛇的方向,而不是只打印一個(gè)方向
*
* 通過(guò)R,L,U,D 來(lái)分別代表四個(gè)方向
* 先賦一個(gè)值,后面根據(jù)實(shí)際情況而改變
*/
String direction = "R"; //先賦一個(gè)值,后面會(huì)根據(jù)實(shí)際情況而改變
//設(shè)置用于鍵盤監(jiān)聽器的變量
//設(shè)置判斷是否為開始狀態(tài) 默認(rèn)是false
boolean isStarted = false;
//設(shè)置判斷頭是否是與身體重疊,重疊就讓蛇 out掉
boolean isFailed = false;
//設(shè)置時(shí)鐘,來(lái)讓蛇體不斷進(jìn)行移動(dòng)。 new 時(shí)鐘(Timer)對(duì)象
Timer timer = new Timer(150,this); //參數(shù)為(規(guī)定的時(shí)間,到點(diǎn)了找誰(shuí)) ---就可到點(diǎn)了再找回了this,然后不斷重復(fù)以實(shí)現(xiàn)不斷的
//(時(shí)鐘設(shè)置好了,要在構(gòu)造方法中進(jìn)行開始)
//設(shè)置食物
/**
* 隨機(jī)生成食物--引入隨機(jī)函數(shù) Random
*/
int foodx; //此變量在畫的時(shí)候被用
int foody;
//引入隨機(jī)函數(shù)
/**
* 生成隨機(jī)數(shù)的格式是:調(diào)用生成隨機(jī)數(shù)的nextInt()方法
* 如:random.nextInt(34) //從0到33中隨機(jī)選一個(gè)數(shù)
*/
Random random = new Random();
//構(gòu)造方法 (必須要有空的構(gòu)造方法)
public MPanel() {
//調(diào)用刷新圖片的initSnake()方法
initSnake(); //直接輸入方法名
//調(diào)用設(shè)置獲取焦點(diǎn)的方法 即為setFocusable()方法
//調(diào)用設(shè)置獲取焦點(diǎn)
this.setFocusable(true); //獲取焦點(diǎn) 即可獲取鍵盤事件
//設(shè)置鍵盤監(jiān)聽器(參數(shù)中填this,即監(jiān)聽此面板的內(nèi)容) :調(diào)用鍵盤監(jiān)聽器方法,然后監(jiān)聽自身
this.addKeyListener(this); //此處要實(shí)現(xiàn)KeyListener的接口
//開始已設(shè)置好的時(shí)鐘
timer.start();
/**
* 時(shí)鐘開始后,在actionPerformed(執(zhí)行的操作中)進(jìn)行蛇的移動(dòng)的操作
*/
}
//畫游戲中的成分/組成部分的方法
/**
* 其中有Graphics畫筆內(nèi)容
*/
public void paintComponent(Graphics g) {
//在這里面畫東西
super.paintComponent(g); //調(diào)用父類面板方法然后把this.paintComponent中的g傳入到調(diào)用的方法中
//設(shè)置面板顏色
/**
* 游戲窗體一般是不能設(shè)置顏色的,但游戲面板可以設(shè)置顏色
*
* 用this關(guān)鍵字調(diào)用方法則不用new對(duì)象的對(duì)象的引用來(lái)調(diào)用方法
*/
this.setBackground(Color.WHITE);
//把引入的圖片畫出來(lái)
title.paintIcon(this, g, 25, 11);
//第一把為畫在哪里(this表示畫在此面板上。) g表示傳進(jìn)來(lái)的畫筆 后兩個(gè)表示距離窗體的距離
//在游戲面板中畫出黑色的框
/**
* 直接用畫筆把想要的方框填成黑色
* 即用fill.Rect()方法來(lái)在指定位置來(lái)填成黑色
* (距離位置,距離位置,寬,高)
* g即為畫筆的引用
*/
//畫出黑色方框
g.fillRect(25, 75, 850, 600);
//先把畫筆顏色設(shè)置為其他顏色,為打印長(zhǎng)度和分?jǐn)?shù)做準(zhǔn)備
g.setColor(Color.WHITE);
//打印長(zhǎng)度和分?jǐn)?shù)(用drawString方法打印出字符串、字符)
g.drawString("len:" +len,750 , 35);
g.drawString("score:" +score,750 , 50);
//畫出身體、上下左右
// right.paintIcon(this, g, 100, 100);
// body.paintIcon(this, g, 75, 100);
// body.paintIcon(this, g, 50, 100); //這里就不能這樣畫出蛇的內(nèi)容,數(shù)量多就不行,要用for循環(huán)。
//打印頭
if (direction == "R") {
right.paintIcon(this, g, snakex[0],snakey[0]); //如果是R,則打印向右的頭圖片
}else if (direction == "L") {
left.paintIcon(this, g, snakex[0],snakey[0]); //如果是L,則打印向左的頭圖片
}else if (direction == "U") {
up.paintIcon(this, g, snakex[0],snakey[0]); //如果是U,則打印向上的頭圖片
}else if (direction == "D") {
down.paintIcon(this, g, snakex[0],snakey[0]); //如果是D,則打印向下的頭圖片
}
//打印身體
for(int i =1 ;i<len;i++) {
//通過(guò)數(shù)組下標(biāo)的增加來(lái)在for循環(huán)中,打印出蛇的身體 :其坐標(biāo)為snakex[i],即可根據(jù)下標(biāo)的改變而改變
body.paintIcon(this, g, snakex[i] ,snakey[i]);
}
//打印食物
food.paintIcon(this, g, foodx, foody);
//把畫筆變成其他顏色
g.setColor(Color.WHITE);
//改變字體大小 :導(dǎo)入font包,然后設(shè)置好參數(shù)(字體類型,字符是粗體/斜體,字體大?。?/span>
g.setFont(new Font ("arial",Font.BOLD,40));
/**
*在面板中打印開始語(yǔ) :實(shí)際上是用畫筆畫出字符串
*/
//畫出開始語(yǔ)
//當(dāng)游戲開始時(shí)取消畫筆畫出來(lái)的字,isStarted為false時(shí)才打印
if (isStarted ==false ) {
g.drawString("Press Space to start", 300, 300);
}
g.setColor(Color.RED);
g.setFont(new Font ("arial",Font.BOLD,40));
//輸出重新開始語(yǔ) ---然后要重新開始就要在響應(yīng)鍵盤事件:在響應(yīng)鍵盤哪里天健if語(yǔ)句使isFailed變成flase
if (isFailed ==true) { //如果isFailed = true則輸出重新開始語(yǔ)
g.drawString("Failed:Press Space to start", 200, 300);
}
/**
* 要讓這個(gè)面板真正的有顏色和其中的方法有效果,就要在窗體中用add方法把面板加入到窗體中。
*/
}
/**
* 圖片的x y坐標(biāo)放入到數(shù)組中,然后要輸入x y坐標(biāo)時(shí)調(diào)用對(duì)應(yīng)下標(biāo)的數(shù)值即有,+配合for循環(huán)語(yǔ)句來(lái)打印圖片,此過(guò)程即為蛇的數(shù)據(jù)結(jié)構(gòu)
*/
//建立初始化snake的方法 (刷新蛇的圖片,讓其產(chǎn)生移動(dòng)的效果)
public void initSnake() { //init :初始化
len =3; //蛇開始長(zhǎng)度是3
/**
* 蛇頭的坐標(biāo)是100x100,把存在數(shù)組的下標(biāo)為0(x/y數(shù)組的下標(biāo)都為0)
*/
snakex[0]=100;
snakey[0]=100; //把蛇頭的位置坐標(biāo)存到數(shù)組中,且下標(biāo)為0
snakex[1]=75;
snakey[1]=100;
snakex[2]=50;
snakey[2]=100;
//設(shè)置食物的x y坐標(biāo)位置
/**
* 用nextInt()生成隨機(jī)數(shù),然后給food坐標(biāo)用上。 范圍是25*(0-33)
*/
foodx = 25 +25*random.nextInt(34); //25 +... 的意思是 食物出現(xiàn)當(dāng)后面的數(shù)是0時(shí),就出現(xiàn)在第一個(gè)格子
foody = 75 +25*random.nextInt(24); //然后畫出來(lái) 在paintComponent方法中畫出來(lái)
//設(shè)置分?jǐn)?shù)
score = 0; //讓重新開始時(shí),分?jǐn)?shù)不會(huì)再繼續(xù)。
}
@Override
public void keyTyped(KeyEvent e) { //當(dāng)鍵敲了
}
@Override //響應(yīng)鍵盤事件
public void keyPressed(KeyEvent e) { //當(dāng)鍵敲到底了
//KeyEvent :指的是敲了哪個(gè)鍵,設(shè)置int類型的變量進(jìn)行接受
/**
* 使用getKeyCode()方法來(lái)獲取到敲擊了哪個(gè)按鍵 (每一個(gè)按鍵都對(duì)應(yīng)一個(gè)數(shù)字)
*/
int keycode = e.getKeyCode(); //能夠知道敲擊了哪個(gè)鍵盤
if ( keycode == KeyEvent.VK_SPACE ){ //keycode等于空格鍵就是isStarted的值改變?yōu)閠rue
//重新開始(響應(yīng)鍵盤事件)
if(isFailed) {
isFailed = false;
//格式化內(nèi)容:即調(diào)用最開始的方法, 讓蛇在一開始的地方重新開始
initSnake();
}
isStarted = !isStarted; //!isStarted是取反的意思 ,整體的意思就是值取反。
//再次畫圖片 :重畫圖片:repaint();
repaint(); //此即會(huì)重新調(diào)用方法
}else if (keycode == KeyEvent.VK_RIGHT) { //如果鍵盤按了向右的鍵盤
direction = "R";
}else if (keycode == KeyEvent.VK_LEFT) { //如果鍵盤按了向右的鍵盤
direction = "L";
}else if (keycode == KeyEvent.VK_UP) { //如果鍵盤按了向右的鍵盤
direction = "U";
}else if (keycode == KeyEvent.VK_DOWN) { //如果鍵盤按了向右的鍵盤
direction = "D"; //然后在actionPerformed中配合鐘表來(lái)刷數(shù)據(jù)
}
}
@Override
public void keyReleased(KeyEvent e) { //當(dāng)鍵敲完然后抬起來(lái)了
}
@Override
public void actionPerformed(ActionEvent e) { //時(shí)間到了就會(huì)調(diào)用這個(gè)方法
/**
* 時(shí)間到了就會(huì)調(diào)用此方法,然后在此內(nèi)容結(jié)尾再次開啟時(shí)鐘,已達(dá)到不斷循環(huán)的效果
*/
//到點(diǎn)了就重寫
repaint();
//將圖移動(dòng)和空格鍵的內(nèi)容連接起來(lái)
if (isStarted && !isFailed ) { //如果isStarted是true 且 !isFailed(且不是失敗的)
/**
* 讓蛇動(dòng)起來(lái) :先是頭動(dòng),即讓頭的圖像x,y發(fā)生移動(dòng)。
*/
for (int i = len-1; i>0;i--) {
snakex[i] = snakex[i-1]; //蛇身體的x坐標(biāo)移動(dòng)
snakey[i] = snakey[i-1]; //蛇身體的y坐標(biāo)移動(dòng)
}
if (direction == "R") {
//direction = "R" 時(shí)執(zhí)行的代碼
snakex[0] =snakex[0]+25;
if (snakex[0] >850) snakex[0] = 25; //判斷語(yǔ)句的簡(jiǎn)寫形式
}else if (direction =="L") {
snakex[0] =snakex[0]-25;
if (snakex[0] <25) snakex[0] = 850; //判斷語(yǔ)句的簡(jiǎn)寫形式
}else if (direction =="U") {
snakey[0] =snakey[0]-25;
if (snakey[0] <75) snakey[0] = 650; //判斷語(yǔ)句的簡(jiǎn)寫形式
}else if (direction =="D") {
snakey[0] =snakey[0]+25;
if (snakex[0] >650) snakex[0] = 75; //判斷語(yǔ)句的簡(jiǎn)寫形式
}
//吃掉食物
/**
* 判斷食物的x、y坐標(biāo)是否為頭的x、y坐標(biāo)是否重合
*/
if (snakex[0] == foodx && snakey[0]==foody) {
len++; //頭的圖片和食物圖片重合就長(zhǎng)度+1 ---這樣長(zhǎng)度+1,身體就會(huì)變成。
//長(zhǎng)度增加后,分?jǐn)?shù)也會(huì)增加 (然后把分?jǐn)?shù)顯示出來(lái),把它畫出來(lái):實(shí)質(zhì)是打印字符一樣打印出來(lái)即可)
score = score +10;
//然后重新刷新圖片
foodx = 25 +25*random.nextInt(34); //25 +... 的意思是 食物出現(xiàn)當(dāng)后面的數(shù)是0時(shí),就出現(xiàn)在第一個(gè)格子
foody = 75 +25*random.nextInt(24); //然后畫出來(lái) 在paintComponent方法中畫出來(lái)
}
//判斷頭是否和身體重合,如果是則 (用for語(yǔ)句來(lái)循環(huán)輸出len的值/數(shù)組的值,然后判斷是否有重合現(xiàn)象)
for (int i = 1;i<len ;i++) {
if (snakex[i]==snakex[0] && snakey[i]==snakey[0]) {
//如果是重合的,那就有isFailed 變?yōu)閠rue,讓移動(dòng)程序不再運(yùn)行
isFailed = true;
}
}
}
//重寫
repaint();
//然后還有讓時(shí)鐘再次開始
timer.start();
}
}
3.2 Msnake.java
package moonsnake;
import java.awt.Color;
import javax.swing.JFrame;
/**
*
*
*畫出窗體 :900x720
*
*/
/**
* 看著有顏色,實(shí)質(zhì)上是面板中的顏色,而是窗體中的顏色。
*
*/
public class Msnake {
public static void main(String[] args) {
/**
* 窗體類關(guān)鍵字為:JFrame
* 作用就是會(huì)有一個(gè)游戲面板一樣的東西會(huì)出現(xiàn)在屏幕上,只要這個(gè)窗體是有顏色的話。
*/
//畫出窗體類
JFrame frame = new JFrame(); //new一個(gè)窗體類對(duì)象
//調(diào)用jframe的Bounds方法來(lái)設(shè)置窗體的大小和距離和距離屏幕的位置
frame.setBounds(10,10,900,700);
//用Resizable方法來(lái)設(shè)置面板不可拖動(dòng)
frame.setResizable(false);
//用setDeafaultCloseOperation方法來(lái)關(guān)閉游戲界面
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/**
* 用add方法把面板類加入到窗體中
*/
frame.add(new MPanel());
//用Visible方法來(lái)使窗體展現(xiàn)出來(lái)
frame.setVisible(true);
/**
* 做完這些的結(jié)果就是有一個(gè)900x720的白色的距離左上屏幕10,10距離的窗體。
*/
}
}
4.貪吃蛇游戲的代碼分享 (獲得代碼 和 其中游戲圖片)
鏈接:百度網(wǎng)盤獲得“代碼”和“游戲圖片”文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-764043.html
5.(繼續(xù)優(yōu)化/完善中…)
到了這里,關(guān)于Javase | 貪吃蛇小游戲的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!