Board logo

标题: 猜数字游戏[game's over] [打印本页]

作者: dosmania     时间: 2007-9-21 15:25    标题: 猜数字游戏[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 ]

作者: dosmania     时间: 2007-9-24 15:04
我狂汗啊``怎么没人研究啊``

作者: bjsh     时间: 2007-9-24 16:55
这个挺有意思的;
只是这段时间比较忙没时间;

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

作者: vkill     时间: 2007-9-24 16:57
很早就有人写了个猜数字的游戏,在那个上面稍微修改下就可以的

作者: HAT     时间: 2007-9-24 21:43
我以前写了个C语言版的
有时间把它转成批处理

作者: dosmania     时间: 2007-9-25 03:37
re bjsh:
期待版主的思路吖````

re vkill:

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

re HAT:

把代码贴上来

作者: qzwqzw     时间: 2007-9-25 11:20
作者: dosmania     时间: 2007-9-25 14:15
re qzwqzw:

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

作者: s11ss     时间: 2007-9-25 14:37
@echo off
setlocal enabledelayedexpansion
::::::::::::::::::::::::::: 猜数字游戏 :::::::::::::::::::::::::::
:::::::::::::::::::::::::::{s11ss 2007-9-25}:::::::::::::::::::::::::::
:Begin
set/a counter=1
:GetStr
echo 请输入一个四位数:
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 ]

作者: qzwqzw     时间: 2007-9-25 14:50
dosmania:
我承认那个猜解算法确实有些蹩脚
毕竟只是一个闲暇之余的R1而已

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

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

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

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

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

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

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

作者: jmz573515     时间: 2007-9-25 15:56
批处理我是写不出来了,发一个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 ]

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

作者: dosmania     时间: 2007-9-26 14:53
re s11ss:
你的代码也完全符合要求```不知你对随机数重复的验证是哪些``

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

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

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

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


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

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

作者: 26933062     时间: 2007-9-26 21:03

@echo off
set count=10&set ci=1
:loop
set /a ss=%random%%%9+0
for %%n in (%var%) do if "%ss%" == "%%n" goto loop
set var=%var% %ss%
set /a b+=1
if %b% lss 4 goto loop
set var=%var: =%
:lis
if %count% equ 0 goto tui
set wei=0
set dui=0
set num=
cls
echo.&echo 请输入4位不重复的数字
if %ci% neq 1 (
echo.&echo 你以前输入的结果是&echo.
for /f "tokens=2 delims==" %%a in ('set _') do set/p= %%a <nul
)
echo.
set /p num=
if "%num%"=="" goto lis
cls
if not "%num:~3,1%"=="" (if not "%num:~4,1%"=="" goto weic) else goto weic
echo %num%|findstr "^*$">nul||goto csz

set "b=%num:~0,1% %num:~1,1% %num:~2,1% %num:~3,1%"
set w=0
for %%a in (%b%) do (
for %%i in (%b%) do if %%a==%%i set/a w+=1
set/a w-=1
)
if %w% neq 0 goto cf

set/a count-=1
echo.&echo 随机数字是 %var%
echo.&echo 玩家输入的是 %num%
if "%var%"=="%num%" set jie=a4b0&goto ok
set "a=%var:~0,1% %var:~1,1% %var:~2,1% %var:~3,1%"
set "b=%num:~0,1% %num:~1,1% %num:~2,1% %num:~3,1%"
for %%a in (%a%) do (
for %%b in (%b%) do (
if "%%a"=="%%b" set/a dui+=1
))
if "%var:~0,1%"=="%num:~0,1%" set/a wei+=1
if "%var:~1,1%"=="%num:~1,1%" set/a wei+=1
if "%var:~2,1%"=="%num:~2,1%" set/a wei+=1
if "%var:~3,1%"=="%num:~3,1%" set/a wei+=1
set/a dui=dui-wei
if "%dui%" lss "0" set dui=0
set _jie%ci%=%num% A%wei%B%dui%
echo.&echo 你猜的结果是 A%wei%B%dui%
echo.&echo 你还有%count%次机会 你已经输入了%ci%次
set/a ci+=1
echo.&pause
goto lis
:ok
color f9
echo.&echo 你输入了%ci%次 猜对了%jie%
echo.&pause
exit
:weic
echo.&echo 你输入的位数不对,应该是4位.
echo.&pause
goto lis
:csz
echo.&echo 你输入的不是纯数字
echo.&pause
goto lis
:cf
echo.&echo 你输入的有重复的数字
echo.&pause
goto lis
:tui
cls&echo 你10次都猜错了
pause

作者: dosmania     时间: 2007-9-26 21:05
to s11ss:
我问的就是随机四位数字每位重复不``现在明白``勿多说``