Java 貪吃蛇報告_第1頁
Java 貪吃蛇報告_第2頁
Java 貪吃蛇報告_第3頁
Java 貪吃蛇報告_第4頁
Java 貪吃蛇報告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Java高級編程課程報告第xx小組:貪吃蛇游戲項目小組成員及分工姓名角色負(fù)責(zé)功能組長設(shè)計與編碼測試 主要完成模式選擇窗口和游戲主窗口菜單欄下拉菜單的設(shè)計與程序編寫,貪吃蛇游戲界面布局,游戲的操作步驟設(shè)計。程序的調(diào)試 主要完成游戲主窗口的設(shè)計與編程,設(shè)計貪吃蛇的移動方向鍵設(shè)置,得分規(guī)則等,以及最后程序的調(diào)試。 主要完成主菜單窗口的設(shè)計和程序編寫,界面的設(shè)計布局,游戲主窗口界面背景設(shè)置,按鈕的圖片設(shè)置等。一、 實驗環(huán)境操作系統(tǒng):Windows 7編程環(huán)境:Eclipse、JDK二、 實驗內(nèi)容與完成情況(主要介紹項目總體功能分析與說明。)貪吃蛇小游戲的JAVA程序是利用上 、下 、左、右 方向鍵來改

2、變蛇的運(yùn)動方向,按空鍵暫停游戲,按enter鍵重新開始。長按某個方向鍵后,蛇的運(yùn)動速度會加快,在隨機(jī)的地方產(chǎn)生食物,吃到食物就變成新的蛇體,碰到壁或自身則游戲結(jié)束,否則正常進(jìn)行游戲。以不同的速度和不同方向吃到食物所獲得的分?jǐn)?shù)也不相同。窗口功能說明:設(shè)計了三個窗口,分別是游戲主窗口,主菜單窗口,模式選擇窗口。 菜單欄分別為:游戲菜單(重新開始)和幫助菜單以及返回(返回主菜單) 。其中,按返回菜單按鈕后會顯示主菜單,其包括游戲開始、設(shè)置、退出游戲三項按鈕選擇;如果按“設(shè)置”按鈕會進(jìn)入“模式選擇”窗口。而模式選擇窗口菜單包括了初級、中級、高級、返回按鈕。1、功能1(主菜單窗口)(

3、1) 主菜單窗口主要是提供“游戲開始”、“設(shè)置”和“退出”按鈕。“游戲開始”按鈕按下后會進(jìn)入“游戲主窗口”開始游戲; “設(shè)置”按鈕是調(diào)用“模式選擇”窗口對游戲貪吃蛇的速度進(jìn)行設(shè)置; “退出”按鈕按下則會直接退出游戲。(2) 功能1實現(xiàn)的流程圖實現(xiàn)的效果圖如下:(3) 功能1(主菜單窗口)代碼:package Swing;import java.awt.Color;import java.awt.EventQueue;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.

4、ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;public class setMenu extends JFrame private int speed1 = 200;public static int speed = 200;/ static int s

