_java火柴游戏课程设计报告[1]

  • 格式:docx
  • 大小:275.09 KB
  • 文档页数:15

JAVA课程设计题目小游戏班级网络工程11-1学号201101050627姓名尹燕军指导老师赵建立目录一、需求分析1.1概述1.2技术原理二、概要设计三、详细设计3.1程序类3.2主要代码四、测试五、心得体会一、需求分析1.1概述程序随机产生20—50根火柴,由人与计算机轮流拿,每次拿的数量不超过3根,拿到最后一根为胜。

(使用图形界面)1.2技术原理该游戏程序设计的主要内容是使用java中的各种组件与容器互相搭配来完成的一个小游戏。

游戏设计中的主要的知识要点包括java的awt包中的颜色类,图形类,图像类,事件监听器类,和util包中的stack类,timer类,和timertask类的使用方法,以及swing包中的窗口类,按钮类,标签类,面板类,复选框类等一些常用组件的用法。

通过这些组件来掌握事件监听器的用法,java中栈的用法,以及实现了Runnable类的TimerTask类的用法,通过这个类实现线程技术,还有Graphics类中的主要方法的使用,学会运用这些方法来来绘制火柴,绘制图片的目的。

二、概要设计●设置随机数的范围●获取随机数●设计出人性化的图形界面●给予不同的提示完成游戏三、详细设计3.1程序类3.2主要代码import java.awt.Color;//引入颜色类import ponent;//引入组件类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;//引入面板类publicclass ha//定义一个公共的主类Test{publicstaticvoid main(String[] args)//定义主方法main{new ha();//调用Test类的构造方法Test()}privatestaticfinalint MIN_CNT = 20;//定义一个常量,设置为最小火柴棍数量为20 privatestaticfinalint MAX_CNT = 50;//定义一个常量,设置为最大火柴棍数量为50 privatestaticfinalint MAX_TAKE = 3;//定义一个常量,设置为最大拿火柴数量为3 privatestaticfinalint 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()//定义一个私有的构造方法,来完成游戏的初始化动作{mainFrame = new JFrame();//实例化一个主窗口mainFrame.setResizable(false);//设置窗体大小不可调整mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认的关闭操作为关闭窗口JPanel mainPanel = new JPanel();//实例化一个主面板对象mainPanel.setLayout(null);//设置布局为空,即没有任何布局mainPanel.setPreferredSize(new Dimension(600, 400));//将组件的首选大小设置为常量值mainFrame.add(mainPanel);//将主面板添加到框架(窗口)中JLabel lab11 = new JLabel("电脑");//创建并设置标签按钮的内容为电脑lab11.setHorizontalAlignment(JLabel.CENTER);//设置标签内容沿 X 轴的对齐方式lab11.setBounds(0, 10, 200, 20);//设置该标签显示位置为坐标(0,10),宽200,高20mainPanel.add(lab11);//将标签加入主面板JButton btn11 = new JButton("Reset");//定义一个重新来的按钮btn11.addActionListener(new ActionListener()//为“Reset”添加行为事件监听器,采用匿名类的方式{@Overridepublicvoid actionPerformed(ActionEvent e)//实现监听器中的方法{init();//当单击此按钮时,调用该初始化方法}});btn11.setBounds(250, 10, 100, 20);//设置重置按钮的位置,左上角坐标为(250,10),大小为宽100,高20mainPanel.add(btn11);//重来标签添加到主面板上JLabel lab12 = new JLabel("用户");//定义用户标签lab12.setHorizontalAlignment(JLabel.CENTER);//设置用户水平方式为居中lab12.setBounds(400, 10, 200, 20);//设置用户标签的位置,左上角坐标为(400,10),大小为宽200,高20mainPanel.add(lab12);//将用户标签添加到主面板上compBtn = new JButton("Computer First");//定义一个电脑首先拿的按钮compBtn.addActionListener(new ActionListener()//为电脑开始按钮定义行为事件监听器{@Overridepublicvoid actionPerformed(ActionEvent e)//行为监听器中的默认方法{compTake();//当单击电脑按钮时,调用电脑拿方法}});compBtn.setBounds(10, 40, 180, 20);//设置电脑按钮的位置,左上角坐标为(10,40),大小为宽180,高20mainPanel.add(compBtn);//按钮添加到主面板上compTxt = new JLabel();//定义一个空标签compTxt.setBounds(10, 70, 400, 20);//设置空标签的位置,左上角坐标为(10,70),大小为宽400,高20mainPanel.add(compTxt);//将空标签加到主面板上userBtn = new JButton("Take");//定义用户拿按钮userBtn.addActionListener(new ActionListener()//为用户按钮定义行为事件监听器{@Overridepublicvoid actionPerformed(ActionEvent e){userTake();//当单击用户拿按钮时,调用用户拿方法}});userBtn.setBounds(400, 40, 90, 20);//设置用户拿按钮的位置,左上角的坐标为(400,40),大小为宽90,高20mainPanel.add(userBtn);//用户按钮添加到主面板上userNum = new JComboBox();//定义一个下拉列表框for (int i = 0; i <MAX_TAKE; i++)//定义一个拿最大的循环{userNum.addItem(i + 1);//通过循环给列表框逐个添加选项}userNum.setBounds(495, 40, 90, 20);//设置下拉列表框中的位置,左上角的坐标为(495,40),大小为宽90,高20mainPanel.add(userNum);//将列表框添加到主面板上paints = new MyPaintPanel[3];//定义我画的面板for (int i = 0; i < 3; i++)//用3次循环来画出三个面板{paints[i] = new MyPaintPanel();//分别创建3个面板,并调用构造方法初始化三个面板paints[i].setBounds(5 + 200 * i, 110, 190, 285);//设置三个面板的位置和坐标,间距为5mainPanel.add(paints[i]);//将三个面板分别添加到主面板上}mainFrame.pack();//调整此窗口的大小,以适合其子组件的首选大小和布局。

