C#程序设计开发总结(猜猜看游戏开发)
来源:互联网 发布:时间轴源码 编辑:程序博客网 时间:2024/05/17 05:13
《C#程序设计》开发总结
李 杰
信息学院;物联1121;201211672114
一、课程设计的任务
设计一个猜数字游戏程序,该游戏可以由程序产生随机数字,玩家通过输入数字来匹配程序生成的随机数字。当玩家输入的数字与计算机产生的随机数相符时,计算机将提醒用户游戏成功。当不相符时,则提醒偏大了或是偏小了。
(本课程任务采用Java编写)
二、设计思路
1、总体设计
游戏随机给出一个1—100 (包括1和100) 之间的数字,然后让你猜是什么数字。你可以随便猜一个数字,游戏会提示偏大还是偏小,从而缩小范围。经过几次猜测,最终得出正确答案。
游戏界面:采用图形界面显示。页面有如下功能:开始,结束,重来。
游戏开始后,由计算机产生一个1-100的随机数,不显示在图形界面,但显示字符界面。用户只需输入所猜想的数字,打印在输入框内,按“确定”按钮表示确定,游戏返回提示语句,按照提示语句操作,直至游戏结束。同时,计算机开始对游戏进行计时和计数功能。
游戏过程中,如果不想继续玩了,可以直接退出,想重新开局,按“重新开始”按钮即可。想控制界面大小只需拖拽图形界面边框即可。
游戏结束后,可以选择“关闭”游戏,或者是“重新开始”。
2、功能模块详细设计
2.1、随机数的获取
功能描述:玩家输入一个数字,数字的范围在1-100之间,系统获取随机数。
2.2 、输入输出模块
功能描述:对玩家输入的数字进行判断和提示。如果玩家输入的不是系统要求的数字,系统将提示输入的不是数字请重新输入。如果玩家输入的数字与随机生成数相比较,比随机生成数小,系统提示数字偏小请重新输入。如果玩家输入的数字与随机生成数相比较,比随机生成数大,系统提数字偏大,请重新输入。
2.3 、判断模块
功能描述:算出所用时间在玩家猜中时给出其所用时间,系统给出对其水平的判断和是否继续的提示;对玩家要求判断执行。
2.4、 自动计数模块
功能描述:系统根据您猜数字的次数,自动计数。
2.5、 结果输出模块
功能描述:直到用户猜到数字为止,提示信息是否重新猜数字,如果重新开始将进入下一次游戏,如果关闭将退出游戏系统。
3、详细设计
3.1关键算法与技术实现
3.1.1源程序
<span style="font-size:14px;">/* 程序运行时自动产生1-100的随机数 * 接受用户键盘输入数据并给出指示信息 * 直至猜对,游戏者猜对后,显示猜对次数 * 并且供计时功能 */import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Random;import javax.swing.*;public class GuessNum extends javax.swing.JFrame { { //Set Look & Feel try { //设置窗口外观为windows外观 javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch(Exception e) { e.printStackTrace(); } } private JLabel jLabel1; private JTextField jTextField1; private JButton jButton1; private JButton jButton2; private int number=0; private int counter=0; long startTime = System.currentTimeMillis(); long endTime; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { GuessNum inst = new GuessNum(); inst.setVisible(true); //显示窗口 } /** *新建一个随机数产生器,然后生成一个1到100之间的整数*/ public GuessNum() { super(); initGUI(); Random random = new Random(); number = random.nextInt(100); //产生一个1-100间的随机数 } /** *初始化窗口组件 */ private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//窗口关闭时销毁窗口 getContentPane().setLayout(null);//设置窗口布局为绝对布局 { jLabel1 = new JLabel(); getContentPane().add(jLabel1); jLabel1.setText("<html>欢迎进入有趣的猜数字游戏;<br><br><br>"+ " 1到100之间的整数,你猜是什么?<br><br><br>"+ "请输入你想猜的数:</html>"); jLabel1.setBounds(45, 0, 420, 150);//设置标签位置 } { jTextField1 = new JTextField(); getContentPane().add(jTextField1); jTextField1.setBounds(42, 168, 112, 28);//输入窗口大小 jTextField1.addKeyListener(new KeyAdapter(){//文本框添加键盘按键监听回车键 public void keyPressed(KeyEvent evt) { jTextField1KeyPressed(evt); } }); } { jButton1 = new JButton(); getContentPane().add(jButton1); jButton1.setText("确定"); jButton1.setBounds(182, 168, 77, 28);//确定按钮 jButton1.addActionListener(new ActionListener(){//按钮添加监听 public void actionPerformed(ActionEvent evt) { jButton1ActionPerformed(evt);//按钮被点击时 执行该方法 } }); } { jButton2 = new JButton(); getContentPane().add(jButton2); jButton2.setText("重新开始"); jButton2.setBounds(280, 168, 91, 28);//设置重新开始按钮 jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jButton2ActionPerformed(evt); } }); } pack(); this.setSize(450, 280);//设置窗口大小 setLocationRelativeTo(null);//设置窗口在显示器居中显示 } catch (Exception e) { e.printStackTrace(); } } /** *“确定”按钮事件监听 * @param evt */ private void jButton1ActionPerformed(ActionEvent evt) { int guess=0; //记录玩家所猜测的数字 counter++; //计数器增加一// try,catch的异常管理 try { //获取玩家的输入 guess=Integer.parseInt(jTextField1.getText()); } catch (Exception e) { //如果玩家不是输入一个合法的整数,则让他重新输入 JOptionPane.showMessageDialog(null, "数字不合法,请输入一个1-100之间的整数!"); //显示 jTextField1.setText("");//清空文本框内容 jTextField1.requestFocus();//文本框获取输入焦点 return ; }//对玩家的输入进行判断 if (guess > number){ JOptionPane.showMessageDialog(null, "猜的有点大,再小一点吧!"); jTextField1.setText(""); jTextField1.requestFocus(); return ; } if (guess < number){ JOptionPane.showMessageDialog(null, "猜的有点小,再大一点吧!"); jTextField1.setText(""); jTextField1.requestFocus(); return ; } if (guess == number) { endTime=System.currentTimeMillis(); //判断成绩 switch (counter) { case 1: JOptionPane.showMessageDialog(null,"好厉害,真棒!!"); break; case 2: case 3: case 4: case 5: case 6: case 7: JOptionPane.showMessageDialog(null,"这么快就猜对了,好厉害哦!"); break; default:JOptionPane.showMessageDialog(null,"猜了半天才猜出来,要加油了!"); break; } JOptionPane.showMessageDialog(null,"您总共猜了"+counter+"次 共花了"+(endTime-startTime)/1000+"秒的时间答对正确答案!"); } jTextField1.setText(""); jTextField1.requestFocus(); } private void jButton2ActionPerformed(ActionEvent evt) {//重新开始 Random random = new Random(); //重新生成随机数 number = random.nextInt(100); //产生一个1-100间的随机数 counter=0; //记录玩家猜测的次数 jTextField1.setText(""); startTime = System.currentTimeMillis(); } private void jTextField1KeyPressed(KeyEvent evt) { //监听文本框回车 if (evt.getKeyCode()==KeyEvent.VK_ENTER) { jButton1.doClick();//文本框按回车键 执行“确定”按钮的事件 } }}</span>
3.1.2关键算法
(1)记录猜测次数模块
记录玩家猜测的次数
counter = 0;
计数器增加一
counter++;
首先定义了一个counter变量来记录玩家猜测的次数,并直接初始化为0。在打印一行游戏提示以后,便开始一个do-while语句。
在do-while语句中,首先用异常处理语句获取玩家的输入,如果玩家输入不合法,提示以后用continue语句从头重新执行循环语句,等待玩家的输入。从而,guess变量一定包含一个合法的整数。之后要对玩家的输入进行判断。
如果玩家的猜测太大或者太小,都做出提示。接着把计数器增加1,表示玩家做过一次猜测。
最后便是do-while语句的判断:当玩家猜测的数字和随机产生的答案不同,则再次进入循环,否则便结束循环,执行下面的代码。 (用Eclipse的Alt+/快捷键帮助编写do-while语句。)
(2)输入输出模块
<span style="font-size:14px;">//获取玩家的输入 guess=Integer.parseInt(jTextField1.getText());//如果玩家不是输入一个合法的整数,则让他重新输入 JOptionPane.showMessageDialog(null, "数字不合法,请输入一个1-100之间的整数!"); jTextField1.setText(""); jTextField1.requestFocus(); return ; }//对玩家的输入进行判断 if (guess > number){ JOptionPane.showMessageDialog(null, "猜的有点大,再小一点吧!"); jTextField1.setText(""); jTextField1.requestFocus(); return ; } if (guess < number){ JOptionPane.showMessageDialog(null, "猜的有点小,再大一点吧!"); jTextField1.setText(""); jTextField1.requestFocus(); return ; } if (guess == number) { endTime=System.currentTimeMillis();</span>
(3)判定成绩模块
<span style="font-size:14px;">//判断成绩 switch (counter) { case 1: JOptionPane.showMessageDialog(null,"好厉害,真棒!"); break; case 2: case 3: case 4: case 5: case 6: case 7: JOptionPane.showMessageDialog(null,"这么快就猜对了,好厉害哦!"); break; default:JOptionPane.showMessageDialog(null,"猜了半天才猜出来,要加油了!"); break; } JOptionPane.showMessageDialog(null,"您总共猜了"+counter+"次 共花了"+(endTime-startTime)/1000+"秒的时间答对正确答案!"); } jTextField1.setText(""); jTextField1.requestFocus(); }</span>
switch语句是基于整型表达式的条件判断语句,猜数字用它来进行成绩判断。可以看出,switch语句是和若干case语句和一个default语句搭配使用的。代码中的switch语句用counter变量的值进行判断。
当counter的值为1时,便执行case 1里面的语句,即打印“好厉害,真棒!!”的字样,随后的break语句表示整个switch语句执行到这里结束了。
当counter的值为2时,便执行case 2里面的语句。可以发现case 2到case 6都没有break语句,这表示依次执行下面的语句,从而counter的值为2至7时,都打印“这么快就猜对了,好厉害哦!”字样。
当counter的值不是1至7时,便执行default语句,打印“猜了半天才猜出来,要加油了!”的字样。
(4)计时模块
计时模块的代码分别写在游戏的开始和游戏的结束,取得时间差,以毫秒为单位。
<span style="font-size:14px;">long startTime = System.currentTimeMillis();long endTime = System.currentTimeMillis();</span>
3.1.3类与数据结构实现
首先搭建Java程序框架。打开Eclipse,新建名为GuessNumGame的项目,然后新建名为GuessNum的Java类。GuessNum加上合适的javadoc。
(1)随机数的产生
我们可以借助Java API提供的Random类来产生一个随机数。
首先在main函数中加入以下三行代码:
// 新建一个随机数产生器,然后生成一个1到100之间的整数。
Random random = new Random();
<span style="font-size:14px;">int num = random.nextInt(100);</span>第一句定义了一个类型是Random类的变量random(Java语言区分大小写,所以Random和random是不同意思),并且用new操作符生成一个Random类的实例赋给random变量。random变量实际上是一个参照,指向内存中用new操作符新建的Random类的实大多数情况下可以把random直接看做是一个Random类的实例,可以通过“random”加上“.操作符”来调用Random类的方法,用random.nextInt(100)来获取一个1至100之间的随机数。
第二句语句定义一个整型变量number来保存随机产生的整数,并且用直接初始化的方法把random产生的随机数赋给number变量。
(2)输入输出界面
标准输入输出(Standard I/O)是指可以被应用程序使用的信息流。比如,应用程序可以从标准输入(Standard input)读取数据,向标准输出(Standard output)写数据,把出错信息发送到标准错误(Standard error)。猜数字游戏主要用到标准输入,即控制台输入。用System.out.println进行控制台输出,用System.in进行控制台输入。它是一个纯粹的输入流,而猜数字游戏主要是通过控制台获取玩家的字符输入,则需要把它包装成一个BufferedReader实例来使用。
<span style="font-size:14px;">BufferedReader input = new BufferedReader(new InputStreamReader(System.in));</span>
这时,input就是一个能处理来自控制台输入的、支持Unicode的、可以整行读取的一个BufferedReader实例,比如能通过input.readLine()方法获取玩家在控制台整整一行的输入。
4、运行调试与分析讨论
4.1、系统测试方案
点击运行程序后,显示出图形界面。
系统自动获取到一个随机数。
玩家输入一个数,点击“确定”按钮。如果玩家输入的数比系统给出的随机数小,系统会提示“猜的有点小,再大一点吧!”。如果玩家输入的数比系统给出的随机数大,系统提示“猜的有点大,再小一点吧!”。
如果玩家猜对了数,但是所用时间大于七次,系统会提示“猜了半天才猜出来,要加油了!”,并且会计算出玩家所用的时间和所猜的次数。如果玩家猜对了数,而且所用时间小于七次,系统会提示“这么快就猜对了,好厉害哦!”,并且会计算出玩家所用的时间和所猜的次数。
如果玩家想重新再玩一次,点击“重新开始”按钮即可继续玩下一轮游戏。
4.2、运行结果分析
开始运行程序时图形界面的显示
玩家输入一个数“25”后,点击“确定”,系统提示“猜的有点小,再大一点吧!”。
玩家再次输入一个数“70”后,点击“确定”,系统提示您“猜的有点大,再小一点吧!”。
玩家再次输入一个数“32”,点击“确定”,系统提示“猜了半天才猜出来,要加油了!”,单击确定显示“您总共猜了8次,您猜数字总共花了33秒”。
玩家再重新玩一次,获取随机数后,玩家输入一个随机数“90”,点击“确定”,系统提示“正确”!您总共猜了2次,您猜数字总共花了14秒”。
如果玩家输入数字不再1到100以内数字系统提示错误!
5、设计体会与小结
总的感受是,在做这个猜猜看的游戏的过程中,虽然遇到了许多的困难,但却得到了更多的收获。
这个学期学习了Java语言,在学了一段时间后,觉得需要做一点东西来熟悉一下理论知识,同时也检验一下学习成果。可是在做这个小游戏的过程中发现自己并没有很好地掌握Java,很多地方不熟悉甚至完全不会,以至于要上网查找资料或询问精通Java开发的同学。
Java是一种简单的,面向对象的,分布式的,安全的,可移植的,性能优异、多线程的动态语言。在编写之前,做整体规划和详细设计很重要。只有思路清晰,设计合理可行,编码才能有线索可依,才能更加高效地完成任务。在开发这个游戏的时候,我首先是翻看有关的书籍,在书中查找相关的知识,然后按着书上的内容进行编写。在写代码的过程中遇到困难,就上网百度。因为之前的学习并没有很好地掌握,在开发的过程中遇到的坎比想象中要多,也曾多次感到郁闷,想要放弃。但放松之后回头想想,如果连一个小游戏也完成不了,那还怎么学编程,学编程不就是这样要有耐心有毅力,要突破一个一个的瓶颈吗?于是一次次地硬着头皮去继续编写,经过许多挣扎之后终于完成了这个游戏的开发,也终于发现坚持和忍耐对一个程序员来说是多么的重要。
在这次开发中,我印象最深刻的是程序的编写过程,从中我学到了许多以前没有学会和没有或学到的函数,还有控制台输入的概念和方法。除此之外,其他一些学习过的知识和方法也得到了巩固。以前总是模模糊糊的,现在十分清楚。平时的学习只注意到了书本上面的知识,对一些类及方法的运用显得抓襟见肘,这次的实践让我从理论过渡到实际掌握。
当然,最后发现,以前所认知的多么高深复杂的编程,通过自己的学习和实践,变得不再无法触及,这让我收获了信心,学好Java的信心。
这次游戏开发,对我来说是一次挑战,因为在理论学习中没有好好的掌握,现在要独立完成一个较复杂的程序编写,确实有一点困难。但我必须要以积极的态度来面对,认真努力地去完成这这个任务。
- C#程序设计开发总结(猜猜看游戏开发)
- 《C#程序设计》猜猜看游戏开发总结
- C#课程设计:《猜猜看》游戏开发总结
- C#课程设计:《猜猜看》游戏开发总结
- 《猜猜看》游戏开发总结
- 猜猜看游戏开发总结
- 猜猜看游戏的开发总结
- 《猜猜看》游戏的开发总结
- C#:《猜猜看》游戏开发总结
- C#《猜猜看》游戏开发总结
- 《猜猜看》游戏的开发总结
- 《猜猜看》游戏开发
- C#课程设计——“猜猜看”开发总结
- 《C#程序设计》第六次作业:《猜猜看》游戏
- C#程序设计》开发总结
- 《C#程序设计》开发总结
- c#程序设计 猜猜看
- C#程序设计-猜猜看
- 云计算平台最核心的五项技术
- Contains Duplicate II
- libevent学习资料
- NSString的length方法特别之处
- 悟空学Linux专栏----第6篇
- C#程序设计开发总结(猜猜看游戏开发)
- Android Studio设置或更改SDK
- 解决SuperMap Objects Java 在Tomcat中运行时提示找不到Wrapj的问题
- mmap使用
- Linux 下 ngnix 搭建 http 服务器
- 方便的布局动画
- plsql dev中Dynamic Performance Tables not accessible分析解决
- 悟空学Linux专栏----第7篇
- win7 virtualbox错误0x80004005