首頁>科技>
一、介紹

花了兩個下午寫了一個貪吃蛇小遊戲,本人想寫這遊戲很長時間了。作為以前諾基亞手機上的經典遊戲,貪吃蛇和俄羅斯方塊一樣,都曾經在我們的童年給我們帶來了很多樂趣。世間萬物斗轉星移,諾基亞曾經作為手機業的龍頭老大,現如今也一步步走向衰落,被收購,再過不久估計就要退出手機業務了,而貪吃蛇這款遊戲也基本上沒人玩了,甚至在新一代人的印象中都已毫無記憶了。。。但是,這款遊戲在它基礎上經過改造其實可以弄出很多花樣,也確實可以在一定程度上鍛鍊自己的程式設計能力。前不久十分火熱的貪吃蛇大作戰其實就可以看做是在這款遊戲的基礎上進行的改造。所以,我也希望自己可以嘗試一下,做個有意思的版本。

二、貪食蛇遊戲邏輯架構三、貪食蛇開發流程1、準備開發環境

(1)開啟eclipse。(2)新建SnakeGame專案,在該專案下新建Snake主類和Panel類;新建一個folder:resource存放資源,在該檔案resource下再新建兩個folder:sound和image,把遊戲所需圖片檔案和音訊檔案放進去。

圖片音訊resource連結: https://pan.baidu.com/s/1nm_vPxHb_jVVNGcUfVxBWg提取碼: jfdv

2、設計遊戲圖紙3、畫出白布視窗frame
	JFrame frame = new JFrame();	frame.setBounds(200, 50, 800, 600);	frame.setResizable(false);// 設定視窗不可更改	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	frame.setVisible(true);// 使視窗可視
