C#程序设计开发总结(猜猜看游戏开发)

来源:互联网 发布:时间轴源码 编辑:程序博客网 时间:2024/05/17 05:13

C#程序设计》开发总结

李 杰

信息学院;物联1121201211672114

一、课程设计的任务

    设计一个猜数字游戏程序,该游戏可以由程序产生随机数字,玩家通过输入数字来匹配程序生成的随机数字。当玩家输入的数字与计算机产生的随机数相符时,计算机将提醒用户游戏成功。当不相符时,则提醒偏大了或是偏小了。

(本课程任务采用Java编写)

二、设计思路

1总体设计

游戏随机给出一个1100 (包括1100) 之间的数字,然后让你猜是什么数字。你可以随便猜一个数字,游戏会提示偏大还是偏小,从而缩小范围。经过几次猜测,最终得出正确答案。

游戏界面:采用图形界面显示。页面有如下功能:开始,结束,重来。

游戏开始后,由计算机产生一个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语句的判断:当玩家猜测的数字和随机产生的答案不同,则再次进入循环,否则便结束循环,执行下面的代码。 (用EclipseAlt/快捷键帮助编写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 2case 6都没有break语句,这表示依次执行下面的语句,从而counter的值为27时,都打印“这么快就猜对了,好厉害哦!”字样。

counter的值不是17时,便执行default语句,打印“猜了半天才猜出来,要加油了!”的字样。

 

4)计时模块

计时模块的代码分别写在游戏的开始和游戏的结束,取得时间差,以毫秒为单位。

<span style="font-size:14px;">long startTime = System.currentTimeMillis();long endTime = System.currentTimeMillis();</span>

3.1.3类与数据结构实现

首先搭建Java程序框架。打开Eclipse,新建名为GuessNumGame的项目,然后新建名为GuessNumJava类。GuessNum加上合适的javadoc

1)随机数的产生

我们可以借助Java API提供的Random类来产生一个随机数

首先在main函数中加入以下三行代码:

// 新建一个随机数产生器,然后生成一个1100之间的整数。

Random random = new Random();

<span style="font-size:14px;">int num = random.nextInt(100);</span>
第一句定义了一个类型是Random类的变量random(Java语言区分大小写,所以Randomrandom是不同意思),并且用new操作符生成一个Random类的实例赋给random变量。random变量实际上是一个参照,指向内存中用new操作符新建的Random类的实大多数情况下可以把random直接看做是一个Random类的实例,可以通过“random”加上“.操作符”来调用Random类的方法,用random.nextInt(100)来获取一个1100之间的随机数。

第二句语句定义一个整型变量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秒”。



如果玩家输入数字不再1100以内数字系统提示错误!



5、设计体会与小结

    总的感受是,在做这个猜猜看的游戏的过程中,虽然遇到了许多的困难,但却得到了更多的收获。

    这个学期学习了Java语言,在学了一段时间后,觉得需要做一点东西来熟悉一下理论知识,同时也检验一下学习成果。可是在做这个小游戏的过程中发现自己并没有很好地掌握Java,很多地方不熟悉甚至完全不会,以至于要上网查找资料或询问精通Java开发的同学。

    Java是一种简单的,面向对象的,分布式的,安全的,可移植的,性能优异、多线程的动态语言。在编写之前,做整体规划和详细设计很重要。只有思路清晰,设计合理可行,编码才能有线索可依,才能更加高效地完成任务。在开发这个游戏的时候,我首先是翻看有关的书籍,在书中查找相关的知识,然后按着书上的内容进行编写。在写代码的过程中遇到困难,就上网百度。因为之前的学习并没有很好地掌握,在开发的过程中遇到的坎比想象中要多,也曾多次感到郁闷,想要放弃。但放松之后回头想想,如果连一个小游戏也完成不了,那还怎么学编程,学编程不就是这样要有耐心有毅力,要突破一个一个的瓶颈吗?于是一次次地硬着头皮去继续编写,经过许多挣扎之后终于完成了这个游戏的开发,也终于发现坚持和忍耐对一个程序员来说是多么的重要。

    在这次开发中,我印象最深刻的是程序的编写过程,从中我学到了许多以前没有学会和没有或学到的函数,还有控制台输入的概念和方法。除此之外,其他一些学习过的知识和方法也得到了巩固。以前总是模模糊糊的,现在十分清楚。平时的学习只注意到了书本上面的知识,对一些类及方法的运用显得抓襟见肘,这次的实践让我从理论过渡到实际掌握。

    当然,最后发现,以前所认知的多么高深复杂的编程,通过自己的学习和实践,变得不再无法触及,这让我收获了信心,学好Java的信心

    这次游戏开发,对我来说是一次挑战,因为在理论学习中没有好好的掌握,现在要独立完成一个较复杂的程序编写,确实有一点困难。但我必须要以积极的态度来面对,认真努力地去完成这这个任务。


0 0
原创粉丝点击