查看完整版本: 我的第一个ruby程序【猜数字】

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]
查看完整版本: 我的第一个ruby程序【猜数字】