4、在視窗上新增畫布
frame.add(new Panel());
5、在畫布上新增標題
ImageIcon title;// 定義遊戲介面開頭欄圖示title.paintIcon(this, g, 5, 0);// 用畫筆g畫title圖示
6、在畫布上新增黑色遊戲框,新增遊戲背景圖(遊戲區)
g.fillRect(5, 35, 775, 525);// 用畫筆g畫遊戲介面黑框g.drawImage(bj, 5, 35, this);// 新增遊戲介面背景圖片
7、在遊戲區放上靜態的蛇
for (int i = 1; i < len; i++) {// 不能從0開始,0用來存放蛇頭了	    body.paintIcon(this, g, snakex[i], snakey[i]);	}
8、初始化蛇
 public void initSnake() {	len = 3;	snakex[0] = 55;//一定要注意初始座標的選取,不能隨意取,	snakey[0] = 35;	snakex[1] = 30;	snakey[1] = 35;	snakex[2] = 5;	snakey[2] = 35;	foodx = 5 + 25 * rand.nextInt(30);// 橫座標可容納30個food呼叫rand方法隨機生成	foody = 35 + 25 * rand.nextInt(21);// 縱座標可容納21個food	fx = "R";// 重新初始化蛇頭方向,不然每次一重新開始又立馬撞到自己然後over掉!	score = 0;    }
9、控制蛇頭的方向
	if (fx == "R") {	    right.paintIcon(this, g, snakex[0], snakey[0]);// 蛇頭放在頭節點,即第一個陣列元素中	} else if (fx == "L") {	    left.paintIcon(this, g, snakex[0], snakey[0]);	} else if (fx == "U") {	    up.paintIcon(this, g, snakex[0], snakey[0]);	} else if (fx == "D") {	    down.paintIcon(this, g, snakex[0], snakey[0]);	}
10、放上游戲開始、遊戲結束提示
// 畫跳出的遊戲開始提示字元	if (isStarted == false) {	    g.setColor(Color.white);// 重新設定畫筆字型顏色	    g.setFont(new Font("arial", Font.BOLD + Font.ITALIC, 45));// 重新設定畫筆字型型別,加粗,大小	    g.drawString("Press Space to Your Show Time", 50, 475);// 畫它,放在視窗中座標為(75,300)的地方	    g.setColor(Color.red);	    begin.paintIcon(this, g, 250, 150);	}	// 畫遊戲結束介面	if (isFailed) {	    g.setColor(Color.white);	    g.setFont(new Font("arial", Font.BOLD, 40));	    g.drawString("Press Space to Restart", 200, 360);	    g.setColor(Color.red);	    g.setFont(new Font("arial", Font.BOLD + Font.ITALIC, 73));// 同時設定粗體與斜體用加號	    g.drawString("Game Over ! ", 200, 250);	    fail.paintIcon(this, g, 0, 380);	}
11、按空格鍵控制遊戲開始12、讓蛇動起來
if (isStarted && !isFailed) {	    // 遞迴方法,每間隔一個時鐘週期,蛇移動一格,後一節身體的座標變成前一節身體的座標,蛇頭直接向前移動一格,一直畫一直畫	    for (int i = len - 1; i > 0; i--) {		snakex[i] = snakex[i - 1];		snakey[i] = snakey[i - 1];	    }	    
13、實現轉向
 if (fx == "R") {		snakex[0] = snakex[0] + 25;// 向右移動就橫座標加25		if (snakex[0] > 755)// 當向右運動超出邊界時,蛇死,遊戲結束		    Failed();	    } else if (fx == "L") {		snakex[0] = snakex[0] - 25;		if (snakex[0] < 5)		    Failed();	    } else if (fx == "U") {		snakey[0] = snakey[0] - 25;		if (snakey[0] < 35)		    Failed();	    } else if (fx == "D") {		snakey[0] = snakey[0] + 25;		if (snakey[0] > 535)		    Failed();	    }
13、新增食物,吃掉食物
 // 當蛇吃到食物時身體會變長	    if (snakex[0] == foodx && snakey[0] == foody) {		eat.loop(2);		foodx = 5 +25*rand.nextInt(30);// 食物被吃掉後繼續隨機生成		foody = 35 +25*rand.nextInt(21);// 21是用黑框寬度525除以每一格的寬度25得來的,算對很重要,不然執行起來會有毛病		len++;// 蛇身變長一節		score = score + 100;// 每吃掉一個食物,分數增加100	    }
14、遊戲結束功能

背景音樂停止播放遊戲結束音樂響起走不動了遊戲結束介面跳出

15、實現重新開始功能

本遊戲透過空格鍵控制遊戲的暫停和開始。如果遊戲尚未結束,按空格鍵可實現暫停;如果遊戲已經結束,按空格鍵可實現遊戲重新開始。

16、新增分數和長度
g.setColor(Color.white);// 設定畫筆字型顏色	g.setFont(new Font("華文行楷", Font.BOLD, 20));// 設定畫筆字型型別,加粗,大小	g.drawString("Len:" + len, 550, 24); // 在視窗右上角畫len字串	g.drawString("Score:" + score, 630, 24);// 畫Score字串
17、新增背景音樂18、讓背景音樂迴圈播放
bgm.loop(Clip.LOOP_CONTINUOUSLY);// 迴圈播放背景音樂
19、實現音樂播放和停止
 private void Failed() {	over.loop(1);// 遊戲結束時播放死亡音樂	bgm.stop();// 遊戲結束時使背景音樂暫停	isFailed = true;// 設定遊戲處於結束狀態    }
20、將原始碼匯出成可執行檔案(後面有空再補充)

(1)

(2)

(3)

找到該遊戲專案的主類找到該遊戲的主類 選擇匯出的目的地選擇Finish

(4)成功匯出到目的地

四、測試演示

1、影片連結:Java貪食蛇遊戲演示(因無法上傳影片只能提供影片連結和部分截圖了)

2、遊戲開始介面

3、有遊戲結束介面

18
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 國家對如日中天的電商巨頭給予當頭一棒說明了什麼?