mainFrame.setVisible(true);//设置当前主窗口的可见性init();//调用初始化方法}privatevoid init()//定义初始化的方法{if (timer != null)//如果计时器不为空的话就执行下面的语句{timer.cancel();//快速终止计时器的任务执行线程}timer = new Timer();//实例化一个计时器的对象compTxt.setText("");//设置空标签的文本为空compBtn.setEnabled(true);//设置是否启用电脑按钮组件,即电脑组件可用userBtn.setEnabled(true);//设置是否启用用户按钮组件,即用户组件可用paints[0].reset();//调用重置方法,来重新定义第一块面板paints[1].reset();//调用重置方法,来重新定义第二块面板paints[2].reset();//调用重置方法,来重新定义第三块面板int num = MIN_CNT + (int) ((MAX_CNT + 1 - MIN_CNT) * Math.random());//随机产生一个大于20小于50的数for (int i = 0; i < num; i++)//分别用for循环添加面板{paints[1].add(i + 1);//分别将产生的随机数添加到第二块面板}}privatevoid userTake()//定义一个用户拿火柴棒的方法{compBtn.setEnabled(false);//设置按钮不可用int takeCnt = userNum.getSelectedIndex() + 1;//定义用户拿得火柴棍的数量int rel = paints[1].getCnt();//将自定义的第二个面板中的火柴棍的数量赋给relif (takeCnt > rel)//如果用户拿火柴棍的数量比面板中的数量大的话,执行下面的语句{JOptionPane.showMessageDialog(mainFrame, "There is only " + rel+ " matches.");//用标准对话框类调用显示”There is only machines“的对话框return;}for (int i = 0; i < takeCnt; i++)//定义一个将第二块面板中的火柴棍的数量移动到用户面板的循环{int index = paints[1].remove();//将第二个面板要移除的火柴棍的数量给index变量paints[2].add(index);//将index的值添加到用户拿的面板上}if (takeCnt == rel)//如果用户拿的火柴棍的数量和第二个相等执行下面的语句{JOptionPane.showMessageDialog(mainFrame, "You are the winner.");//显示”你胜利的对话框“init();//并重新初始化}else//如果不相等的话,执行下面的语句,{compTake();//让电脑接着拿火柴棍}}privatevoid compTake()//定义电脑拿的方法{compBtn.setEnabled(false);//设置电脑按钮的当前状态为不可用userBtn.setEnabled(false);//设置用户按钮的当前状态为不可用MyTask task = new MyTask();//实例化一个MyTask的对象timer.schedule(task, DELAY);// 执行线程,安排在指定延迟1秒后执行指定的任务}privateclass MyTask extends TimerTask //定义一个继承了实现Runnable接口的类使自己也具有线程功能{@Overridepublicvoid run()//因为TimerTask实现了Runnable接口,重写父类的run方法{int rel = paints[1].getCnt();//将火柴棍面板中的火柴的数量赋给relint takeCnt = 0;//设置当前拿火柴棍的数量为0if (rel <= MAX_TAKE)//如果当前火柴棍的数量比最大拿火柴的数量小的话,执行下面的语句{takeCnt = rel;//将火柴棍的数量赋给电脑要拿的数量}elseif (rel % (MAX_TAKE + 1) > 0)//如果面板中的火柴棍的数量对4取余大于0的话执行下面的语句{takeCnt = rel % (MAX_TAKE + 1);//将面板中的火柴的数量对4取余之后赋给电脑要拿的火柴的数量}else//否则面板中的火柴棍的数量对4取余小于或等于0的话执行下面的语句{takeCnt = 1 + (int) (MAX_TAKE * Math.random());//随机产生一个小于4的数,给电脑要拿的数量}for (int i = 0; i < takeCnt; i++){int index = paints[1].remove();//将火柴面板中的火柴移除并赋给indexpaints[0].add(index);//将移除的火柴添加到电脑拿的面板上}compTxt.setText("Computer takes " + takeCnt + " matches this time.");//设置电脑显示拿火柴的数量if (takeCnt == rel)//如果和电脑那的数量和面板中的数量相等执行下面的语句{JOptionPane.showMessageDialog(mainFrame, //显示信息对话框提示电脑胜利了!"Computer is the winner.");init();//并重新初始化}userBtn.setEnabled(true);//设置用户按钮重新可用}}@SuppressWarnings("serial")privateclass MyPaintPanel extends Component //定义一个自定义的面板类并继承了组件类{private BufferedImage bimg;//创建一个BufferedImage的变量bimgprivate Stack<Integer>data;//定义一个私有的栈类型的变量dataprivate MyPaintPanel()//构造我的初始面板的方法{bimg = new BufferedImage(190, 285,BufferedImage.TYPE_3BYTE_BGR);//表示一个具有 8 位 RGB 颜色分量的图像,Graphics2D g2 = bimg.createGraphics();//创建一个 Graphics2D,并将它绘制到此 BufferedImage 中g2.setColor(Color.WHITE);//设置要画的颜色,即面板的颜色g2.fillRect(0, 0, 190, 285);//在坐标(0,0)处画一个大小为宽190,高为285的白色矩形区域g2.dispose();//释放此图形的上下文以及它使用的所有系统资源。