5、peed = 20;private JPanel contentPane;/* * Launch the application. */public static void main(String args) EventQueue.invokeLater(new Runnable() public void run() try setMenu frame = new setMenu(speed);frame.SsetMenu(frame);frame.setVisible(true); catch (Exception e) e.printStackTrace(););/* * Create

6、the frame. */public setMenu(int speed2)speed1=speed2;System.out.println(speed2);public void SsetMenu(final setMenu frame) setTitle("主菜單");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 250, 350);contentPane = new JPanel();contentPane.setBackground(new Color(102, 204, 10

7、2);contentPane.setBorder(new EmptyBorder(5, 5, 5, 5);setContentPane(contentPane);contentPane.setLayout(null);/按鈕:游戲開始JButton NewGameButton = new JButton("");NewGameButton.setIcon(new ImageIcon("img/gamebegin.png");NewGameButton.setBounds(53, 52, 123, 40);NewGameButton.addActionLi

8、stener(new ActionListener() public void actionPerformed(ActionEvent e) Game gs = new Game(speed1);frame.dispose(););contentPane.add(NewGameButton);/按鈕:游戲設(shè)置JButton setButton = new JButton("");setButton.addMouseListener(new MouseAdapter() Overridepublic void mouseClicked(MouseEvent e) model

9、frame1 = new model();frame1.Mmodel(frame1);frame1.setVisible(true);frame.dispose(););/按鈕圖片設(shè)置setButton.setIcon(new ImageIcon("img/set.png");setButton.setBounds(53, 128, 123, 45);contentPane.add(setButton);/按鈕:游戲推出JButton exitButton= new JButton("");exitButton.setIcon(new ImageIcon

10、("img/exit.png");exitButton.setBounds(53, 206, 123, 40);exitButton.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0););contentPane.add(exitButton);2、功能2(模式選擇窗口)(1) 功能2的文字描述:“模式選擇”窗口菜單包括了初級、中級、高級、返回按鈕。其中當(dāng)選擇按下初級、中級、高級按鈕后,會彈出一個“游戲難度“窗口,并提示設(shè)置成功:*,

11、并按下”確定“按鈕后窗口關(guān)閉同時模式選擇成功,按下”返回“按鈕返回主菜單窗口。(2) 功能2(模式選擇窗口)實現(xiàn)的流程圖實現(xiàn)的效果圖如下:(3) 功能2(模式選擇窗口)代碼: package Swing;import java.awt.Color;import java.awt.EventQueue;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFr

12、ame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;public class setMenu extends JFrame private int speed1 = 200;public static int speed = 200;/ static int speed = 20;private JPanel contentPane;/* * Launch the applic

13、ation. */public static void main(String args) EventQueue.invokeLater(new Runnable() public void run() try setMenu frame = new setMenu(speed);frame.SsetMenu(frame);frame.setVisible(true); catch (Exception e) e.printStackTrace(););/* * Create the frame. */public setMenu(int speed2)speed1=speed2;System

14、.out.println(speed2);public void SsetMenu(final setMenu frame) setTitle("主菜單");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 250, 350);contentPane = new JPanel();contentPane.setBackground(new Color(102, 204, 102);contentPane.setBorder(new EmptyBorder(5, 5, 5, 5);setCon

15、tentPane(contentPane);contentPane.setLayout(null);/按鈕:游戲開始JButton NewGameButton = new JButton("");NewGameButton.setIcon(new ImageIcon("img/gamebegin.png");NewGameButton.setBounds(53, 52, 123, 40);NewGameButton.addActionListener(new ActionListener() public void actionPerformed(Act

16、ionEvent e) Game gs = new Game(speed1);frame.dispose(););contentPane.add(NewGameButton);/按鈕:游戲設(shè)置JButton setButton = new JButton("");setButton.addMouseListener(new MouseAdapter() Overridepublic void mouseClicked(MouseEvent e) model frame1 = new model();frame1.Mmodel(frame1);frame1.setVisibl

17、e(true);frame.dispose(););/按鈕圖片設(shè)置setButton.setIcon(new ImageIcon("img/set.png");setButton.setBounds(53, 128, 123, 45);contentPane.add(setButton);/按鈕:游戲推出JButton exitButton= new JButton("");exitButton.setIcon(new ImageIcon("img/exit.png");exitButton.setBounds(53, 206, 12

18、3, 40);exitButton.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0););contentPane.add(exitButton);3、 功能3(貪吃蛇游戲窗口)(1) 能3(貪吃蛇游戲窗口)文字描述:貪吃蛇游戲窗口界面包括蛇體與食物游戲區(qū)域,正上方有即時計分框(記錄目前所得的分?jǐn)?shù)),左上角有三個下拉菜單選項包括“菜單”下拉菜單,“幫助”菜單,“返回”菜單。點擊“菜單”菜單會出現(xiàn)下拉的“重新開始”選項同時也可以按下Enter鍵重新開始游戲

19、;點擊“幫助”菜單會出現(xiàn)“游戲說明”選項,點擊進(jìn)入后出現(xiàn)游戲幫助信息;點擊“返回”菜單則直接返回主菜單選擇窗口。貪吃蛇游戲窗口大小是固定的目的是確定并設(shè)置當(dāng)蛇體碰觸到邊框后提示游戲失敗的出框,在規(guī)定的窗口范圍內(nèi)蛇體可以通過按上 、下 、左、右 方向鍵控制其運(yùn)動方向;在吃到界面區(qū)域中出現(xiàn)的食物后蛇體會變長,而以不同的速度和運(yùn)動長度(UP和DOWN是偶數(shù),RIGHT和LEFT是奇數(shù))所得到的分?jǐn)?shù)也不一樣。按空鍵游戲暫停,按Enter鍵游戲重新開始。(2) 功能3現(xiàn)的流程圖:進(jìn)入游戲界面是否按下空鍵可以選擇界面左上角的菜單項鍵盤操作: 上移、 下移、左移、 右移沒有吃到食物且蛇碰到邊界或自身蛇體有吃

20、到食物且蛇沒碰到邊界或自身蛇體單擊“確定”游戲結(jié)束按照不同游戲速度和移動長度計分并顯示當(dāng)前所得分?jǐn)?shù),游戲繼續(xù)否是點擊”菜單”選項出現(xiàn)“重新開始”菜單點擊可以重新開始游戲點擊“幫助”菜單出現(xiàn)“游戲說明”選項點擊可以查看游戲說明點擊“返回”菜單直接返回“主菜單”窗口可以設(shè)置游戲速度和開始游戲或退出或按Enter鍵重新開始游戲(3) 功能3(貪吃蛇游戲窗口)代碼: package Swing;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Container;import java.awt.Dimension;im

