C#程序设计开发总结(猜猜看游戏开发)
《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 & Feeltry { //设置窗口外观为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#课程设计---猜猜看游戏
1:游戏要求 1. 随机显示 一个名字 与 若干张相片(如3张).选择正确的相片. 2. 记录老师对每一个学生的认识概率P.并依据认识概率,确定"猜猜看"游戏中学生出现的频率. 认 ...
- Rust小试牛刀之猜猜看游戏
Time: 20190919 学习主题 直接进入Rust实践阶段,涉及到如下几个概念: let match methods associated functions 使用外部包等 新建项目 cargo ...
- 日照华软游戏开发价格_棋牌游戏开发价格预算需要多少钱?
随着社会的发展,科技的进步,到目前为止棋牌游戏app应用和人们的生活越来越紧密,那么开发一款棋牌app的预算需要多少钱呢? 首先,棋牌游戏开发是需要确定开发的形式,是组建团队进行棋牌游戏定制开发还是找 ...
- 【错误记录】Visual Studio 2019 中运行 Unity C# 脚本时报错 ( 根据解决方案, 可能需要安装额外的组件才能获得 | .NET 桌面开发 | 使用 Unity 的游戏开发 )
文章目录 一.报错信息 二.解决方案 三.Visual Studio 2019 中运行 Unity C# 脚本需要的组件 1..NET 桌面开发 2.使用 Unity 的游戏开发 一.报错信息 Vis ...
- Android开发入门——推箱子游戏开发实战(十二)
绘制游戏局面 本文是推箱子游戏程序开发的第七步.系列文章前五篇描述准备工作,故本文编号是(十二).本文讲解如何绘制游戏局面. 本文目标 本文讲解如何绘制游戏局面.游戏局面的示例如图1,图2所示.这两幅 ...
- 【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/308.html ...
- 3d数学基础图形与游戏开发第二版_游戏开发完整学习路线,都在这里了
在软件开发中,游戏开发这个方向看起来目标很明确,但其实是个领域很广的方向,入门的时候如果得不到指点一二,很容易误入歧途,相反,如果走这条路之前能得到前人的一些指路,是可以事半功倍的. 平台与编程语言选 ...
- 【J2ME 2D 游戏开发系列】◣HIMI游戏开发启蒙教程◢JAVA零基础学习J2ME游戏开发全过程!...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/j2me-2/774.html Himi从写 ...
最新文章
- 完整复现何恺明ICCV获奖论文结果并开源 !(附论文开源代码)
- “泡沫”之后,强化学习已应用到这些领域
- centos7搭建Linux集群,CentOS 7下Kafka集群安装
- android+建模工具,什么是适用于Android Studio的3D模型环境的最佳工具
- 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
- VXLAN技术产生背景
- asp实现注册登录界面_(01)ASP运行环境的搭建
- pancakeswap 开盘抢跑机器人 (附代码)
- 数学建模常用算法—灰色预测
- beautifulsoup菜鸟教程
- html实现下拉跳转
- 计算机网口百兆改千兆,家里是千兆网,但是网口是百兆怎么办?
- After Effects Guru: Creating Presets and Controllers After Effects 大师教程之创建预设和控制器 Lynda课程中文字幕
- Python实现傅里叶变换提取图像高频区域(边缘)
- 实现支付宝全额退款和部分退款功能
- mysql 索引使用测试(group by、order by)
- win10下python+pycharm的安装与破解
- The 50 Most Essential Pieces of Classical Music
- 如何利用 Selenium 对已打开的浏览器进行爬虫
- 人工智能的学习能历史之变强,但对未来又会发生什么事?