java編寫的貪吃蛇游戲源碼_第1頁
java編寫的貪吃蛇游戲源碼_第2頁
java編寫的貪吃蛇游戲源碼_第3頁
java編寫的貪吃蛇游戲源碼_第4頁
java編寫的貪吃蛇游戲源碼_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、1、 函數(shù)程序結構圖 貪吃蛇 MapYardTextSnakePaintThreadNodeKeyMonitorFoodDirectionDrawMian函數(shù)paintScoreCheck.stopgetscoresetscoreprocessKeyDeadifTailaddDeltailHeadaddTailadd()Deltail()HeadadddrawmoveeatkeyPressedRunPauseRestartgo_onisPausesetPauseinstallDrawreAppeargetMsetMgetNsetNDrawKeypressed定義方向變量L,U,D,R 二、題目

2、分析通過分析該程序基本需要以下幾個類:Text(Main方法)、Snake(蛇)、Food(食物)、Yard(窗口)、Map(地圖)、Node(節(jié)點)、PaintThread(線程)、Dir(方向)、KeyMonitor(鍵盤監(jiān)聽)。主要實現(xiàn)蛇運動的基本操作和一些事件反應、游戲分數(shù)的記錄、暫停、重新開始、更改蛇蛇顏色,蛇的移動速度,地圖、死亡模式的改變等功能。本程序運用Java語言知識,用面向?qū)ο蟮乃季S設計“貪吃蛇”游戲。3、 結果分析運行程序出現(xiàn)游戲界面,蛇(Snake)頭自動向前移動,用鍵盤的上(Up)下(Down)左(Left)右(Right)鍵控制蛇頭的移動方向。游戲窗體中在隨機位置出

3、現(xiàn)紫色的食物(Food)。1、每吃一個加5分2、默認撞墻不死3、默認速度34、默認地圖15、默認普通蛇身6、默認30分提升一個速度檔次7、默認每個速度都走完后更換地圖并且速度恢復默認,積分歸零功能鍵:1、按F1重新開始2、按空格鍵暫停/繼續(xù)3、按1/2/3/4/5數(shù)字鍵設置蛇的移動速度(逐漸變快)4、按F2更換地圖(3種)5、按F3普通蛇/彩蛇的切換6、按F4更換游戲模式(蛇撞到最外圍為死亡還是從另一端返回)該程序初步完成了“貪吃蛇”的游戲雛形,但是缺乏完善。比如:界面效果十分粗糙、屏幕閃爍、缺少聲音等。但是,我們通過編寫貪吃蛇,能更好的運用面向?qū)ο蟮乃季S方式了,并學到了許多有用的經(jīng)驗。四、

4、附錄(程序清單)1、 Snake.javaimport java.awt.Color;import java.awt.Graphics;import java.awt.event.KeyEvent;public class Snake Node head = null;Node tail = null;int size = 0;Yard y;Node n = new Node(1, 2, Dir.D);public Snake(Yard y) head = n;tail = n;size = 1;this.y = y;for(int i=0;i<3;i+)this.Headadd();p

5、ublic void Tailadd() Node node = null;switch (tail.dir) case L :node = new Node(tail.m+1, tail.n, tail.dir);break;case U :node = new Node(tail.m, tail.n+1, tail.dir);break;case R :node = new Node(tail.m-1, tail.n, tail.dir);break;case D :node = new Node(tail.m, tail.n+1, tail.dir);break;tail.next =

6、node;node.pre = tail;tail = node;size +;public void Deltail() if (size = 0)return;tail = tail.pre;tail.next = null;public void Headadd() Node node = null;switch (head.dir) case L:node = new Node(head.m - 1, head.n, head.dir);break;case U:node = new Node(head.m, head.n - 1, head.dir);break;case R:nod

