mewleo 2007-9-3 14:50
我的第一个ruby程序【猜数字】
写的很粗糙也很简单,没有仔细判断键盘输入部分,字符串处理掌握的还不够。
用了basic式程序写的代码,以后慢慢的简化成ruby式的。
希望高手指点用ruby简化的代码。
初学者朋友欢迎一起学习探讨。
[code]
#教程里面找到随机生成0-n之间m个不重复数字的方法
def sample(n, m)
if m.zero?
[]
else
s = sample(n-1, m-1)
t = rand(n+1)
s.concat s.include?(t) ? [n] : [t]
end
end
puts '猜数字游戏'
puts '游戏方法:每次输入4位 0-9 之间不重复的数字,根据提示猜测电脑的随机数'
puts '提示中,B代表数正确但位置不对的数字个数,而A代表位置与数都正确的数字个数'
puts '提示规则:共有8次机会,每次提示A,B类数字的数量'
puts '作弊方法:输入0000'
$a4=sample(9,4).join("") #生成4位随机数字
puts '#############################################################'
times = 8
while times>0
$A=$B=0
print "您还有#{times}次机会,请输入4位数字: "
STDOUT.flush
num=gets
num.chop!
if num == '0000' then
win=true
break
end
for n in (0..3)
for m in (0..3)
if num[n]==$a4[m] then
if n==m then
$A+=1
next
end
$B+=1
end
end
end
puts "A=#{$A},B=#{$B}"
times-=1
if $A == 4 then
win=true
break
end
end
if win then
puts "恭喜您,只用了#{8-times}次机会猜中。答案#{$a4}"
else
puts "很遗憾您没有猜中,正确答案是#{$a4}!"
end
puts " |GAME|\n |OVER|"<HR id=null>
[/code]
xavier 2007-9-3 19:01
嘿嘿,不错不错,有些细节还可以在优化一下
比如
[code]
num=gets
num.chop!
[/code]
可以直接写成
[code]num=gets.chop![/code]
ps.原来经常在文曲星上玩这个~
drive2me 2007-9-3 21:21
[quote]原帖由 [i]mewleo[/i] 于 2007-9-3 14:50 发表 [url=http://ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=4255&ptid=1119][img]http://ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
写的很粗糙也很简单,没有仔细判断键盘输入部分,字符串处理掌握的还不够。
用了basic式程序写的代码,以后慢慢的简化成ruby式的。
希望高手指点用ruby简化的代码。
初学者朋友欢迎一起学习探讨。
... [/quote]
哈哈,开始了,很快呀。继续呀...
我喜欢你把你的作品也一起分享,呵呵。我来拿!
mewleo 2007-9-3 23:24
谢谢支持
继续学习教程,也希望各位不吝赐教。谢谢 xavier 同志~
鼓励大家一起来运动,看谁能写一个解猜数字游戏的程序,8次内保证猜出^_^
mewleo 2007-9-4 14:25
奇怪的问题
猜数字游戏
游戏方法:每次输入4位 0-9 之间不重复的数字,根据提示猜测电脑的随机数
提示中,B代表数正确但位置不对的数字个数,而A代表位置与数都正确的数字个数
提示规则:共有8次机会,每次提示A,B类数字的数量
作弊方法:输入0000
#############################################################
您还有8次机会,请输入4位数字: 1234
A=0,B=1
您还有7次机会,请输入4位数字: 5690
A=0,B=1
您还有6次机会,请输入4位数字: 2369
A=1,B=1
[b]您还有5次机会,请输入4位数字: 2768
A=3,B=0[/b]
您还有4次机会,请输入4位数字: 3768
A=2,B=1
您还有3次机会,请输入4位数字: 2738
A=1,B=2
您还有2次机会,请输入4位数字: 6738
A=1,B=2
您还有1次机会,请输入4位数字: 2798
A=1,B=2
很遗憾您没有猜中,正确答案是3789!
|GAME|
|OVER|
提示的A,B信息居然不对,之前以为是自己想差了,后来仔细对照多次都发现总有几次这个情况出现。
难道是 num[n]==$a4[m] ,对比ascii码的时候有问题吗?
高手指教
xnine 2007-9-4 15:45
过来学习下
STDOUT.flush 这个有什么用呢?
把IO写入底层?
看不明白 可以介绍下你的算法吗?
新手学习
谢谢
mewleo 2007-9-4 17:35
又出现了,郁闷死了
晕了,程序哪有问题呢?
>ruby first.rb
猜数字游戏
游戏方法:每次输入4位 0-9 之间不重复的数字,根据提示猜测电脑的随机数
提示中,B代表数正确但位置不对的数字个数,而A代表位置与数都正确的数字个数
提示规则:共有8次机会,每次提示A,B类数字的数量
作弊方法:输入0000
#############################################################
您还有8次机会,请输入4位数字:9876
A=0,B=2
您还有7次机会,请输入4位数字: 5432
A=0,B=2
您还有6次机会,请输入4位数字: 3276
A=0,B=2
您还有5次机会,请输入4位数字: 8724
A=1,B=2
您还有4次机会,请输入4位数字: 6348
A=0,B=3
[b]您还有3次机会,请输入4位数字: 4783
A=2,B=2[/b]
您还有2次机会,请输入4位数字: 3748
A=2,B=2
您还有1次机会,请输入4位数字: 3784
A=1,B=3
很遗憾您没有猜中,正确答案是[b]4783[/b]!
|GAME|
|OVER|
>Exit code: 0
mewleo 2007-9-4 17:37
这次就没事。。。。。
只用了6次,没出异常。
>ruby first.rb
猜数字游戏
游戏方法:每次输入4位 0-9 之间不重复的数字,根据提示猜测电脑的随机数
提示中,B代表数正确但位置不对的数字个数,而A代表位置与数都正确的数字个数
提示规则:共有8次机会,每次提示A,B类数字的数量
作弊方法:输入0000
#############################################################
您还有8次机会,请输入4位数字: 1234
A=1,B=1
您还有7次机会,请输入4位数字: 5690
A=0,B=2
您还有6次机会,请输入4位数字: 2156
A=0,B=0
您还有5次机会,请输入4位数字: 9430
A=1,B=3
您还有4次机会,请输入4位数字: 9304
A=0,B=4
您还有3次机会,请输入4位数字: 4039
A=4,B=0
恭喜您,只用了6次机会猜中。答案4039
|GAME|
|OVER|
>Exit code: 0
mewleo 2007-9-4 18:44
修改了一下,貌似ok了
[code]
#教程里面找到随机生成0-n之间m个不重复数字的方法
def sample(n, m)
if m.zero?
[]
else
s = sample(n-1, m-1)
t = rand(n+1)
s.concat s.include?(t) ? [n] : [t]
end
end
puts '猜数字游戏'
puts '游戏方法:每次输入4位 0-9 之间不重复的数字,根据提示猜测电脑的随机数'
puts '提示中,B代表数正确但位置不对的数字个数,而A代表位置与数都正确的数字个数'
puts '提示规则:共有8次机会,每次提示A,B类数字的数量'
puts '作弊方法:输入0000'
$a4=sample(9,4).join("") #生成4位随机数字
puts '#############################################################'
times = 8
while times>0
$A=$B=0
print "您还有#{times}次机会,请输入4位数字: "
STDOUT.flush
num=gets.chop!
if num == '0000' then
win=true
break
end
for n in 0..3
for m in 0..3
if num[n]==$a4[m] then
if n==m then
$A+=1
else
$B+=1
end
break
end
end
end
puts "A=#{$A},B=#{$B}"
times-=1
if $A == 4 then
win=true
break
end
end
if win then
puts "恭喜您,只用了#{8-times}次机会猜中。答案#{$a4}"
else
puts "很遗憾您没有猜中,正确答案是#{$a4}!"
end
puts " |GAME|\n |OVER|"
[/code]
F:\ruby>ruby first.rb
猜数字游戏
游戏方法:每次输入4位 0-9 之间不重复的数字,根据提示猜测电脑的随机数
提示中,B代表数正确但位置不对的数字个数,而A代表位置与数都正确的数字个数
提示规则:共有8次机会,每次提示A,B类数字的数量
作弊方法:输入0000
#############################################################
您还有8次机会,请输入4位数字: 1234
A=0,B=2
您还有7次机会,请输入4位数字: 2378
A=2,B=1
您还有6次机会,请输入4位数字: 2397
A=2,B=1
您还有5次机会,请输入4位数字: 2389
A=4,B=0
恭喜您,只用了4次机会猜中。答案2389
|GAME|
|OVER|
595959 2007-10-25 17:14
sample(n, m)随出来的s,第一个数不会大于7滴
可以改成这样:
@@n = 9
@@m = 4
def sample(s=[]) #生成0到n之间m个不重复的数字数组s
if @@m.zero?
return s
else
t = rand(@@n+1)
unless s.include?(t) #s中不包含t连接[t]
s.concat [t]
@@m -= 1
end
sample(s)
end
end
jmouse 2008-3-1 17:48
猜解的算法比较简单。
一共才0000-9999,开数组存下来。
然后找一个随机数猜,根据猜测的结论,nAmB,对所有数进行删选,不符合的淘汰。
继续在留下的数字里随机选一个去猜,继续淘汰。
。。。
blankego 2008-4-1 20:39
My solution, a sort of weird, but it works.[code]#!/usr/bin/env ruby
class GuessNumber
HELPTXT= <<-HELP
A guess number game
You computer will generate a random number consisted of 4 different
digits, Of course it's a decimal integer. Try to guess it in certain
times (the less the better). After every guess, you'll got a prompt:
A -- total right digits in right place, B -- right digits in wrong place
Please select a level: (Careful! You don't have a chance to give up:))
1)Easy -- 20 tries
2) Medium -- 12 tries
3) Hard -- 8 tries
4) Immpossible? -- 6 tries
q) Quit
===============================================================
HELP
def gen_num
@n2guess = []
4.times{@n2guess.include?(r=rand(10)) ? redo : @n2guess << r}
end
def play
puts HELPTXT
begin
if (g = gets.chomp) =~ /q|Q/
return puts "See ya"
else
times = {'1'=>20,'2'=>12, '3'=>8, '4'=>6}.fetch(g)
end
rescue
retry
end
#------start guessing session-----#
while true
puts "BEAT THE COMPUTER!! YES, YOU CAN! DON'T LET ME DOWN!"
gen_num
failed = (times-1).downto(0)do|t|
n_get = gets.chomp.scan(/\d/).map{|digit|digit.to_i}
##--Error input control
if n_get.uniq.size != 4; puts "*4* different digits,buddy!";redo end
a = 0
n_get.each_with_index{|d,i| a += 1 if @n2guess[i] == d}
break puts "Great! you got it in #{times-t} times guess" if a == 4
b = (n_get & @n2guess).size - a
puts "#{t}time#{'s' unless t <=1} left! A--#{a}, B--#{b}:"
end
puts "Sorry, it's over! The right number is #{@n2guess.join}\n" if failed
puts "Would you like to try again? (y/n)"
/y|Y/ === gets.chomp ? puts("Go ahead!") : (return puts "See ya!" )
end
end
end
GuessNumber.new.play[/code]
blankego 2008-4-1 20:46
[quote]原帖由 [i]jmouse[/i] 于 2008-3-1 17:48 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=11858&ptid=1119][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
猜解的算法比较简单。
一共才0000-9999,开数组存下来。
然后找一个随机数猜,根据猜测的结论,nAmB,对所有数进行删选,不符合的淘汰。
继续在留下的数字里随机选一个去猜,继续淘汰。
。。。 [/quote]
你的意思是讓COMPUTER去猜?play demo?
jmouse 2008-4-1 23:47
回答楼上,是的。我以前用VB写过一个。
而且,当玩家作弊(给出错误指导信息)时,计算机会先体面的认输,然后请教答案,最后告诉你答案和指导信息之间的矛盾之处。
页:
[1]