魔方网表 让信息化更简单

 找回密码
 注册
查看: 4193|回复: 10

[原创] 用魔方做的【猜数字游戏】

[复制链接]
fyzzg 发表于 2010-5-27 20:02:31 | 显示全部楼层 |阅读模式
本帖最后由 fyzzg 于 2010-6-14 20:38 编辑

猜数字游戏介绍:  
电脑随机产生一个0-9的四位数。电脑会将您提交的数与它自动产生的数进行比较,结果显示成"++——"。“+”代表位置正确数字也正确,”—“代表数字正确但位置不正确.

猜数字游戏.gif

小时候,常和同学用笔和纸玩这个游戏,看谁用最短时间猜出对方事先写下的数字。那时的场景现在还历历在目。

游客,如果您要查看本帖隐藏内容请回复
admin 发表于 2010-5-27 20:29:03 | 显示全部楼层
不得不说很有创意,佩服
回复

使用道具 举报

 楼主| fyzzg 发表于 2010-5-27 22:36:55 | 显示全部楼层
Flash 猜数字游戏的分析与设计
http://blog.5d.cn/user12/dzxz/200707/425276.html
回复

使用道具 举报

lee3618 发表于 2010-5-27 22:53:39 | 显示全部楼层
高手啊 真正的高手!!!
回复

使用道具 举报

sxtywqh 发表于 2010-5-28 09:52:07 | 显示全部楼层
学习。。。。。。。。。。。
回复

使用道具 举报

wgf8088 发表于 2010-6-4 23:04:14 | 显示全部楼层
123学习。。。。。。。。。。。
回复

使用道具 举报

 楼主| fyzzg 发表于 2010-6-14 20:59:03 | 显示全部楼层

RE: 用魔方做的【猜数字游戏】

QuickBasic程序版本。

Randomize Timer               '随机化
Cls                           '清屏
Dim a(4),b(4)                 '定义数组
10 a = Int(Rnd * 9000)+1000   '产生一个数
aa = a                        '替身变量
a$ = Mid$(Str$(a),2)          '去首部空格
For i = 4 To 1 Step -1        '此循环截位
a(i) = a Mod 10
a = a \ 10
Next
For i = 1 To 3           ’此循环判断是否有数字重复
For j = i + 1 To 4
  If a(i) = a(j) Then 10   '若有数字重复,重新产生
Next j, i
For i = 10 To 1 Step -1        '有十次机会
s = 0                         '"A"次数清零
v = 0                         '"B"次数清零
Print i                       '打印还剩几次机会
20 Input"Input a number ", b   '输入你的数
If b = 0 Then Print "The answer is";aa: End '若直接敲回车显示答案,同时游戏结束
For j = 4 To 1 Step -1        '截位
  b(j) = b mod 10
  b = b \ 10
Next
For j = 1 To 3
  For k = j + 1 To 4
  If b(j) = b(k) Then 20   '若有数字重复,重新输入
Next k, j
For j = 1 To 4
  If a(j) = b(j) Then s = s + 1 '若条件满足,"A"加1
Next
For j = 1 To 4            '找"B"的个数
  b$ = Mid$(Str$(b(j)), 2) '去首位的"0"
  z = Instr(a$, b$)         '寻找在你的数中和它的数相同的数字
  If z <> 0 And a(z) <> b(z) Then v = v + 1 '找"B"
的个数
Next
If s = 4 Then Print "You are right!":End '如"A"=4表明全对,结束游戏
Print s;"A";v;"B"                    '打印"A"以及"B"的个数
Next
Print "Sorry, you are lost!"          '没猜出来,结束
End
回复

使用道具 举报

 楼主| fyzzg 发表于 2010-6-14 21:00:42 | 显示全部楼层

转载 JAVA 程序版本

Java咖啡馆(5)——编写猜数字游戏
电脑爱好者 05年03月14日 【转载】 作者: [评论2条]


  上一回我们讲解了Java语言基础,篇幅所限,仅仅包含相当有限的Java语法知识。本期我们将在上回基础上编写一个猜数字的游戏,进一步学习Java语言基础知识。
猜数字游戏  你肯定玩过猜数字游戏—游戏随机给出一个0至99(包括0和99)之间的数字,然后让你猜是什么数字。你可以随便猜一个数字,游戏会提示太大还是太小,从而缩小结果范围。经过几次猜测与提示后,最终推出答案(见图1)

游戏设计  首先搭建Java程序框架。打开Eclipse,新建名为GuessNumberGame的项目,然后新建名为GuessNumber的Java类。别忘记给GuessNumber加上合适的javadoc。
  第一步:随机数的产生
  我们可以借助Java API提供的Random类来产生一个随机数。
  首先在main函数中加入以下三行代码:
// 新建一个随机数产生器,然后生成一个0到99之间的整数。
Random random = new Random();
int number = random.nextInt(100);
  不出所料,Eclipse就像语文老师一样,立即在错误语句处划出红线,把鼠标移动到红线上,可以看到具体出错信息(见图2)。
  包(Package)的概念
  Java API中包含了极其丰富、类似于Random这样由Sun预先定义好的类(Class,如果忘记相关概念,请参考第四篇连载—《品味第一杯咖啡》),与变量作用域的问题一样,不同包中可以有同名同姓的类,如果没有包的概念,就会遇到命名冲突问题。此外,包还能进行安全控制,你可以规定哪些类可以被包外部调用,哪些不可以。
  Random类是在java.util这个包中。可以手动在源程序顶部输入import java.util.Random;语句来申明该程序将要使用java.util包中的Random类,然而有了Eclipse,就不用那么麻烦了—把光标移动到有红色波浪线的Random上,然后按下Ctrl+Shift+M,Eclipse会自动帮你完成导入的工作了。此时保存一下源代码,警告是不是消失了?希望你牢记这个快捷键的用法,在开发大型项目时,再好的脑子也无法牢记每个类所在的包的名字,有了Eclipse的鼎力相助,偷个懒也没问题。
  语句翻译
  第一句定义了一个类型是Random类的变量random(Java语言区分大小写,所以Random和random是两回事儿),并且用new操作符生成一个Random类的实例赋给random变量。还记得我们上期连载说到变量还有一种引用类型吗?这就是一个例子。random变量实际上是一个参照,指向内存中用new操作符新建的Random类的实例。说起来很拗口,大多数情况下可以把random直接看做是一个Random类的实例,可以通过“random”加上“.操作符”来调用Random类的方法,比如用random.nextInt(100)来获取一个0至99之间的随机数。
  第二句语句定义一个整型变量number来保存随机产生的整数,并且用直接初始化的方法把random产生的随机数赋给number变量。
  第二步:标准输入输出
  标准输入输出(Standard I/O)是指可以被应用程序使用的信息流。比如,应用程序可以从标准输入(Standard input)读取数据,向标准输出(Standard output)写数据,把出错信息发送到标准错误(Standard error)。通过输入输出,应用程序和应用程序之间可以被串联起来使用。虽然标准输入输出是从UNIX发展出来的概念,在Windows中也广泛应用,如果你熟悉DOS,这个概念自然不陌生。
