下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java咼级编程课程报告第xx小组:贪吃蛇游戏项目小组成员及分工姓名角色负责功能组长设计与编码测试主要完成模式选择窗口和游戏主窗口菜单栏下拉菜单的设计与程序编写,贪吃蛇游戏界面布局, 游戏的操作步骤设计。程序的调试主要完成游戏主窗口的设计与编程, 设计贪吃蛇的移动方向键设置,得分规则等,以及最后程序的调试。主要完成主菜单窗口的设计和程序编 写,界面的设计布局,游戏主窗口界面 背景设置,按钮的图片设置等。一、实验环境操作系统:Win dows 7编程环境:Eclipse、JDK二、实验内容与完成情况(主要介绍项目总体功能分析与说明。)贪吃蛇小游戏的JAVA程序是利用上f、下J、左、右T方向键来改
2、变蛇的运动方向, 按空键暂停游戏,按enter键重新开始。长按某个方向键后,蛇的运动速度会加快,在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束, 否则正常进行游戏。 以不同的速度和不同方向吃到食物所获得的分数也不相同。窗口功能说明:设计了三个窗口,分别是游戏主窗口,主菜单窗口,模式选择窗口。菜单栏分别为:游戏菜单(重新开始)和帮助菜单以及返回(返回主菜单)。其中,按返回菜单按钮后会显示主菜单,其包括游戏开始、设置、退出游戏三项按钮选择;如果按“设置” 按钮会进入“模式选择”窗口。而模式选择窗口菜单包括了初级、中级、高级、返回按钮。1功能1(主菜单窗口)(1)主菜单窗口主要
3、是提供“游戏开始”、“设置”和“退出”按钮。“游戏开始”按钮按下后会进入“游戏主窗口”开始游戏;“设置”按钮是调用“模式选择”窗口对游戏贪吃蛇的速度进行设置;“退出”按钮按下则会直接退出游戏。(2)功能1实现的流程图?先确定主菜单窗口包括“游戏开始”、“设置” 和“退出”按钮。在窗口中三个按钮呈一列排 列并设置背景颜色按钮导入图片。?包括 1、java.awt 包中的 Color、EventQueue、 awt.eve nt.Action Eve nt;event.MouseAdapter、event.MouseEvent?2、javax.swing 包中的 Imagelcon、JButton
4、、JFrame JPanel、border.EmptyBorder。?setMe nu()菜单窗口框架设置; JPa nel con te ntPa ne()主菜单 面板设置;setBackground()背景设置;setBorder()设置窗口 边框宽度,间距;setLayout()设置用户界面上的屏幕组件的 格式布局;setIcon()设置按钮的图标;addActionListener()给 按钮添加事件监听;actionPeformed()接收操作事件的侦听 器接口; mouseClicked()添加鼠标点击事件。实现的效果图如下:、event.ActionListener、主窗口菜单设
5、置调用的函数包各部分功能实现的成员量、方法(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 .Im ageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.
6、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) Eve
7、ntQueue.invokeLater(new Runnable() public void run() try setMenu frame = new setMenu(speed);frame.SsetMenu(frame); frame.setVisible(true); catch (Exception e) e.printStackTrace(););setContentPane(contentPane);contentPane.setLayout(null);/按钮:游戏开始JButton NewGameButton = new JButton();NewGameButton.set
8、lcon(new lmagelcon(img/gamebegin.png);NewGameButton.setBounds(53, 52, 123, 40);NewGameButton.addActionListener(new ActionListener() 一 Create the frame.*/public setMenu(int speed2)speed1=speed2;System.out.println(speed2);public void SsetMenu(final setMenu frame) setTitle( 主菜单 );setDefaultCloseOperati
9、on(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);public void actionPerformed(ActionEvent e) Game gs = new Game(speed1);frame.dispose(););contentPane.add(NewGameButto
10、n);/按钮:游戏设置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.setlcon(new ImageIcon(img/set.png);setButton.setBound
11、s(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.ad
12、d(exitButton);2、功能2(模式选择窗口)(1) 功能2的文字描述:“模式选择” 窗口菜单包括了初级、 中级、高级、返回按钮。 其中当选择按下初级、 中级、高级按钮后,会弹出一个“游戏难度“窗口,并提示设置成功:*,并按下 确定“按钮后窗口关闭同时模式选择成功,按下”返回“按钮返回主菜单窗口。2) 功能2(模式选择窗口) 实现的流程图?先确定模式选择窗口包括“初级”、“中级”、“高级”和“返回”按钮。在窗口中四个按钮呈一列排列并设置窗口背景颜色与按钮导入图片。?1、定义模式的速度值 frame.Mmodel(frame);2、三个不同级别(速度)按钮设置:JButton btnNe
13、wButton_*= new JButton(*级);3、返回按钮设置JButton btnNewButton_3 = new JButton(”返回);.contentPane.add(btnNewButton);4、只要按下三个级别其中的一个按钮后添加鼠标点击监听事件调用JOptionPane.showMessageDialog()方法,弹岀”游戏难度“窗口提示游戏设置成功调用JOptionPane.showMessageDialog显示信息对话框。model extends JFrame()菜单窗口框架设置; JPanel contentPane() 主菜单面板设置;setBackgro
14、und()背景设置;(new Runnable(设置计算器可见)添加到 awt 的事件处理线程当中去 awt 的事件处理线程会按照队列的顺序依次调用每 个待处理的事件来运行;setBorder()设置窗口边框宽度,间距; setLayout() 设置用户界面上的屏幕组件的格式布局;setlcon()设置按钮的图标;addActionListener()给按钮添加事件监听;actionPerformed()接收操作事件的侦听器接口; mouseClicked()添加鼠标点击事件。实现的效果图如下:实现的成员变量,方法(3)功能2(模式选择窗口)代码:package Swing;import ja
15、va.awt.Color;import java.awt.Eve ntQueue;import java.awt.eve nt.Acti on Eve nt;import java.awt.eve nt.Actio nListe ner;import javax.sw ing.lm ageIc on;import javax.swi ng.JButt on;import javax.swi ng.JFrame;import javax.swi ng.JPa nel;import javax.swi ng.border.EmptyBorder;import java.awt.eve nt.Mou
16、seAdapter;import java.awt.eve nt.MouseEve nt;public class setMenu exte nds JFrame private int speed1 =200;public static int speed = 200;/ static int speed = 20;private JPa nel conten tPa ne* Lau nch the application.*/public staticEventQueue.publicvoid main(String args) invokeLater( new Runnable() vo
17、id run() trysetMenu frame =new setMenu( speed );frame.SsetMe nu(frame);frame.setVisible( true ); catch (Exception e) e.pri ntStackTrace(););/* Create the frame.*/publicsetMe nu(int speed2)speed1 =speed2;System. out .println(speed2);public void SsetMenu( finalsetMenu frame) setTitle( 主菜单);setDefaultC
18、loseOperati on (JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 250, 350);conten tPa ne = new JPa nel();con te ntPa ne .setBackgrou nd(new Color(102, 204,102);conten tPa ne .setBorder( new EmptyBorder(5, 5, 5, 5);setC onten tPa ne(conten tPa ne );contentPane .setLayout( null );/按钮:游戏开始JButton NewGameButto
19、n =new JButton( );NewGameButt on .setlc on(new ImageIc on(img/gamebegi n.pngNewGameButton.setBounds(53, 52, 123, 40);NewGameButt on .addActio nListe ner(new Acti on Liste ner() );public void acti on Performed(Acti on Eve nt e) Game gs_ = new Game( speedl );frame.dispose(););conten tPa ne .add(NewGam
20、eButt on);/按钮:游戏设置JButton setButton = new JButton( ); setButton.addMouseListener( new MouseAdapter() Override public void mouseClicked(MouseEvent e) model frame1 =new model();frame1.Mmodel(frame1); frame1.setVisible( true ); frame.dispose(););/ 按钮图片设置setButton.setIcon( new ImageIcon( img/set.png );
21、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
22、. exit (0);); contentPane .add(exitButton);3、 功能3(贪吃蛇游戏窗口)(1) 能3(贪吃蛇游戏窗口) 文字描述:贪吃蛇游戏窗口界面包括蛇体与食物游戏区域, 正上方有即时计分框 (记录目前所得的分 数),左上角有三个下拉菜单选项包括“菜单”下拉菜单,“帮助”菜单,“返回”菜单。点击“菜单”菜单会出现下拉的“重新开始”选项同时也可以按下Enter键重新开始游戏; 点击“帮助”菜单会出现“游戏说明”选项,点击进入后出现游戏帮助信息;点击“返回” 菜单则直接返回主菜单选择窗口。贪吃蛇游戏窗口大小是固定的目的是确定并设置当蛇体碰触到边框后提示游戏失败的出框,
23、在规定的窗口范围内蛇体可以通过按上f、下J、左J、右T方向键控制其运动方向;在吃到界面区域中出现的食物后蛇体会变长,而以不同的速度和运动长度(UP和DOWN是偶数,RIGHT和LEFT是奇数)所得到的分数也不一样。按空键游戏暂停,按Enter键游戏重新开始。(2) 功能3现的流程图:(3) 功能3(贪吃蛇游戏窗口) 代码:package Swing;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Container;import java.awt.Dimension;import java.awt.Graph
24、ics;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
25、;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.swi
26、ng.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;/ 计分牌SnakeModel snakeModel = null
27、;/蛇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
28、 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()
29、;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); JPane
30、l panelButtom = new JPanel();panelButtom.setLayout(new BorderLayout(); cp.add(panelButtom, BorderLayout.SOUTH);/scorelabelScore = new JLabel( 所得分数为 :, JLabel.CENTER); mainFrame.getContentPane().add(labelScore,BorderLayout.NORTH); mainFrame.addKeyListener(this);mainFrame.pack(); mainFrame.setResizabl
31、e(false);/ 设置窗口大小不能变化mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setVisible(true);begin();/ keyPressed():按键检测及菜单设置public void aoao(final JFrame mainFrame) mainFrame.setJMenuBar(menuBar); menuBar_1 = newJMenuBar(); mainFrame.setJMenuBar(menuBar_1); mnNewMenu = new JMenu(菜单 );m
32、enuBar_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.addMouseLis
33、tener(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.
34、showMessageDialog(null, 停, Enter 键重新开始 , 游戏帮助 , JOptionPane.INFORMATION_MESSAGE);); mnNewMenu_1.add(mntmNewMenuItem_1);mnNewMenu_2 = new JMenu( 返回 ); mnNewMenu_2.addMouseListener(new MouseAdapter() / 连接主菜单Overridepublic void mouseClicked(MouseEvent arg0) setMenu frame123 = new setMenu(speed_all);fra
35、me123.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(SnakeMo
36、del.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.spee
37、dUp();/ 加速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();/ rep
38、aint():绘制游戏界面(包括蛇和食物)void repaint() Graphics g = jPanel.getGraphics();/draw background /g.drawImage(image, 210, 210, this); /g.setColor(Color.LIGHT_GRAY);trybgImage = ImageIO.read(new File(img/1.jpg);/ 将缓冲图片绘制到窗体中 catch(IOException e) e.printStackTrace(); g.drawImage(bgImage, 0, 0, this);/ g.fillRec
39、t(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);按Tf控制方向,空格键暂/ draw the food g.setColor(Color.RED);Node n = snakeModel.food; drawNode(g, n);
40、updateScore();/ drawNode():绘画某一结点(蛇身或食物)private void drawNode(Graphics g, Node n) g.fillRect(n.x * nodeWidth, n.y * nodeHeight, nodeWidth - - 1);/ updateScore():改变计分牌public void updateScore() String s = 所得分数为 : + snakeModel.score;labelScore.setText(s);/ begin():游戏开始,放置贪吃蛇void begin() if (snakeModel
41、= 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); Override public boolean imageUpdate(Image arg0, int arg1, int arg
42、2, int arg3,1, nodeHeightint arg4, int arg5) / TODO Auto-generated method stub return 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();N
43、ode 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
44、 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) t imeInterval = speed_snake;/速度this.gs = gs;this.maxX = maxX;this.maxY = maxY;matrix = new booleanmaxX;for (int i = 0; i 20 ? 10 : maxX / 2;
45、/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;/ 蛇身处置 truefood = createFood();matrixfood.xfood.y = true;/ 食物处置 true/ changeDir
46、ection(): 改变运动方向 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); swit
47、ch (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; elsereturn false;/ 撞到身体 else /什么都没有碰到nodeArray.addFirst(new Node
48、(x, y);/加上头部matrixxy = true;n = (Node) nodeArray.removeLast();/去掉尾部matrixn.xn.y = false;countMove+;return true;return false;/ 越界(撞到墙壁)/ run():贪吃蛇运动线程public void run() running = true;while (running) try Thread.sleep(timeInterval); catch (Exception e) break;if (!paused) if (moveOn() /未结束gs.repaint(); else / 游戏结束JOptionPane.showMessageDialog(null, GAME OVER, Game Over,JOptionPane.INFORMATION_MESSAGE);break;running = false;/ createFood():生成食物及放置地点private Node createFood() int x = 0;int y = 0;do Random r = new Random();x = r.nextInt(maxX);y = r.nextInt(maxY); while (m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 印度AI发展现状
- 中西医结合护理的护理创新
- 职业病诊断鉴定管理办法
- 测土配方施肥服务技术规范
- 烟粉虱药剂防治操作规范
- 肉牛羊越冬保膘饲料配制方案
- 客户节假日关怀问候作业方案
- 室内高空玻璃清洁作业操作标准
- 生产装置危险化学品泄漏预案
- 水稻侧深施肥技术集成应用指南
- 无人驾驶技术商业化应用风险评估与可行性分析报告
- 2024年上海建桥学院公开招聘辅导员笔试题含答案
- 企业信息安全培训内容课件
- 2025年甘肃高考物理试题+答案
- 碳四加氢催化剂培训课件
- 皮带胶接培训课件
- 2025年银行考试-中信银行运营管理资质认证考试历年参考题库含答案解析(5套典型考题)
- 林蛙驯养管理办法
- 银行走访管理办法
- 设备巡检标准流程与实施要点
- 数学-第十一章 不等式与不等式组单元测试卷 2024-2025学年人教版数学七年级下册
评论
0/150
提交评论