21、port java.awt.Graphics;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.image.BufferedImage;import java.awt.

22、image.ImageObserver;import java.io.File;import java.io.IOException;import java.util.Arrays;import java.util.Iterator;import java.util.LinkedList;import java.util.Random;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuB

23、ar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;/Main Classpublic class Game extends KeyAdapter implements ImageObserver /初始速度int speed_all = 200;BufferedImage bgImage=null; JFrame mainFrame; JPanel jPanel; / Canvas paintCanvas; JLabel labelScore;/ 計分牌 SnakeM

24、odel snakeModel = null;/ 蛇 public static final int DEFAULT_WIDTH = 500; public static final int DEFAULT_HEIGHT = 400; public static final int nodeWidth = 10; public static final int nodeHeight = 10; private JMenuBar menuBar; private JMenu menu; private JMenuItem menuItem; private JMenuBar menuBar_1;

25、 private JMenu mnNewMenu; private JMenu mnNewMenu_1; private JMenuItem mntmNewMenuItem; private JMenuItem mntmNewMenuItem_1; private JMenu mnNewMenu_2; / GreedSnake():初始化游戲界面 public Game(int speed_gs) speed_all=speed_gs; System.out.println("Game:"+speed_all); / 設(shè)置界面元素 mainFrame = new JFram

