java火柴游戏课程设计报告

班级学号1303050208 计算机科学与技术 课程设计题目 小游戏 组长签字:成绩 日期 2015 年12 月29 计算机科学与技术学生姓名 班级学号1303050208 课程设计题目 小游戏 实践教学要求与任务: 任务:程序随机产生20—50 根火柴,由人与计算机轮流拿,每次拿的数量不超过 根,拿到最后一根为胜。www.8153.com_【官方首页】-金沙娱乐城(使用图形界面)要求:1.在java 兼容环境完成上述题目的代码编写与调试; 2.程序运行界面交互性好; 3.软件运行,给出测试数据。 工作计划与进度安排: 课程实训设计(二)设计时间安排在教学第15 周内完成,按上述题目要求完成 查阅资料、程序设计、调试、运行等工作。 时间安排如下: 1、查阅资料、与初步设计;1-2 指导教师:2014 年12 月12 专业负责人:2014 年12 月12 学院教学副院长:2014 年12 月12 需求分析1.1 设计要求„„„„„„„„„„„„„„„„„„1 1.2 技术原理„„„„„„„„„„„„„„„„„„1 详细设计3.1 程序类„„„„„„„„„„„„„„„„„„„2 3.2 主要代码„„„„„„„„„„„„„„„„„„2 四、测试„„„„„„„„„„„„„„„„„„„„„„10 五、收获和体会„„„„„„„„„„„„„„„„„„„12 六、参考文献„„„„„„„„„„„„„„„„„12 需求分析1.1 设计要求 程序随机产生 20—50 根火柴,由人与计算机轮流拿,每次拿的数量不超过 根,拿到最后一根为胜。(使用图形界面)1.2 技术原理 该游戏程序设计的主要内容是使用java 中的各种组件与容器互相搭配来完 成的一个小游戏。www.8153.com_【官方首页】-金沙娱乐城 游戏设计中的主要的知识要点包括java 的awt 包中的颜色类,图形类,图 像类,事件监听器类,和 util stack类,timer 使用方法,以及swing包中的窗口类,按钮类,标签类,面板类,复选框类等一 些常用组件的用法。 通过这些组件来掌握事件监听器的用法,java 中栈的用法,以及实现了 Runnable 类的TimerTask 类的用法,通过这个类实现线程技术,还有Graphics 类中的主要方法的使用,学会运用这些方法来来绘制火柴,绘制图片的目的。 概要设计1.设置随机数的范围 2.获取随机数 3.设计出人性化的图形界面 4.给予不同的提示完成游戏 详细设计3.1 程序类 图3.1 程序类 3.2 主要代码 import java.awt.Color;//引入颜色类 import java.awt.Component;//引入组件类 import java.awt.Dimension;//引入封装单个对象中组件的宽度和高度(精确到整数)的类 import java.awt.Graphics;//引入图形类 import java.awt.Graphics2D;//引入二维图形类 import java.awt.event.ActionEvent;//引入事件类 import java.awt.event.ActionListener;//引入事件监听器类 import java.awt.image.BufferedImage;//引入缓冲图像类 import java.util.Stack;//引入栈类 import java.util.Timer;//引入计时器类 import java.util.TimerTask;//引入了实现Runnable接口的类,并具有了线程的功能 import javax.swing.JButton;//引入按钮类 import javax.swing.JComboBox;//引入下拉列表框类 import javax.swing.JFrame;//引入主框架主窗口类 import javax.swing.JLabel;//引入标签类 import javax.swing.JOptionPane;//引入选项面板类 import javax.swing.JPanel;//引入面板类 public class ha//定义一个公共的主类Test publicstatic void main(String[] args)//定义主方法main newha();//调用Test类的构造方法Test() privatestatic final int MIN_CNT 20;//定义一个常量,设置为最小火柴棍数量为20 private static final int MAX_CNT 50;//定义一个常量,设置为最大火柴棍数量为50 private static final int MAX_TAKE privatestatic final int DELAY 1000;//定义一个常量,设置为延迟时间为1000private JFrame mainFrame;//定义主框架变量 private MyPaintPanel[] paints;//定义我自己画的面板数组变量 private JButton userBtn;//定义我的按钮属性 private JComboBox userNum;//定义我的下拉列表 private JButton compBtn;//定义电脑按钮属性 private JLabel compTxt;//定义电脑标签 private Timer timer;//定义计时器的变量 private ha()//定义一个私有的构造方法,来完成游戏的初始化动作 newJFrame();//实例化一个主窗口 mainFrame.setResizable(false);//设置窗体大小不可调整 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认 的关闭操作为关闭窗口 JPanel mainPanel newJPanel();//实例化一个主面板对象 mainPanel.setLayout(null);//设置布局为空,即没有任何布局 mainPanel.setPreferredSize(new Dimension(600, 400));//将组件的首选大小 设置为常量值 mainFrame.add(mainPanel);//将主面板添加到框架(窗口)中 JLabel lab11 newJLabel("电脑");//创建并设置标签按钮的内容为电脑 lab11.setHorizontalAlignment(JLabel.CENTER);//设置标签内容沿 齐方式lab11.setBounds(0, 10, 200, 20);//设置该标签显示位置为坐标(0,10),宽 200,高20 mainPanel.add(lab11);//将标签加入主面板 JButton btn11 newJButton("Reset");//定义一个重新来的按钮 btn11.addActionListener(new ActionListener()//为“Reset”添加行为事件监 听器,采用匿名类的方式 @Overridepublic void actionPerformed(ActionEvent e)//实现监听器中的方法 btn11.setBounds(250,10, 100, 20);//设置重置按钮的位置,左上角坐标为(250, 10),大小为宽100,高20 mainPanel.add(btn11);//重来标签添加到主面板上 JLabel lab12 newJLabel("用户");//定义用户标签 lab12.setHorizontalAlignment(JLabel.CENTER);//设置用户水平方式为居中 lab12.setBounds(400, 10, 200, 20);//设置用户标签的位置,左上角坐标为 (400,10),大小为宽200,高20 mainPanel.add(lab12);//将用户标签添加到主面板上 compBtn newJButton("Computer First");//定义一个电脑首先拿的按钮 compBtn.addActionListener(new ActionListener()//为电脑开始按钮定义行为 事件监听器 @Overridepublic void actionPerformed(ActionEvent e)//行为监听器中的默认方法 compBtn.setBounds(10,40, 180, 20);//设置电脑按钮的位置,左上角坐标为(10, 40),大小为宽180,高20 mainPanel.add(compBtn);//按钮添加到主面板上 compTxt newJLabel();//定义一个空标签 compTxt.setBounds(10, 70, 400, 20);//设置空标签的位置,左上角坐标为(10, 70),大小为宽400,高20 mainPanel.add(compTxt);//将空标签加到主面板上 userBtn newJButton("Take");//定义用户拿按钮 userBtn.addActionListener(new ActionListener()//为用户按钮定义行为事件 监听器 @Overridepublic void actionPerformed(ActionEvent userBtn.setBounds(400,40, 90, 20);//设置用户拿按钮的位置,左上角的坐标 为(400,40),大小为宽90,高20 mainPanel.add(userBtn);//用户按钮添加到主面板上 userNum newJComboBox();//定义一个下拉列表框 MAX_TAKE;i++)//定义一个拿最大的循环 userNum.setBounds(495,40, 90, 20);//设置下拉列表框中的位置,左上角的坐 标为(495,40),大小为宽90,高20 mainPanel.add(userNum);//将列表框添加到主面板上 paints newMyPaintPanel[3];//定义我画的面板 newMyPaintPanel();//分别创建3个面板,并调用构造方法初始 化三个面板 paints[i].setBounds(5 110,190, 285);//设置三个面板的位 置和坐标,间距为5 mainPanel.add(paints[i]);//将三个面板分别添加到主面板上 mainFrame.pack();//调整此窗口的大小,以适合其子组件的首选大小和布局。mainFrame.setVisible(true);//设置当前主窗口的可见性 init();//调用初始化方法 privatevoid init()//定义初始化的方法 newTimer();//实例化一个计时器的对象 compTxt.setText("");//设置空标签的文本为空 compBtn.setEnabled(true);//设置是否启用电脑按钮组件,即电脑组件可用 userBtn.setEnabled(true);//设置是否启用用户按钮组件,即用户组件可用 paints[0].reset();//调用重置方法,来重新定义第一块面板 paints[1].reset();//调用重置方法,来重新定义第二块面板 paints[2].reset();//调用重置方法,来重新定义第三块面板 int num (int)((MAX_CNT Math.random());//随机产生一个大于20小于50的数 num;i++)//分别用for循环添加面板 privatevoid userTake()//定义一个用户拿火柴棒的方法 compBtn.setEnabled(false);//设置按钮不可用int takeCnt intrel paints[1].getCnt();//将自定义的第二个面板中的火柴棍的数量赋给rel rel)//如果用户拿火柴棍的数量比面板中的数量大的话,执行下面的语句 onlymachines“的对话框 return; takeCnt;i++)//定义一个将第二块面板中的火柴棍的数量 移动到用户面板的循环 intindex paints[1].remove();//将第二个面板要移除的火柴棍的数量给index变量 paints[2].add(index);//将index的值添加到用户拿的面板上 JOptionPane.showMessageDialog(mainFrame,"You winner.");//显示”你胜利的对话框“ init();//并重新初始化 privatevoid compTake()//定义电脑拿的方法 compBtn.setEnabled(false);//设置电脑按钮的当前状态为不可用userBtn.setEnabled(false);//设置用户按钮的当前状态为不可用 MyTask task newMyTask();//实例化一个MyTask的对象 timer.schedule(task, DELAY);// 执行线程,安排在指定延迟1秒后执行指定的任 privateclass MyTask extends TimerTask //定义一个继承了实现Runnable接口的 类使自己也具有线程功能 @Overridepublic void run()//因为TimerTask实现了Runnable接口,重写父类的run方法 intrel paints[1].getCnt();//将火柴棍面板中的火柴的数量赋给relint takeCnt MAX_TAKE)//如果当前火柴棍的数量比最大拿火柴的数量小的话,执行下面的语句 0)//如果面板中的火柴棍的数量对4取余大于0的话执行下面的语句 1);//将面板中的火柴的数量对4取余之后赋给电脑要拿的火柴的数量 else//否则面板中的火柴棍的数量对4取余小于或等于0的话执行下面的语句 (int)(MAX_TAKE Math.random());//随机产生一个小于4的数,给电脑要拿的数量 intindex paints[1].remove();//将火柴面板中的火柴移除并赋给index paints[0].add(index);//将移除的火柴添加到电脑拿的面板上 compTxt.setText("Computertakes JOptionPane.showMessageDialog(mainFrame,//显示信息对话框提 示电脑胜利了! "Computer winner.");init();//并重新初始化 @SuppressWarnings("serial")private class MyPaintPanel extends Component //定义一个自定义的面板类并继承 了组件类 privateBufferedImage bimg;//创建一个BufferedImage的变量bimg private Stack data;//定义一个私有的栈类型的变量data private MyPaintPanel()//构造我的初始面板的方法 newBufferedImage(190, 285, BufferedImage.TYPE_3BYTE_BGR);//表示一个具有 RGB颜色分量的图像, Graphics2D g2 bimg.createGraphics();//创建一个Graphics2D,并将 它绘制到此 BufferedImage g2.setColor(Color.WHITE);//设置要画的颜色,即面板的颜色g2.fillRect(0, 190,285);//在坐标(0,0)处画一个大小为宽190,高 为285的白色矩形区域 g2.dispose();//释放此图形的上下文以及它使用的所有系统资源。www.8153.com_【官方首页】-金沙娱乐城调用 dispose 之后,就不能再使用 Graphics 对象。 data newStack();//在此面板中实例化一个具体的栈的对象 publicvoid paint(Graphics g)//定义画图形的默认方法 null);//从坐标(0,0)出开始画图片g.dispose();//释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象。www.8153.com_【官方首页】-金沙娱乐城 privatevoid add(int num)//添加火柴棍的方法 Graphics2Dg2 bimg.createGraphics();//创建一个Graphics2D,并将 它绘制到此 BufferedImage intloc data.size();//将当前栈的大小赋给变量loc//System.out.println("当前栈为"+data.size()); int offX 65;//动态的坐标int offY 15;//动态的坐标g2.setColor(Color.YELLOW);//设置火柴棒的颜色为黄色 g2.fillRect(offX 50,6);//填充火柴棒的颜色区域 g2.setColor(Color.GREEN);//设置火柴棒头的颜色为绿色 g2.fillArc(offX 50,offY 10,10, 360);//设置火柴棒头的坐标,大小为宽和高为10的360度的弧 g2.setColor(Color.BLACK);//设置当前火柴棒的根数的颜色 g2.drawString(String.valueOf(num), offX, offY g2.getFont().getSize());//画出数字data.push(num);//把数字1压入堆栈顶部 repaint();//重画 g2.dispose();//释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics对象 privateint remove()//定义一个移除火柴棍的方法 Graphics2Dg2 bimg.createGraphics();//创建一个Graphics2D,并将 它绘制到此 BufferedImage intloc 1;//将当前栈的大小即火柴棍的数量减1//System.out.println("当前栈为"+data.size()); int offX 65;//动态的获取坐标int offY 15;//动态的获取坐标g2.setColor(Color.WHITE);//设置移除填充颜色为白色 g2.fillRect(offX, offY, 60, 15);//画出移除火柴棍的位置 g2.dispose();//释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象 repaint();//调用重新画的方法 return data.pop();//移除堆栈顶部的对象,并作为此函数的值返回该对象。 privatevoid reset()//定义一个重置的方法 data.clear();//清楚该面板栈中的内容Graphics2D g2 bimg.createGraphics();//创建一个Graphics2D,并将 它绘制到此 BufferedImage g2.setColor(Color.WHITE);//设置颜色为白色g2.fillRect(0, 190,285);//在坐标为(0,0)处填充大小为190,285的 矩形区域 g2.dispose();//释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象。 repaint();//重绘此组件。 privateint getCnt()//定义一个返回第二个面板火柴棍的数量 returndata.size();//返回当前栈中的火柴棍数量 测试图4.1 运行界面 具体步骤 1.如果是电脑先拿先单击Computer First 按钮,电脑随机拿走几根火柴,并在 电脑按钮下方显示“Computer takes *matches time”提示信息,单击之后电脑拿走的按钮被禁用,直到用户单击自己的按钮之后才能再拿。 图4.2 电脑先运行界面 2.之后用户单击自己的 Take 按钮,根据自己的情况拿相应的火柴数,比如说 用户拿三根火柴。 图4.3 用户执行运行界面 3.可以看到用户根据自己的需要拿了三根火柴,之后电脑又拿了一根,如此循 环,直到哪一方赢得比赛的胜利。从下图中可以看到电脑赢得了比赛的胜利。 图4.4 比赛结果显示界面 收获和体会在本次的课程设计中,我遇到了很多问题,也学会了很多东西。比如 Graphics 的绘图方法的问题,如何绘制曲线,如何绘制直线,如何绘制矩形, 如何绘制圆形等一些基本图形的绘制,经过自己与同学的讨论,学会了图形类的 使用方法。还有浏览器中不能显示Applet 程序使由于缺少某种插件等等。www.8153.com_【官方首页】-金沙娱乐城但是 随着这些问题的解决,我也从中学习到了新知识,感觉付出是值得的。 参考文献[1]c#参考实例 王军 编著 清华大学出版社 2011 编著电子工业出版社 2010

暂无简介

文档格式:
.docx
文档页数:
15页
文档大小:
284.56K
文档热度:
文档分类:
IT计算机 --  Java
文档标签:
火柴 游戏 java 监听器 课程 设计

更多>> 相关文档

页面底部区域 foot.htm