logo资料库

java 拿火柴游戏.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
Java 实训报告 程序名:拿火柴游戏 一、 程序功能介绍 火柴游戏的功能时通过用户与计算机相互对拿火柴的游戏程序,通过与计算机的对拿来训练人脑的逻辑 思维能力。游戏简单,便于操作 二、 运行效果及玩法 该程序(火柴游戏)的功能用户与计算机相互对拿火柴的游戏程序,游戏的玩法是用系统产生的随机函 数产生火柴数量(大约在 20—50 之间),每次每一方最多拿三根,最少拿一根,谁拿到最后一根,即为胜者。 游戏的运行效果如下图图 1 所示,电脑随机产生了若干根火柴棍,图画面上按左边“Computer First”那个按 钮,就是电脑先拿,如果点击的是右边的“TAKE”按钮,就是人先拿。
图 1 具体步骤如下图所示 1、如果是电脑先拿先单击 Computer First 按钮,电脑随机拿走一根火柴,并在电脑按钮下方显示“Computer takes 1 matches this time”提示信息,单击之后电脑拿走的按钮被禁用,直到用户单击自己的按钮之后才能 再拿,具体情况如图 2 所示:
2、之后用户单击自己的 Take 按钮,根据自己的情况拿相应的火柴数,比如说用户那个三根火柴如图 3 所示: 图 2
3、可以看到用户根据自己的需要拿了三根火柴,之后电脑又拿了一根,如此循环,直到哪一方赢得比赛的胜 利。从图 4,图 5 中可以看到用户赢得了比赛的胜利。 图 3 图 4 三、 设计主要内容:
该游戏程序设计的主要内容是使用 java 中的各种组件与容器互相搭配来完成的一个小游戏。游戏设计中的主 要的知识要点包括 java 的 awt 包中的颜色类,图形类,图像类,事件监听器类,和 util 包中的 stack 类,timer 类,和 timertask 类的使用方法,以及 swing 包中的窗口类,按钮类,标签类,面板类,复选框类等一些常用 组件的用法。通过这些组件来掌握事件监听器的用法,java 中栈的用法,以及实现了 Runnable 类的 TimerTask 类的用法,通过这个类实现线程技术,还有 Graphics 类中的主要方法的使用,学会运用这些方法来来绘制火 柴,绘制图片的目的。 四、 源程序 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 Test//定义一个公共的主类Test { public static void main(String[] args)//定义主方法main { new Test();//调用Test类的构造方法Test() } private static final int MIN_CNT = 20;//定义一个常量,设置为最小火柴棍数量为20 private static final int MAX_CNT = 50;//定义一个常量,设置为最大火柴棍数量为50 private static final int MAX_TAKE = 3;//定义一个常量,设置为最大拿火柴数量为3 private static final int DELAY = 1000;//定义一个常量,设置为延迟时间为1000 private JFrame mainFrame;//定义主框架变量 private MyPaintPanel[] paints;//定义我自己画的面板数组变量 private JButton userBtn;//定义我的按钮属性 private JComboBox userNum;//定义我的下拉列表 private JButton compBtn;//定义电脑按钮属性 private JLabel compTxt;//定义电脑标签 private Timer timer;//定义计时器的变量
private Test()//定义一个私有的构造方法,来完成游戏的初始化动作 { 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,高20 mainPanel.add(lab11);//将标签加入主面板 JButton btn11 = new JButton("Reset");//定义一个重新来的按钮 btn11.addActionListener(new ActionListener()//为“Reset”添加行为事件监听器, 采用匿名类的方式 { } @Override public void actionPerformed(ActionEvent e)//实现监听器中的方法 { init();//当单击此按钮时,调用该初始化方法 }); btn11.setBounds(250, 10, 100, 20);//设置重置按钮的位置,左上角坐标为(250,10), 大小为宽100,高20 mainPanel.add(btn11);//重来标签添加到主面板上 JLabel lab12 = new JLabel("用户");//定义用户标签 lab12.setHorizontalAlignment(JLabel.CENTER);//设置用户水平方式为居中 lab12.setBounds(400, 10, 200, 20);//设置用户标签的位置,左上角坐标为(400,10), 大小为宽200,高20 mainPanel.add(lab12);//将用户标签添加到主面板上 compBtn = new JButton("Computer First");//定义一个电脑首先拿的按钮 compBtn.addActionListener(new ActionListener()//为电脑开始按钮定义行为事件监 听器 { @Override public void actionPerformed(ActionEvent e)//行为监听器中的默认方法 { compTake();//当单击电脑按钮时,调用电脑拿方法
}); compBtn.setBounds(10, 40, 180, 20);//设置电脑按钮的位置,左上角坐标为(10,40), 大小为宽180,高20 mainPanel.add(compBtn);//按钮添加到主面板上 compTxt = new JLabel();//定义一个空标签 compTxt.setBounds(10, 70, 400, 20);//设置空标签的位置,左上角坐标为(10,70), 大小为宽400,高20 mainPanel.add(compTxt);//将空标签加到主面板上 userBtn = new JButton("Take");//定义用户拿按钮 userBtn.addActionListener(new ActionListener()//为用户按钮定义行为事件监听器 { @Override public void actionPerformed(ActionEvent e) { userTake();//当单击用户拿按钮时,调用用户拿方法 } } }); userBtn.setBounds(400, 40, 90, 20);//设置用户拿按钮的位置,左上角的坐标为 (400,40),大小为宽90,高20 mainPanel.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,高20 mainPanel.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);//设置三个面板的位置和坐 mainPanel.add(paints[i]);//将三个面板分别添加到主面板上 } mainFrame.pack();//调整此窗口的大小,以适合其子组件的首选大小和布局。 mainFrame.setVisible(true);//设置当前主窗口的可见性 init();//调用初始化方法 板 标,间距为5 }
private void 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);//分别将产生的随机数添加到第二块面板 } } private void userTake()//定义一个用户拿火柴棒的方法 { compBtn.setEnabled(false);//设置按钮不可用 int takeCnt = userNum.getSelectedIndex() + 1;//定义用户拿得火柴棍的数量 int rel = paints[1].getCnt();//将自定义的第二个面板中的火柴棍的数量赋给rel if (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();//并重新初始化
分享到:
收藏