7、e = new Node(head.m + 1, head.n, head.dir);break;case D:node = new Node(head.m, head.n + 1, head.dir);break;node.next = head;head.pre = node;head = node;size+;public void draw(Graphics g) if (size <= 0)return;move();for (Node n = head; n != null; n = n.next) if(head=n)g.setColor(Color.BLUE);if(n.

8、dir=Dir.L|n.dir=Dir.R)g.fillOval(n.m*Yard.B_WIDTH, n.n*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH-3);elseg.fillOval(n.m*Yard.B_WIDTH, n.n*Yard.B_WIDTH, Yard.B_WIDTH-3, Yard.B_WIDTH);elsen.draw(g);public void Deadif() switch(Yard.STYLE)case 2:if (head.m < 0 | head.n < 30/Yard.B_WIDTH | head.m >

9、;= (Yard.WIDTH / Yard.B_WIDTH)| head.n >= (Yard.HEIGHT / Yard.B_WIDTH) y.stop();break;case 1:int cols = Yard.WIDTH / Yard.B_WIDTH;int rows = Yard.HEIGHT / Yard.B_WIDTH;if(head.m < 0) head.m = cols;else if (head.m >= cols) head.m = 0;else if (head.n < 30/Yard.B_WIDTH) head.n = rows;else i

10、f (head.n >= rows) head.n = 30/Yard.B_WIDTH;break;for (Node p = head.next; p != null; p = p.next) if (head.m = p.m && head.n = p.n) y.stop();switch (Yard.MAP) case 1:/地圖1break;case 2:/地圖2for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)if(head.m=j&&head.n=10)y.stop();for (i

11、nt j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)if(head.m=j&&head.n=20)y.stop();break;case 3:/地圖3for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)if(head.m=j&&head.n=10)y.stop();for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)if(head.m=j&&head.n=20)y.stop();f

12、or (int j = 20; j < 26; j +)if(head.m=Yard.WIDTH/Yard.B_WIDTH-10&&head.n=j)y.stop();for (int j = 5; j < 10; j +)if(head.m=10&&head.n=j)y.stop();break;default:break;void move() Yard.MOVECHECK = true;Headadd();Deltail();Deadif();public void eat(food e) if (y.f.getM() = y.s.head.m

13、 && y.f.getN() = y.s.head.n)e.reAppear();this.Tailadd();y.setscore(y.getscore() + 5);public void keyPressed(KeyEvent e) int key = e.getKeyCode();switch (key) case KeyEvent.VK_LEFT:if (head.dir != Dir.R)head.dir = Dir.L;break;case KeyEvent.VK_UP:if (head.dir != Dir.D)head.dir = Dir.U;break;ca