26、e("貪吃蛇游戲"); Container cp = mainFrame.getContentPane(); aoao(mainFrame); jPanel = new JPanel(); jPanel.setPreferredSize(new Dimension(DEFAULT_WIDTH-10, DEFAULT_HEIGHT-10 );/500*390 / paintCanvas.setSize(DEFAULT_WIDTH + 20, DEFAULT_HEIGHT + 20); jPanel.addKeyListener(this); cp.add(jPanel, Bo

27、rderLayout.CENTER); / cp.add(paintCanvas, BorderLayout.CENTER); JPanel panelButtom = new JPanel(); panelButtom.setLayout(new BorderLayout(); cp.add(panelButtom, BorderLayout.SOUTH); /score labelScore = new JLabel("所得分?jǐn)?shù)為:", JLabel.CENTER); mainFrame.getContentPane().add(labelScore, BorderLa

28、yout.NORTH); mainFrame.addKeyListener(this); mainFrame.pack(); mainFrame.setResizable(false);/ 設(shè)置窗口大小不能變化 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setVisible(true); begin(); / keyPressed():按鍵檢測及菜單設(shè)置 public void aoao(final JFrame mainFrame) mainFrame.setJMenuBar(menuBar); m

29、enuBar_1 = new JMenuBar(); mainFrame.setJMenuBar(menuBar_1); mnNewMenu = new JMenu("菜單"); menuBar_1.add(mnNewMenu); mntmNewMenuItem = new JMenuItem("重新開始"); mntmNewMenuItem.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) Game gs = new Game(spe

30、ed_all); mainFrame.dispose(); ); mnNewMenu.add(mntmNewMenuItem); mnNewMenu_1 = new JMenu("幫助"); mnNewMenu_1.addMouseListener(new MouseAdapter() Override public void mouseClicked(MouseEvent e) snakeModel.changePauseState(); ); menuBar_1.add(mnNewMenu_1); mntmNewMenuItem_1 = new JMenuItem(&q

31、uot;游戲說明"); mntmNewMenuItem_1.addActionListener(new ActionListener() /游戲說明響應(yīng)時間 public void actionPerformed(ActionEvent arg0) JOptionPane.showMessageDialog(null, "按 控制方向,空格鍵暫停,Enter鍵重新開始", "游戲幫助", JOptionPane.INFORMATION_MESSAGE); ); mnNewMenu_1.add(mntmNewMenuItem_1); mnNewM

32、enu_2 = new JMenu("返回"); mnNewMenu_2.addMouseListener(new MouseAdapter() /連接主菜單 Override public void mouseClicked(MouseEvent arg0) setMenu frame123 = new setMenu(speed_all); frame123.SsetMenu(frame123); frame123.setVisible(true); mainFrame.dispose(); /System.out.println("123456")

33、; ); menuBar_1.add(mnNewMenu_2); /鍵盤響應(yīng)時間設(shè)置 public void keyPressed(KeyEvent e) int keyCode = e.getKeyCode(); if (snakeModel.running) switch (keyCode) case KeyEvent.VK_UP: snakeModel.changeDirection(SnakeModel.UP); break; case KeyEvent.VK_DOWN: snakeModel.changeDirection(SnakeModel.DOWN); break; case

34、KeyEvent.VK_LEFT: snakeModel.changeDirection(SnakeModel.LEFT); break; case KeyEvent.VK_RIGHT: snakeModel.changeDirection(SnakeModel.RIGHT); break; case KeyEvent.VK_ADD: case KeyEvent.VK_PAGE_UP: snakeModel.speedUp();/ 加速 break; case KeyEvent.VK_SUBTRACT: case KeyEvent.VK_PAGE_DOWN: snakeModel.speedD

35、own();/ 減速 break; case KeyEvent.VK_SPACE: case KeyEvent.VK_P: snakeModel.changePauseState();/ 暫?;蚶^續(xù) break; default: / 重新開始 if (keyCode = KeyEvent.VK_S | keyCode = KeyEvent.VK_ENTER) snakeModel.running = false; begin(); / repaint():繪制游戲界面(包括蛇和食物) void repaint() Graphics g = jPanel.getGraphics(); /dra

36、w background /g.drawImage(image, 210, 210, this); /g.setColor(Color.LIGHT_GRAY); try bgImage = ImageIO.read(new File("img/1.jpg"); /將緩沖圖片繪制到窗體中 catch(IOException e) e.printStackTrace(); g.drawImage(bgImage, 0, 0, this); / g.fillRect(10, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT); / draw the snake g

37、.setColor(Color.BLACK); LinkedList na = snakeModel.nodeArray; Iterator it = na.iterator(); while (it.hasNext() Node n = (Node) it.next(); drawNode(g, n); / draw the food g.setColor(Color.RED); Node n = snakeModel.food; drawNode(g, n); updateScore(); / drawNode():繪畫某一結(jié)點(蛇身或食物) private void drawNode(G

38、raphics g, Node n) g.fillRect(n.x * nodeWidth, n.y * nodeHeight, nodeWidth - 1, nodeHeight - 1); / updateScore():改變計分牌 public void updateScore() String s = "所得分?jǐn)?shù)為: " + snakeModel.score; labelScore.setText(s); / begin():游戲開始,放置貪吃蛇 void begin() if (snakeModel = null | !snakeModel.running) sn

39、akeModel = new SnakeModel(this, DEFAULT_WIDTH / nodeWidth, DEFAULT_HEIGHT / nodeHeight,speed_all); (new Thread(snakeModel).start(); / main():主函數(shù) public static void main(String args) Game gs = new Game(200); Overridepublic boolean imageUpdate(Image arg0, int arg1, int arg2, int arg3,int arg4, int arg

40、5) / TODO Auto-generated method stubreturn false;/ Node:結(jié)點類class Node int x; int y; Node(int x, int y) this.x = x; this.y = y; / SnakeModel:貪吃蛇模型class SnakeModel implements Runnable Game gs; boolean matrix;/ 界面數(shù)據(jù)保存在數(shù)組里 LinkedList nodeArray = new LinkedList(); Node food; int maxX;/ 最大寬度 int maxY;/ 最大

41、長度 int direction = 2;/ 方向 boolean running = false; int timeInterval = 200;/ 間隔時間(速度) double speedChangeRate = 0.75;/ 速度改變程度 boolean paused = false;/ 游戲狀態(tài) int score = 0; int countMove = 0; / UP和DOWN是偶數(shù),RIGHT和LEFT是奇數(shù) public static final int UP = 2; public static final int DOWN = 4; public static final

42、 int LEFT = 1; public static final int RIGHT = 3; / GreedModel():初始化界面 public SnakeModel(Game gs, int maxX, int maxY,int speed_snake) timeInterval = speed_snake;/速度 this.gs = gs; this.maxX = maxX; this.maxY = maxY; matrix = new booleanmaxX; for (int i = 0; i < maxX; +i) matrixi = new booleanmaxY;

43、 Arrays.fill(matrixi, false);/ 沒有蛇和食物的地區(qū)置false / 初始化貪吃蛇 int initArrayLength = maxX > 20 ? 10 : maxX / 2;/蛇頭位置,長度 /System.out.println(initArrayLength); for (int i = 0; i < initArrayLength; +i) int x = maxX / 2 + i; / System.out.println(x); int y = maxY / 2; / System.out.println(y); nodeArray.ad

44、dLast(new Node(x, y); matrixxy = true;/ 蛇身處置true food = createFood(); matrixfood.xfood.y = true;/ 食物處置true / changeDirection():改變運(yùn)動方向 public void changeDirection(int newDirection) if (direction % 2 != newDirection % 2) / 檢查方向沖突 direction = newDirection; / moveOn():貪吃蛇運(yùn)動函數(shù) public boolean moveOn() Nod

45、e n = (Node) nodeArray.getFirst();/獲取蛇頭的位置 int x = n.x; int y = n.y; / System.out.println(x); /System.out.println(y); switch (direction) case UP: y-; break; case DOWN: y+; break; case LEFT: x-; break; case RIGHT: x+; break; if (0 <= x && x < maxX) && (0 <= y && y <

46、; maxY) /System.out.println("asd"); if (matrixxy) / 吃到食物或者撞到身體 if (x = food.x && y = food.y) / 吃到食物 System.out.println("eat"); nodeArray.addFirst(food);/ 在頭部加上一結(jié)點 / 計分規(guī)則與移動長度和速度有關(guān) int scoreGet = (10000 - 200 * countMove) / timeInterval; score += scoreGet > 0 ? scoreGet

47、 : 10; countMove = 0; food = createFood(); matrixfood.xfood.y = true; return true; else return false;/ 撞到身體 else / 什么都沒有碰到 nodeArray.addFirst(new Node(x, y);/ 加上頭部 matrixxy = true; n = (Node) nodeArray.removeLast();/ 去掉尾部 matrixn.xn.y = false; countMove+; return true; return false;/ 越界(撞到墻壁) / run():貪吃蛇運(yùn)動線程 public void run() running = true; while (running) try Thread.sleep(timeInterval); catch (Exception e) break; if (!paused)

溫馨提示

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

最新文檔

評論

0/150

提交評論