




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java高级编程课程报告第xx小组:贪吃蛇游戏项目小组成员及分工姓名角色负责功能组长设计与编码测试 主要完成模式选择窗口和游戏主窗口菜单栏下拉菜单的设计与程序编写,贪吃蛇游戏界面布局,游戏的操作步骤设计。程序的调试 主要完成游戏主窗口的设计与编程,设计贪吃蛇的移动方向键设置,得分规则等,以及最后程序的调试。 主要完成主菜单窗口的设计和程序编写,界面的设计布局,游戏主窗口界面背景设置,按钮的图片设置等。一、 实验环境操作系统:Windows 7编程环境:Eclipse、JDK二、 实验内容与完成情况(主要介绍项目总体功能分析与说明。)贪吃蛇小游戏的JAVA程序是利用上 、下 、左、右 方向键来改变蛇的运动方向,按空键暂停游戏,按enter键重新开始。长按某个方向键后,蛇的运动速度会加快,在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常进行游戏。以不同的速度和不同方向吃到食物所获得的分数也不相同。窗口功能说明:设计了三个窗口,分别是游戏主窗口,主菜单窗口,模式选择窗口。菜单栏分别为:游戏菜单(重新开始)和帮助菜单以及返回(返回主菜单)。其中,按返回菜单按钮后会显示主菜单,其包括游戏开始、设置、退出游戏三项按钮选择;如果按“设置”按钮会进入“模式选择”窗口。而模式选择窗口菜单包括了初级、中级、高级、返回按钮。1、功能1(主菜单窗口)(1) 主菜单窗口主要是提供“游戏开始”、“设置”和“退出”按钮。“游戏开始”按钮按下后会进入“游戏主窗口”开始游戏; “设置”按钮是调用“模式选择”窗口对游戏贪吃蛇的速度进行设置; “退出”按钮按下则会直接退出游戏。(2) 功能1实现的流程图实现的效果图如下:(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.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 speed = 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 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, 102);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.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) Game gs = new Game(speed1);frame.dispose(););contentPane.add(NewGameButton);/按钮:游戏设置JButton setButton = new JButton();setButton.addMouseListener(new MouseAdapter() Overridepublic void mouseClicked(MouseEvent e) model frame1 = new model();frame1.Mmodel(frame1);frame1.setVisible(true);frame.dispose(););/按钮图片设置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, 123, 40);exitButton.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0););contentPane.add(exitButton);2、功能2(模式选择窗口)(1) 功能2的文字描述:“模式选择”窗口菜单包括了初级、中级、高级、返回按钮。其中当选择按下初级、中级、高级按钮后,会弹出一个“游戏难度“窗口,并提示设置成功:*,并按下”确定“按钮后窗口关闭同时模式选择成功,按下”返回“按钮返回主菜单窗口。(2) 功能2(模式选择窗口)实现的流程图实现的效果图如下: (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.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 speed = 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 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, 102);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.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) Game gs = new Game(speed1);frame.dispose(););contentPane.add(NewGameButton);/按钮:游戏设置JButton setButton = new JButton();setButton.addMouseListener(new MouseAdapter() Overridepublic void mouseClicked(MouseEvent e) model frame1 = new model();frame1.Mmodel(frame1);frame1.setVisible(true);frame.dispose(););/按钮图片设置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, 123, 40);exitButton.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0););contentPane.add(exitButton);3、 功能3(贪吃蛇游戏窗口)(1) 能3(贪吃蛇游戏窗口)文字描述:贪吃蛇游戏窗口界面包括蛇体与食物游戏区域,正上方有即时计分框(记录目前所得的分数),左上角有三个下拉菜单选项包括“菜单”下拉菜单,“帮助”菜单,“返回”菜单。点击“菜单”菜单会出现下拉的“重新开始”选项同时也可以按下Enter键重新开始游戏;点击“帮助”菜单会出现“游戏说明”选项,点击进入后出现游戏帮助信息;点击“返回”菜单则直接返回主菜单选择窗口。贪吃蛇游戏窗口大小是固定的目的是确定并设置当蛇体碰触到边框后提示游戏失败的出框,在规定的窗口范围内蛇体可以通过按上 、下 、左、右 方向键控制其运动方向;在吃到界面区域中出现的食物后蛇体会变长,而以不同的速度和运动长度(UP和DOWN是偶数,RIGHT和LEFT是奇数)所得到的分数也不一样。按空键游戏暂停,按Enter键游戏重新开始。(2) 功能3现的流程图:进入游戏界面是否按下空键可以选择界面左上角的菜单项键盘操作: 上移、 下移、左移、 右移没有吃到食物且蛇碰到边界或自身蛇体有吃到食物且蛇没碰到边界或自身蛇体单击“确定”游戏结束按照不同游戏速度和移动长度计分并显示当前所得分数,游戏继续否是点击”菜单”选项出现“重新开始”菜单点击可以重新开始游戏点击“帮助”菜单出现“游戏说明”选项点击可以查看游戏说明点击“返回”菜单直接返回“主菜单”窗口可以设置游戏速度和开始游戏或退出或按Enter键重新开始游戏(3) 功能3(贪吃蛇游戏窗口)代码: package Swing;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Container;import java.awt.Dimension;import 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.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.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel; /Main Class public class Game extends KeyAdapter implements ImageObserver /初始速度int speed_all = 200;BufferedImage bgImage=null; JFrame mainFrame; JPanel jPanel; / Canvas paintCanvas; JLabel labelScore;/ 计分牌 SnakeModel 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; 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); / 设置界面元素 mainFrame = new JFrame(贪吃蛇游戏); 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, BorderLayout.CENTER); / cp.add(paintCanvas, BorderLayout.CENTER); JPanel panelButtom = new JPanel(); panelButtom.setLayout(new BorderLayout(); cp.add(panelButtom, BorderLayout.SOUTH); /score labelScore = new JLabel(所得分数为:, JLabel.CENTER); mainFrame.getContentPane().add(labelScore, BorderLayout.NORTH); mainFrame.addKeyListener(this); mainFrame.pack(); mainFrame.setResizable(false);/ 设置窗口大小不能变化 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setVisible(true); begin(); / keyPressed():按键检测及菜单设置 public void aoao(final JFrame mainFrame) mainFrame.setJMenuBar(menuBar); menuBar_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(speed_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(游戏说明); mntmNewMenuItem_1.addActionListener(new ActionListener() /游戏说明响应时间 public void actionPerformed(ActionEvent arg0) JOptionPane.showMessageDialog(null, 按 控制方向,空格键暂停,Enter键重新开始, 游戏帮助, JOptionPane.INFORMATION_MESSAGE); ); mnNewMenu_1.add(mntmNewMenuItem_1); mnNewMenu_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); ); menuBar_1.add(mnNewMenu_2); /键盘响应时间设置 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 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.speedDown();/ 减速 break; case KeyEvent.VK_SPACE: case KeyEvent.VK_P: snakeModel.changePauseState();/ 暂停或继续 break; default: / 重新开始 if (keyCode = KeyEvent.VK_S | keyCode = KeyEvent.VK_ENTER) snakeModel.running = false; begin(); / repaint():绘制游戏界面(包括蛇和食物) void repaint() Graphics g = jPanel.getGraphics(); /draw 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.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():绘画某一结点(蛇身或食物) private void drawNode(Graphics g, Node n) g.fillRect(n.x * nodeWidth, n.y * nodeHeight, nodeWidth - 1, nodeHeight - 1); / updateScore():改变计分牌 public void updateScore() String s = 所得分数为: + snakeModel.score; labelScore.setText(s); / begin():游戏开始,放置贪吃蛇 void begin() if (snakeModel = null | !snakeModel.running) snakeModel = new SnakeModel(this, DEFAULT_WIDTH / nodeWidth, DEFAULT_HEIGHT / nodeHeight,speed_all); (new Thread(snakeModel).start(); / main():主函数 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 arg5) / TODO Auto-generated method stubreturn false;/ Node:结点类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;/ 界面数据保存在数组里 LinkedList nodeArray = new LinkedList(); Node food; int maxX;/ 最大宽度 int maxY;/ 最大长度 int direction = 2;/ 方向 boolean running = false; int timeInterval = 200;/ 间隔时间(速度) double speedChangeRate = 0.75;/ 速度改变程度 boolean paused = false;/ 游戏状态 int score = 0; int countMove = 0; / UP和DOWN是偶数,RIGHT和LEFT是奇数 public static final int UP = 2; public static final int DOWN = 4; public static final 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 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.addLast(new Node(x, y); matrixxy = true;/ 蛇身处置true food = createFood(); matrixfood.xfood.y = true;/ 食物处置true / changeDirection():改变运动方向 public void changeDirection(int newDirection) if (direction % 2 != newDirection % 2) / 检查方向冲突 direction = newDirection; / moveOn():贪吃蛇运动函数 public boolean moveOn() Node 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 0 ? scoreGet : 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():贪吃蛇运动线程 public vo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024中石油(上海)新材料研究院发布高层次人才招聘笔试参考题库附带答案详解
- 2025年江苏省徐州市铜山区中考一模道德与法治试题(原卷版+解析版)
- 2024北京一七一中初一(下)期中语文试题及答案
- 绿色旅游发展策略
- 立秋节气教育实施
- 2025合同授权委托书模板
- 行业数据:中国数字胰岛素冷藏箱市场现状研究分析与发展前景预测报告
- 慢病规范化管理
- 中国帕金森病治疗指南(第四版)
- 《半导体材料加工技术》课件
- 医疗美容病历模板范文
- 2018年四川省高考数学试卷(文科)(全国新课标Ⅲ)
- 前列腺增生患者的护理查房课件
- 2023年四川农信(农商行)招聘笔试真题
- 苏教版五年级下册数学期中考试试卷含答案
- 陕煤集团榆林化学有限责任公司招聘笔试题库2024
- 呼兰河传(2022年黑龙江牡丹江中考语文试卷记叙文阅读题及答案)
- 小学英语“教学评一体化”实施
- 人教版道德与法治三年级下册全册课件(完整版)
- 2024年中考英语作文热点主题:人工智能满分范文10篇精彩表达25句
- 2024Growatt 15000-25000UE古瑞瓦特光伏逆变器用户手册
评论
0/150
提交评论