14、se KeyEvent.VK_RIGHT:if (head.dir != Dir.L)head.dir = Dir.R;break;case KeyEvent.VK_DOWN:if (head.dir != Dir.U)head.dir = Dir.D;break;2、 Food.javaimport java.awt.Color;import java.awt.Graphics;import java.util.Random;public class Food public static int FOODSTYLE = 1;private int m = r.nextInt(Yard.WID

15、TH / Yard.B_WIDTH);/ 橫格private int n = r.nextInt(Yard.HEIGHT / Yard.B_WIDTH - 30/Yard.B_WIDTH) + 30/Yard.B_WIDTH;/ 豎格public static Random r = new Random();public int getM() return m;public void setM(int m) this.m = m;public int getN() return n;public void setN(int n) this.n = n;public void reAppear(

16、) this.m = r.nextInt(Yard.WIDTH / Yard.B_WIDTH);this.n = r.nextInt(Yard.HEIGHT / Yard.B_WIDTH - 30/Yard.B_WIDTH) + 30/Yard.B_WIDTH;public void draw(Graphics g) switch (Yard.MAP) case 2:/地圖1for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)if(m=j&&n=10)this.reAppear();for (int j = 10; j

17、 < Yard.WIDTH/Yard.B_WIDTH-10; j +)if(m=j&&n=20)this.reAppear();break;case 3:/地圖2for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)if(m=j&&n=10)this.reAppear();for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)if(m=j&&n=20)this.reAppear();for (int j = 20; j <

18、; 26; j +)if(m=Yard.WIDTH/Yard.B_WIDTH-10&&n=j)this.reAppear();for (int j = 5; j < 10; j +)if(m=10&&n=j)this.reAppear();break;default:break;Color old = g.getColor();g.setColor(new Color(100, 13, 250);g.fillOval(m * Yard.B_WIDTH, n * Yard.B_WIDTH, Yard.B_WIDTH,Yard.B_WIDTH);g.setCo

19、lor(old);3、 Yard.javaimport java.awt.Color;import java.awt.Font;import java.awt.Frame;import java.awt.Graphics;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class Yard extends Frame public static final int WIDTH = 600;public static final

20、int HEIGHT = 480;public static final int B_WIDTH = 15;private int score = 0;public static int MAP =1;/地形public static int STYLE =1;/模式public static int SBODY =1;/蛇身顏色模式public static boolean MOVECHECK= true;PaintThread th = new PaintThread(this);private boolean gameover = false;public boolean isGameo

21、ver() return gameover;public void setGameover(boolean gameover) this.gameover = gameover;public Yard()Color c = new Color(0,166,0);this.setTitle("貪吃蛇");this.setLocation(200, 200);this.setSize(WIDTH, HEIGHT);this.setBackground(c);this.setResizable(false);this.setVisible(true);this.addWindow

22、Listener(new WindowAdapter() / 匿名的局部類Overridepublic void windowClosing(WindowEvent e) setVisible(false);System.exit(0););this.addKeyListener(new KeyMonitor();th.start();Food f = new Food();Snake s = new Snake(this);Overridepublic void paint(Graphics g) / 畫格Color old = g.getColor();Map.draw(g);f.draw

23、(g);/ 畫蛋s.draw(g);/ 畫蛇s.eat(f);g.setColor(Color.YELLOW);g.drawString("score:" + score, 10, 60);g.setFont(new Font("宋體", Font.BOLD, 50);if (gameover) g.setColor(Color.black);g.fillRect(0, 0, WIDTH, HEIGHT);g.setColor(Color.YELLOW);g.drawString("游戲結束!", 200, 180);g.setFon

24、t(new Font("宋體", Font.BOLD, 30);g.drawString("score:" + score, 10, 60);th.pause();g.setColor(old);this.ScoreCheck(g);public void ScoreCheck(Graphics g)if(score = 30) th.install(90);if(score =60) th.install(60);if(score = 90)th.install(120);MAP+;if(MAP = 4)g.setColor(Color.black);

25、g.fillRect(0, 0, WIDTH, HEIGHT);g.setColor(Color.YELLOW);g.drawString("恭喜你通全關了!", 130, 180);g.setFont(new Font("宋體", Font.BOLD, 30);g.drawString("score:" + score, 10, 60);th.pause();elseg.setColor(Color.black);g.fillRect(0, 0, WIDTH, HEIGHT);g.setColor(Color.YELLOW);g.d

26、rawString("恭喜你過關了!", 130, 180);g.drawString("下一關載入中.", 130, 280);g.setFont(new Font("宋體", Font.BOLD, 30);g.drawString("score:" + score, 10, 60);try th.sleep(3000); catch (InterruptedException e) e.printStackTrace();f.reAppear();th.reStart();public void stop()

27、gameover = true;public int getscore() return score;public void setscore(int i) score = i;public void processKey(int key, KeyEvent e) if(MOVECHECK)s.keyPressed(e);MOVECHECK = false;switch (key) case KeyEvent.VK_SPACE:if (!th.isPause()th.pause();elseth.go_on();break;case KeyEvent.VK_F1:th.reStart();br

28、eak;case KeyEvent.VK_1:th.install(300);break;case KeyEvent.VK_2:th.install(200);break;case KeyEvent.VK_3:th.install(120);break;case KeyEvent.VK_4:th.install(90);break;case KeyEvent.VK_5:th.install(50);break;case KeyEvent.VK_F2:MAP = MAP%3+1;f.reAppear();th.reStart();break;case KeyEvent.VK_F4:STYLE =

29、 STYLE%2+1;f.reAppear();th.reStart();break;case KeyEvent.VK_F3:SBODY = SBODY%2+1;break;default :break;4、 Map.javaimport java.awt.Color;import java.awt.Graphics;public class Map public static void draw(Graphics g)Color old = g.getColor();g.setColor(new Color(100, 0, 0);switch (Yard.MAP) case 1:/地圖1br

30、eak;case 2:/地圖2for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)g.fillRect(j*Yard.B_WIDTH, 10*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)g.fillRect(j*Yard.B_WIDTH, 20*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);break;case 3:/地圖3for (int j =

31、 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)g.fillRect(j*Yard.B_WIDTH, 10*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);for (int j = 10; j < Yard.WIDTH/Yard.B_WIDTH-10; j +)g.fillRect(j*Yard.B_WIDTH, 20*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);for (int j = 20; j < 26; j +)g.fillRect(Yard.WIDTH/Ya

32、rd.B_WIDTH-10)*Yard.B_WIDTH, j*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);for (int j = 5; j < 10; j +)g.fillRect(10*Yard.B_WIDTH, j*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);break;default :break;g.setColor(old);5、PaintThread.javaclass PaintThread extends Thread private boolean pause = false;privat

33、e int speed = 120;Yard y;public PaintThread(Yard y) this.y = y;public void go_on() this.pause = false;public boolean isPause() return pause;public void pause() this.pause = true;public void reStart() this.install(120);y.setscore(0);this.pause = false;y.s = new Snake(y);y.setGameover(false);public void install(int i) this.speed = i;Overri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論