中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 猜数字游戏[game's over] 上一主题 | 下一主题
dosmania
初级用户





积分 172
发帖 54
注册 2007-1-2
状态 离线
『楼 主』:  猜数字游戏[game's over]

写个猜数字的游戏,不知有没有人玩过,家里电话有这游戏,玩了好多次了
我自己也在写,7788,没完善好,想看下大家有没更好的思路。
在论坛里感觉没挑战的高手都可以出来讨论下了,谢谢啊``

规则:

      1. 游戏开始会随机获取四位不重复的0-9的数字(第一位可以为0)
  
      2. 玩家首先进行猜测,输入四位不重复的0-9的数字

      3. 将游戏一开始获取的数字跟玩家输入的数字进行对比:

         假如有一位的数字和位置完全匹配的话,设置标志 A1

         假如有一位的数字匹配,但是位置不匹配的话,设置标志B1

         假如数字和位置均不匹配的话,设置标志B0

         数字和位置完全匹配只设置标志A,跟B无关

         例如: 答案是 4690  若我猜 0679 则 提示为 A1B2

         若提示 A0B0 则表示所猜的数字在答案中完全没出现过

         若提示 A0B4 则表示所猜的数字完全匹配,但是位置全错了

         A4B0 就是正确答案了。

     4.  只有10机会

    大概思路:

                  *  必须验证随机答案

                      验证随机获取的数字是否四位,每一位是否有重复

                   *  必须验证玩家的输入规范

                      验证玩家输入的是否是纯数字,是否有重复,是否是4位,否则给出相应提示然后跳回重新输入

                   *  记录历史记录

                      第一次用户输入了什么,得到的提示是什么,必须在第二次猜测的时候显示出来供参考

                   *  记录使用次数
                     
                      猜了多少次,剩下多少次,跟历史记录一起显示

                   *  必须有重玩的机会

                      玩家使用完10次之后还没猜出来必须要有重玩机会,或者一次就猜出来了,也要有重玩机会

-------------------------------------------------------------------------------------------
最终答案见 7楼、9楼、11楼、16楼
结帖!

[ Last edited by dosmania on 2007-9-26 at 09:32 PM ]

2007-9-21 15:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosmania
初级用户





积分 172
发帖 54
注册 2007-1-2
状态 离线
『第 2 楼』:  

我狂汗啊``怎么没人研究啊``

2007-9-24 15:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 3 楼』:  

这个挺有意思的;
只是这段时间比较忙没时间;

十一放假;一定写出来贴上来;

2007-9-24 16:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 4 楼』:  

很早就有人写了个猜数字的游戏,在那个上面稍微修改下就可以的

2007-9-24 16:57
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  

我以前写了个C语言版的
有时间把它转成批处理

2007-9-24 21:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dosmania
初级用户





积分 172
发帖 54
注册 2007-1-2
状态 离线
『第 6 楼』:  

re bjsh:
期待版主的思路吖````

re vkill:

是有人写过,但截然不同,差很多呢,那游戏够假
我说的这个可是真实存在我家固定电话里的游戏。
我提到的一些必要的验证也是和你说的那个区别开来。

re HAT:

把代码贴上来

2007-9-25 03:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 7 楼』:  

楼主说的是这个游戏吧
http://www.cn-dos.net/forum/viewthread.php?tid=32554

   此帖被 +2 点积分    点击查看详情   
评分人:【 dosmania 分数: +2  时间:2007-9-26 21:33


2007-9-25 11:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dosmania
初级用户





积分 172
发帖 54
注册 2007-1-2
状态 离线
『第 8 楼』:  

re qzwqzw:

拜读了一下你的贴子``反猜解太慢了,等了N 久``
其实现实存在的那个猜数字游戏是猜10次,而不是8次。
我测试了你的release 1 版,出现的问题也贴到你贴子里了`自己去看``
感觉你的代码N 多```

2007-9-25 14:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 9 楼』:  


@echo off
setlocal enabledelayedexpansion
:::::::::::::::::::::::::::     猜数字游戏   :::::::::::::::::::::::::::
:::::::::::::::::::::::::::{s11ss  2007-9-25}:::::::::::::::::::::::::::
:Begin
set/a counter=1
:GetStr
echo 请输入一个四位数[各位各不相同,第一个数字可以为0]:
set/p str=
if "%str%"=="" goto :GetStr
call set one=%%str:~3,1%%
if "%one%" equ "" (echo 位数一定为四!& goto :GetStr)
call set one=%%str:~4,1%%
if not "%one%" equ "" (echo 位数一定为四!& goto :GetStr)
set/a len=0
:IsAllNum
call set word=%%str:~%len%,1%%
if not "%word%"=="" (
        set isnum=False
        for /l %%a in (0,1,9) do (
                if "%word%"=="%%a" (
                        set/a len+=1
                        set isnum=True               
                        goto :IsAllNum
                )
        )
)
if "%isnum%"=="False" (echo 怎么会有非数字出现呢? & goto :GetStr)
set state=chkinput
call :CheckSameNum n %str%
if not !counter! equ 1 goto :CheckAnswer
goto :CreateRandom
:CheckSameNum
set s=%2
for /l %%a in (0,1,3) do call set %1%%a=%%s:~%%a,1%%
set/a i=0
:ci
set/a j=!i!+1
:cj
if !%1%j%! equ !%1%i%! (
        if !state! equ chkinput (
        echo 各位数字要各不相同!& goto :GetStr
        ) else (goto :CreateRandom)
)
set/a j+=1
if not !j! gtr 3 goto :cj
set/a i+=1
if not !i! gtr 2 goto :ci
goto :eof
:CreateRandom
set/a answer=%random%
call set one=%%answer:~3,1%%
if "%one%" equ "" (goto :CreateRandom)
call set one=%%answer:~4,1%%
if not "%one%" equ "" (goto :CreateRandom)
set state=chkrandom
call :CheckSameNum y %answer%
::下一句可以显示出答案:
::echo %answer%
:CheckAnswer
set/a aa=0,bb=0
if not !counter! equ 11 (
        for /l %%a in (0,1,3) do (
                for /l %%i in (0,1,3) do (
                        if !n%%i! equ !y%%a! (
                                if %%i equ %%a (
                                        set/a aa+=1
                                ) else (set/a bb+=1)
                        )               
                )
        )
        set r%counter%=A!aa!B!bb!
        set str%counter%=!str!
        for /l %%a in (1,1,!counter!) do echo 第%%a次猜测:!str%%a!,结果:!r%%a!
        set/a remain=10-!counter!
        echo 共猜了!counter!次,还剩!remain!次。
        set/a counter+=1
        if not !aa! equ 4 (
                goto :GetStr
        ) else (
                echo 答对了,答案就是!str%counter%!,中秋节快乐!
                goto :Replay       
                )
)
echo 已经猜了10次!
:Replay
set/p q=要重玩么?(y/n)
if not "%q%" equ "y" (
        if not "%q%" equ "Y" (
                echo 按任意键退出...
                pause>nul
                goto :eof
        )
)
goto :Begin
[ Last edited by s11ss on 2007-9-25 at 02:44 PM ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 dosmania 分数: +2  时间:2007-9-26 21:34


2007-9-25 14:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 10 楼』:  

dosmania:
我承认那个猜解算法确实有些蹩脚
毕竟只是一个闲暇之余的R1而已

可惜当时没人对此感兴趣
没有形成讨论的气氛
后来我也失去了这方面的兴趣

你若有新的算法那就贴出来
也许会重新激发我的兴趣也不一定
------------------------------------------------------
至于猜8次还是猜10次问题
我认为那不是问题
最初我就设定了10次
后来因为显示版面和日志的原因改成了8次

真要说起来
我接触的此类游戏中
游戏机和电视机的是不限次数的
录像机是限制了8次,并且不使用数字9和0
电脑的就很多样了

一个优秀的猜解算法
穷举算法应该就是次数最少的算法
但不是效率最高的
平均猜解次数应该是小于6次吧
设定8次也算中级难度吧

------------------------------------------------------

“感觉你的代码N 多``` ”
不明白,可以解释一下吗

[ Last edited by qzwqzw on 2007-9-25 at 03:05 PM ]

2007-9-25 14:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
jmz573515
银牌会员




积分 1212
发帖 464
注册 2006-12-13
状态 离线
『第 11 楼』:  

批处理我是写不出来了,发一个VBS的吧
dim a,b,cs,s
msgbox "游戏方法:" _
& vbcrlf & "    电脑随机产生一个四位十进制数字(开头的可以为0),猜10次。" _
& vbcrlf & "    每次返回AaBb" _
& vbcrlf & "    A表示数字正确并且位置正确" _
& vbcrlf & "    B表示数字正确但位置不正确" _
& vbcrlf & "    如:假设要猜的数字是1234" _
& vbcrlf & "    如果游戏者猜0134即返回A2B1(3、4为A,1为B)",4096+32,"猜数游戏"
do
    a=0:b=0:cs=0:sm=""
    while not pd(s)
    randomize
        s1=Int(10 * Rnd)
        s2=Int(10 * Rnd)
        s3=Int(10 * Rnd)
        s4=Int(10 * Rnd)
        s=s1 & s2 & s3 & s4
    wend
    'msgbox s
    do until cs=10
        do
            n=inputbox(sm & "请输入猜测数:(还有" & 10-cs & "次机会)","猜数游戏")
            if n=false then wscript.quit
            if len(n)<>4 then
                msgbox "位数不正确,请重新输入!",16+4096,"错误"
            elseif pdsz(n)=false then
                msgbox "输入的不是数字,请重新输入!",16+4096,"错误"
            elseif not pd(n) then
                msgbox "不能有重复的数字,请重新输入!",16+4096,"错误"
            else
                cs=cs+1:exit do
            end if
        loop
        call jg(n)
        if cs=10 and n<>s then msgbox "电脑随机数为:" & s & vbcrlf & "很遗憾,没有猜对,继续努力!",4096,"结果"
        if n=s then msgbox "电脑随机数为:" & s & vbcrlf & "第" & cs & "次猜测:" & n & vbcrlf & "结果:" & "A" & a & "B" & b,4096+48,"恭喜你,猜对了!":exit do
        sm=sm & "第" & cs & "次猜测:" & n & vbcrlf & "结果:" & "A" & a & "B" & b & vbcrlf & vbcrlf
    loop
    s=""
loop until msgbox("是否再来一遍?",vbyesno,"游戏结束")=vbno
function pd(a)
     my1=mid(a,1,1)
     my2=mid(a,2,1)
     my3=mid(a,3,1)
     my4=mid(a,4,1)
     pd=my1<>my2 and my1<>my3 and my1<>my4 and my2<>my3 and my2<>my4 and my3<>my4
end function

sub jg(r)
     a=0:b=0
     for i=1 to 4
         m=mid(r,i,1)
         h=mid(s,i,1)
         if m=h then
             a=a+1
         else
             if instr(s,m)<>0 then b=b+1
         end if
     next
end sub

function pdsz(a)
    l=len(a)
    for i=1 to l
        if isNumeric(mid(a,i,1)) then
            pdsz=true
        else
            pdsz=false:exit function
        end if
    next
end function
[ Last edited by jmz573515 on 2007-9-25 at 04:09 PM ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 dosmania 分数: +2  时间:2007-9-26 21:34


2007-9-25 15:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosmania
初级用户





积分 172
发帖 54
注册 2007-1-2
状态 离线
『第 12 楼』:  

呵呵``jmz573515 厉害,VBS互动性N 好
if len(n)<>4 靠``根本不能比嘛```VBS这个就搞定了位数``
不知jmz573515 对s1 s2 s3 s4 的重复可能性进行考虑没有```?

2007-9-26 14:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosmania
初级用户





积分 172
发帖 54
注册 2007-1-2
状态 离线
『第 13 楼』:  

re s11ss:
你的代码也完全符合要求```不知你对随机数重复的验证是哪些``

2007-9-26 14:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jmz573515
银牌会员




积分 1212
发帖 464
注册 2006-12-13
状态 离线
『第 14 楼』:  

dosmania:
if len(n)<>4 靠``根本不能比嘛```VBS这个就搞定了位数``
不知你说的是不能比是什么意思,我认为可以限定在4位啊??

不知jmz573515 对s1 s2 s3 s4 的重复可能性进行考虑没有```?

重复的可能性不知道你指的是什么?(你是说可能性有多大?还是说有可能重复?)
这里我只考虑了有可能重复所以做了判断,如果重复的话重新生成随机数,并没有考虑他的可能性有多大,也许效率不高...)

2007-9-26 15:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by dosmania at 2007-9-26 02:53 PM:
re s11ss:
你的代码也完全符合要求```不知你对随机数重复的验证是哪些``

随机数重复?
不明白你的具体意思.

反正我的代码是让随机数的4位数字不重复,至于随机数与随机数之间是否重复我并未控制,不过题目里好象也没有要求啊

2007-9-26 16:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: