357小游戏的算法

liujingxiong 2004-10-24 06:05:20
我在华军软件园上下载一个小游戏,叫357,

软件下载页面
http://www.onlinedown.net/soft/360.htm

我发现只要是先下的都会输,不知道有哪位能下赢?怎么下?下赢的算法是怎么计算的?
...全文
1642 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujingxiong 2004-10-26
  • 打赏
  • 举报
回复
不对,看错了,"1247"和"1256"不是正常的序列。

"1", "22", "33", "44", "55", "111", "123", "145", "246", "257", "347", "356", "1122", "1133", "1144", "1155", "2222", "2233", "2244", "2345", "3333", "11111", "11123", "11145", "12223", "12333", "111122", "111133", "112222", "112233", "1111111", "1111123", "11111122"
liujingxiong 2004-10-26
  • 打赏
  • 举报
回复
突然发现多了两个"1247"和"1256"是先下必输的,重新整理

"1", "22", "33", "44", "55", "111", "123", "145", "246", "257", "347", "356", "1122", "1133", "1144", "1155", "1247", "1256", "2222", "2233", "2244", "2345", "3333", "11111", "11123", "11145", "12223", "12333", "111122", "111133", "112222", "112233", "1111111", "1111123", "11111122"
flyingscv 2004-10-25
  • 打赏
  • 举报
回复
我把总结结果说一下
先走的话,下面8个位置可以做到必胜(这个程序的智能有限,所以走其它位置也有赢的希望)
(3,1)(5,1)(7,1)(7,3)以及对称4个位置共8个

下2个或以上必输
当电脑认为自己必胜时就不随机下了,你可以利用这个判断电脑的智能是如何实现的

这个周末我把代码写出来
DemonLoveLizzy 2004-10-25
  • 打赏
  • 举报
回复
如果手工走的话,必输。因为第1步是随机走,所以我们才有赢的希望。
northwolves 2004-10-25
  • 打赏
  • 举报
回复
手误,下面三个先走必胜:

155-->145
1245->145
12234->12232

刚才是写了一个函数进行判断的,估计软件作者要是看到我的函数胜率会更高些:

Option Explicit

Private Sub Command1_Click()
Dim y, i As Integer
y = Array("1", "22", "33", "44", "55", "111", "123", "145", "155", "246", "257", "347", "356", "1122", "1133", "1144", "1155", "1245", "2222", "2233", "2244", "2345", "3333", "11111", "11123", "11145", "12223", "12234", "12333", "111122", "111133", "112222", "112233", "1111111", "1111123", "11111122")
For i = 0 To UBound(y)
If firstlose(y(i)) = False Then Debug.Print y(i)
Next
'MsgBox firstlose("357")
'MsgBox firstlose("1234567889999")
End Sub

Function firstlose(ByVal x As String) As Boolean '先走必败,x为0123456789按升序排列,如245237先手工排成223457
firstlose = False
Dim i As Integer, j As Integer
x = Replace(x, "0", "")
x = Replace(x, "11", "")
If x = "1" Then firstlose = True: Exit Function
For i = 2 To 9
x = Replace(x, i & i, "")
Next
If x = "" Then firstlose = True: Exit Function
Dim a() As String, b(1 To 4) As String, num As Integer
num = Len(x)
ReDim a(1 To num)
For i = 1 To num
a(i) = Choose(Val(Mid(x, i, 1)), "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001")
For j = 1 To 4
b(j) = (Val(b(j)) + Val(Mid(a(i), j, 1))) Mod 2
Next
Next
If Join(b, "") = "0000" Then firstlose = True
Erase b
End Function


northwolves 2004-10-25
  • 打赏
  • 举报
回复
to liujingxiong(北极熊):
小弟不才,实在等不到 flyingscv(zlj) 周末把代码写出来了,我就自己用穷举法把所有的可能都列了出来,把它们分为两部分:先下必胜序列(如:11、12等)和先下必输序列(如:22、123等)。

现在我把先下必输序列全部列出来,各位看一下其中有那些是先下可以取胜的,请列出取胜步骤。

"1", "22", "33", "44", "55", "111", "123", "145", "155", "246", "257", "347", "356", "1122", "1133", "1144", "1155", "1245", "2222", "2233", "2244", "2345", "3333", "11111", "11123", "11145", "12223", "12234", "12333", "111122", "111133", "112222", "112233", "1111111", "1111123", "11111122"

------------------------------------
下面三个先走必败

155-->145
1245->145
12234->12232

northwolves 2004-10-25
  • 打赏
  • 举报
回复
小时玩的是369,先走必迎
liujingxiong 2004-10-25
  • 打赏
  • 举报
回复
在我发的另外一个帖子里有高手编出解法了,不知道是否正确?

http://community.csdn.net/Expert/topic/3486/3486324.xml?temp=.4289362
liujingxiong 2004-10-25
  • 打赏
  • 举报
回复
好象中间的"155"是必胜序列的,我发现必输序列里的规律:就是它们不能互相转换的,不管怎么走都会变为必胜序列。
liujingxiong 2004-10-25
  • 打赏
  • 举报
回复
我只总结得出:只要留下偶数行而且两两之间数目相等的(1111除外),先下的必输。
liujingxiong 2004-10-25
  • 打赏
  • 举报
回复
多谢 flyingscv(zlj) 和 DemonLoveLizzy(魑魅魍魉)(DavidGuo)(郭大炜) 举出赢的例子。

不知道是否可以写出好的智能算法?
flyingscv 2004-10-25
  • 打赏
  • 举报
回复
哈,这都列出来了,那还不百战百胜

不是必输的肯定就是必胜的,序列没有357,说明先下可以必胜

走法就是每次要给电脑生成个必输序列
比如第一步走3-1=2就是划去(3 1),将产生"257" 必输序列
这样程序没有取胜机会,将随机走一步,比如5-2=3,将会生成237必胜序列给你
你就可以走7-6=1生成123必输序列给它
或者7-2=2+3生成2233必输序列
然后...就赢啦
junki 2004-10-25
  • 打赏
  • 举报
回复
有意思,回家也玩一玩。
liujingxiong 2004-10-25
  • 打赏
  • 举报
回复
小弟不才,实在等不到 flyingscv(zlj) 周末把代码写出来了,我就自己用穷举法把所有的可能都列了出来,把它们分为两部分:先下必胜序列(如:11、12等)和先下必输序列(如:22、123等)。

现在我把先下必输序列全部列出来,各位看一下其中有那些是先下可以取胜的,请列出取胜步骤。

"1", "22", "33", "44", "55", "111", "123", "145", "155", "246", "257", "347", "356", "1122", "1133", "1144", "1155", "1245", "2222", "2233", "2244", "2345", "3333", "11111", "11123", "11145", "12223", "12234", "12333", "111122", "111133", "112222", "112233", "1111111", "1111123", "11111122"
flyingscv 2004-10-25
  • 打赏
  • 举报
回复
如果直接去掉2个以上,你肯定就死了
电脑在2个环去掉之后就采用智能判断了,开始走一步电脑才会随机走一步
DemonLoveLizzy 2004-10-25
  • 打赏
  • 举报
回复
//是走其它位置必输,程序电脑并不给机会
想赢开始只能走那8个位置//

是么?直接去掉第1行、第3行都可以赢。
它第1步随机走的证明就是:
你直接去掉第3行,它会划去第2行的倒数第2个,你只要划掉第2行最右边的就赢了。道理就是,如果它直接划去那2个,输的就是我们了。
RUKYO 2004-10-25
  • 打赏
  • 举报
回复
今晚同学在婚宴上被灌醉了,路过此地就留个记号吧吧吧吧吧吧吧吧吧吧吧吧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BlueBeer 2004-10-25
  • 打赏
  • 举报
回复
不会玩,哪是什么益智游戏啊,我怎么越玩越傻,有一盘不知道怎么赢的,过程竟然不记得,不能再现了@_@
flyingscv 2004-10-25
  • 打赏
  • 举报
回复
是走其它位置必输,程序电脑并不给机会
想赢开始只能走那8个位置
DemonLoveLizzy 2004-10-24
  • 打赏
  • 举报
回复
开始可以直接去掉第1行或第3行。注意到最后留2行连续2个的圈圈(也就是4个圈圈)给它,就赢了。根本不费脑子么。
加载更多回复(4)

742

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