《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#程序设计开发总结(猜猜看游戏开发)相关推荐

  1. 《C#程序设计》猜猜看游戏开发总结

    <猜猜看>游戏开发总结 一.开发目的 在校园中,我们经常遇到某个学生叫自己老师,但老师却想不出该学生的名字,彼此显得有点尴尬.不仅师生之间的互动交流会有这样的问题存在,就连我们身边的同学之 ...

  2. c#课程设计---猜猜看游戏

    1:游戏要求 1. 随机显示 一个名字 与 若干张相片(如3张).选择正确的相片. 2. 记录老师对每一个学生的认识概率P.并依据认识概率,确定"猜猜看"游戏中学生出现的频率. 认 ...

  3. Rust小试牛刀之猜猜看游戏

    Time: 20190919 学习主题 直接进入Rust实践阶段,涉及到如下几个概念: let match methods associated functions 使用外部包等 新建项目 cargo ...

  4. 日照华软游戏开发价格_棋牌游戏开发价格预算需要多少钱?

    随着社会的发展,科技的进步,到目前为止棋牌游戏app应用和人们的生活越来越紧密,那么开发一款棋牌app的预算需要多少钱呢? 首先,棋牌游戏开发是需要确定开发的形式,是组建团队进行棋牌游戏定制开发还是找 ...

  5. 【错误记录】Visual Studio 2019 中运行 Unity C# 脚本时报错 ( 根据解决方案, 可能需要安装额外的组件才能获得 | .NET 桌面开发 | 使用 Unity 的游戏开发 )

    文章目录 一.报错信息 二.解决方案 三.Visual Studio 2019 中运行 Unity C# 脚本需要的组件 1..NET 桌面开发 2.使用 Unity 的游戏开发 一.报错信息 Vis ...

  6. Android开发入门——推箱子游戏开发实战(十二)

    绘制游戏局面 本文是推箱子游戏程序开发的第七步.系列文章前五篇描述准备工作,故本文编号是(十二).本文讲解如何绘制游戏局面. 本文目标 本文讲解如何绘制游戏局面.游戏局面的示例如图1,图2所示.这两幅 ...

  7. 【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/308.html   ...

  8. 3d数学基础图形与游戏开发第二版_游戏开发完整学习路线,都在这里了

    在软件开发中,游戏开发这个方向看起来目标很明确,但其实是个领域很广的方向,入门的时候如果得不到指点一二,很容易误入歧途,相反,如果走这条路之前能得到前人的一些指路,是可以事半功倍的. 平台与编程语言选 ...

  9. 【J2ME 2D 游戏开发系列】◣HIMI游戏开发启蒙教程◢JAVA零基础学习J2ME游戏开发全过程!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/j2me-2/774.html Himi从写 ...

最新文章

  1. 完整复现何恺明ICCV获奖论文结果并开源 !(附论文开源代码)
  2. “泡沫”之后,强化学习已应用到这些领域
  3. centos7搭建Linux集群,CentOS 7下Kafka集群安装
  4. android+建模工具,什么是适用于Android Studio的3D模型环境的最佳工具
  5. 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
  6. VXLAN技术产生背景
  7. asp实现注册登录界面_(01)ASP运行环境的搭建
  8. pancakeswap 开盘抢跑机器人 (附代码)
  9. 数学建模常用算法—灰色预测
  10. beautifulsoup菜鸟教程
  11. html实现下拉跳转
  12. 计算机网口百兆改千兆,家里是千兆网,但是网口是百兆怎么办?
  13. After Effects Guru: Creating Presets and Controllers After Effects 大师教程之创建预设和控制器 Lynda课程中文字幕
  14. Python实现傅里叶变换提取图像高频区域(边缘)
  15. 实现支付宝全额退款和部分退款功能
  16. mysql 索引使用测试(group by、order by)
  17. win10下python+pycharm的安装与破解
  18. The 50 Most Essential Pieces of Classical Music
  19. 如何利用 Selenium 对已打开的浏览器进行爬虫
  20. 人工智能的学习能历史之变强,但对未来又会发生什么事?

热门文章

  1. 最新自动搞蚂蚁森林任务工具
  2. 如何使用Topaz Mask AI Mac版
  3. 计算机网络——数据交换方式
  4. 移相全桥 matlab,基于Matlab的移相全桥变换器仿真实验平台设计
  5. 重庆机动车驾驶培训学时计时管理系统-怎样查询打了多少学时?
  6. python输入五个数并求平均值_python实现输入五个数并求平均值_后端开发
  7. Siamese FC
  8. unity制作qq炫舞的核心玩法
  9. 如何屏蔽微博热搜(PC)
  10. 谷歌金山词霸首次实现免费