|
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
状态 离线
|
|
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
状态 离线
|
|
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 ]
|
|
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 ]
|
|
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 |
|