猜数字游戏主要用到标准输入,更明确一些,就是控制台输入。还记得我们经常使用System.out.println进行控制台输出吗?相反,要从控制台输入,就需要用到System.in。它是一个纯粹的输入流,而猜数字游戏主要是通过控制台获取玩家的字符(特别是能够支持多国语言的Unicode字符)输入,我们需要把它包装成一个BufferedReader实例来使用:
BufferedReader input = new BufferedReader(
new InputStreamReader(System.in));
  这时,input就是一个能处理来自控制台输入的、支持Unicode的、可以整行读取的一个BufferedReader实例,比如能通过input.readLine()方法获取玩家在控制台整整一行的输入了。
  第三步:异常
  正如阿甘的名言—Shit happens,程序中的金科玉律就是—一定会出错。出错并不可怕,关键看如何对待错误,有错必究才善莫大焉。
  Java语言提供了异常(Exception)处理机制帮助程序员发现并处理异常。什么是异常呢?所谓异常,就是在程序执行过程中能干扰程序正常流程的事件。导致异常的原因很多,比如文件找不到、数组越界、除以零等。当异常出现时,一个异常对象将被自动生成并传递给Java“运行时环境”(runtime system),说得专业一点,就是抛出一个异常。异常对象包含了异常类型、程序运行状态等信息。“运行时环境”得到异常对象后便打断程序的正常流程,自动寻找一个专门处理该异常的代码块来解决问题。这样的代码块称作异常句柄(Exception Handler)。你可以在异常句柄中尝试修复错误、重试或者报错,或者实在无法进行下去的时候来个自我了断。如果“运行时环境”找不到异常句柄,Java程序便会自行中断。
  一个典型的异常处理是这个样子的:
try catch (exceptiontype1 name) catch (exceptiontype2 name) finally
  其中:
  ★try语句括起来的语句可能抛出异常。try语句至少要搭配一个catch语句或finally语句,不能单独使用。
  ★catch语句必须和一个try语句配套使用,根据异常类型(exception type)分别处理不同的异常。也就是说,Java有许多预先定义的异常,你可以通过多个catch语句对它们分门别类地处理。你还可以自己定义异常类型。如果try语句块中没有抛出异常,这里自然不会被执行。
  ★finally语句也必须和一个try语句配套使用,与catch语句不同,无论try语句块中是否抛出异常,finally所包括的语句块都会被执行。
  举个具体的例子来熟悉一下。猜数字游戏需要从控制台获取玩家输入的数字。我们先定义一个整型变量:
int guess;
  然后就可以编写如下代码:
guess = Integer.parseInt(input.readLine());
  通过input.readLine从控制台读取输入,并且用Integer.parseInt把获取的字符串类型的输入转换成整型,然后赋给guess变量。
  Eclipse又给你脸色看了——input.readLine()下面划上了红线(见图3)。
  看看提示,原来是未处理异常句柄。
  原来,Java有一种异常称作检查型异常(Checked Exceptions)。一般数组越界、除以零等等都是运行时异常,由于数量众多,Java允许你不必亲自捕捉每个这样的异常,而全权交给运行时环境去处理。但检查型异常就不一样了,Java把检查型异常提升到与参数、返回值同样的高度,也就是说,检查型异常你非处理不可,并且在javadoc中必须加以注释。
  那么怎样快速地捕捉这样的异常呢?按照如图3所示,用鼠标点击带有红叉的灯泡图标,在弹出菜单上选择Surround with Try/Catch,异常处理代码模块立即自动生成了。可以发现,这一句话将抛出两个异常:一个是格式异常(NumberFormatException),因为如果你用Integer.parseInt去转换一个汉字,自然是不可能的。另一个便是I/O异常,即标准输入可能会出现不可预料的问题。怎么样,连异常都能够自动捕捉,这就是Eclipse的魅力!
  需要说明的是,NumberFormatException并不是检查型异常,而是一个不必刻意捕捉的运行时异常。试试看把捕捉NumberFormatException的那个catch语句块全部删除,Eclipse也不会报错。不过,捕捉这个异常很有实用价值,后文的代码会进一步展示它的作用。
  小提示
  使用异常机制的诸多好处
  ★使得程序更健壮,界面更友善。
  ★把程序的业务逻辑与错误处理分开,代码更合理,更美观。
  ★异常可以分层次处理,使得代码更简洁。
  ★同类的异常可以归到一类一起处理,处理更方便。
  Java的异常处理机制是一个很大的话题,这里仅仅是展示了冰山一角,以实用为主,希望你能够自行阅读扩展知识,并且在编写代码过程中注意体会。
  while循环控制
  上回的Java咖啡馆介绍了for循环语句,这回需要介绍一个它的“亲戚”语句——while语句。
  while语句的语法是:
while ( expression )
  首先,while语句判断返回一个布尔值的expression表达式,如果返回值为true,则执行下面语句,之后再测试expression表达式再执行语句,以此往复,直到expression表达式返回false为止。

do-while语句与while语句非常相似,语法是:
do while ( expression );
  与while语句在循环顶部判断表达式真假值不同,do-while语句在底部判断,从而,do-while语句至少执行一次内部的代码。
  下面看看猜数字游戏的主体部分:
// 记录玩家猜测的次数
int counter = 0;
System.out.println("我心里有一个0到99之间的整数,你猜是什么?");

do {
try {
// 获取玩家的输入
guess = Integer.parseInt(input.readLine());
} catch (NumberFormatException e) {
// 如果玩家不是输入一个合法的整数,则让他重新输入
System.out.println("请输入一个0-99之间的整数!");
continue;
} catch (IOException e)

// 对玩家的输入进行判断
if (guess > number)
System.out.println("大了点,再猜!");
if (guess < number)
System.out.println("小了点,再试试!");

// 计数器增加一
counter++;
} while (guess != number);
  首先定义了一个counter变量来记录玩家猜测的次数,并直接初始化为0。在打印一行游戏提示以后,便开始一个do-while语句。
  在do-while语句中,首先用异常处理语句获取玩家的输入,如果玩家输入不合法,提示以后用continue语句从头重新执行循环语句,等待玩家的输入。从而,guess变量一定包含一个合法的整数。之后要对玩家的输入进行判断。如果玩家的猜测太大或者太小,都做出提示。接着把计数器增加1,表示玩家做过一次猜测。最后便是do-while语句的判断:当玩家猜测的数字和随机产生的答案不同,则再次进入循环,否则便结束循环,执行下面的代码。
  最后提醒一句,别忘记用Eclipse的Alt+/快捷键帮助编写do-while语句哦!
  switch语句
  switch语句是基于整型表达式的条件判断语句,猜数字用它来进行成绩判断:
// 判断成绩
switch (counter) {
case 1:
System.out.println("东渐……快来看上帝……");
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
System.out.println("这么快就猜对了,你很smart啊!");
break;
default:
System.out.println("猜了半天才猜出来,小同志,尚须努力啊!");
break;
}
  可以看出,switch语句是和若干case语句和一个default语句搭配使用的。代码中的switch语句用counter变量的值进行判断。当counter的值为1时,便执行case 1里面的语句,即打印“东渐……快来看上帝……”的字样,随后的break语句表示整个switch语句执行到这里结束了。当counter的值为2时,便执行case 2里面的语句。可以发现case 2到case 6都没有break语句,这表示依次执行下面的语句,从而counter的值为2至7时,都打印“这么快就猜对了,你很smart啊!”字样。当counter的值不是1至7时,便执行default语句,打印鼓励的话语。
  Just Do It
  想想看怎样编写一个会玩猜数字游戏的Java程序呢?
  小结
  这是Java咖啡馆开张以来最漫长的一回,涉及的知识面很广,希望你能够感到充实而不是烦琐。此外,自己动手编写几个小程序是最好的练习方法。Eclipse是良师益友,有什么问题都会及时通知你,有时还会附上解决方法,希望你善加利用,不要辜负一片心意哦。
回复

使用道具 举报

hai 发表于 2010-9-6 15:05:19 | 显示全部楼层
看看啊
应该比较有趣
回复

使用道具 举报

kz114 发表于 2013-6-6 10:25:39 | 显示全部楼层
初次接触,学习学习,看看大家的大作
回复

使用道具 举报

烟花诺言 发表于 2013-6-7 09:26:35 | 显示全部楼层
下来看看,学习学习。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则


Archiver|手机版|小黑屋|魔方软件 ( 京ICP备08008787号 )

京公网安备 11010702001722号

GMT+8, 2024-5-15 18:42 , Processed in 0.084618 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表