读书人

扫雷游戏中的概率有关问题

发布时间: 2012-01-19 00:22:28 作者: rapoo

扫雷游戏中的概率问题
大家都玩过扫雷吧。点击鼠标出现一个数字代表周围隐藏的地雷数。

它的概率应该是
请问各位这种情况怎么分析?



如果出现的都是2呢?

[解决办法]
我晕。。那不是概率值,是周围8格里的雷的总数。

程序初始化的时候每个格是否是雷都已经随即设定好了的。
[解决办法]
下面那个图如果周围的方格都是未点开状态的话,单独看每一个方格还是 1/8
[解决办法]
1/6 1/6 1/6
1/6 1 1/6
0 0 0
1/6 1 1/6
1/6 1/6 1/6

重点是相邻点...2更简单,都是1/7...初始概率其实不重要,重要的是开一个以后的概率变化...
[解决办法]
那就在第一次点击的时候初始化雷的布局,如果点的那个位置正好是雷,再重新制定一个新的布局,直到点的那个位置不是雷的时候,再将周围8格的雷的总数显示出来。
[解决办法]

探讨
我当然知道那是雷的总数。可以通过总数算出概率嘛。
而且每个格子是否有雷,是在你点击了第一次都才初始化的。所以第一次点击永远不会有雷

[解决办法]
错了,更正...两个1那个还都是1/7...
[解决办法]
探讨

引用:
我当然知道那是雷的总数。可以通过总数算出概率嘛。
而且每个格子是否有雷,是在你点击了第一次都才初始化的。所以第一次点击永远不会有雷

如果是Windows那个扫雷,“第一次点击永远不会有雷”是瞎说...

[解决办法]
应该不好判断吧,因为不清楚周围是2个雷,还是1个雷,2个雷肯定在不结合的地方,1个雷出现在结合的地方。
[解决办法]
数晕了...1都是1/13,2都是2/13,初始概念都一样...
[解决办法]
开始游戏之前,你选难度,选好难度后还没点方块的时候,雷的总数不是显示出来了吗?雷的总数是固定的。

你那样每点一个格算下概率,太麻烦了吧。。我从来没想过扫雷会和概率搭上边。
[解决办法]
如果要计算出现1个雷或者2个雷的概率的话,那么就要清楚总共的雷数和未探索的方块总数了。
[解决办法]
探讨
开始游戏之前,你选难度,选好难度后还没点方块的时候,雷的总数不是显示出来了吗?雷的总数是固定的。

你那样每点一个格算下概率,太麻烦了吧。。我从来没想过扫雷会和概率搭上边。

[解决办法]
http://blog.csdn.net/xiamin/archive/2008/05/04/2374973.aspx
[解决办法]
就LZ最后那个图来说,下面那个1并未对判断上面那个1周围雷得分布提供任何线索,所以下面1不会影响上面1周围雷的布局,上面1周围有雷得几率还是1/8,同理,下面1周围也还是1/8
[解决办法]
探讨
引用:
开始游戏之前,你选难度,选好难度后还没点方块的时候,雷的总数不是显示出来了吗?雷的总数是固定的。

你那样每点一个格算下概率,太麻烦了吧。。我从来没想过扫雷会和概率搭上边。

对扫的人来说,碰运气的判断是有概率的...

[解决办法]
好吧...我还是错了,1、2都是1/8...初始概率都一样...

ps:这个概念是人碰运气的概率,和游戏程序无关的...


[解决办法]
探讨

好吧...我还是错了,1、2都是1/8...初始概率都一样...

ps:这个概念是人碰运气的概率,和游戏程序无关的...

[解决办法]
探讨
引用:

好吧...我还是错了,1、2都是1/8...初始概率都一样...

ps:这个概念是人碰运气的概率,和游戏程序无关的...

自定义游戏 9*9格 64 颗雷,第一下你也绝对点不到雷

[解决办法]
探讨

引用:
引用:

好吧...我还是错了,1、2都是1/8...初始概率都一样...

ps:这个概念是人碰运气的概率,和游戏程序无关的...

自定义游戏 9*9格 64 颗雷,第一下你也绝对点不到雷



我玩了十五六年扫雷,第一下踩到的不计其数...


[解决办法]
往后看,18楼以前的都错了...大脑一时短路了...
[解决办法]
两个2的话全部都是 1/4, 两个数不一样的话,概率才会复杂点
[解决办法]
探讨

而且是相关事件,不能按照独立事件的概率来分析。

[解决办法]
探讨

引用:

引用:

而且是相关事件,不能按照独立事件的概率来分析。

除非你能同时点开两个格,否则就是独立事件

我的意思在在没开之前就计算他的概率。跟开几格有什么关系。

[解决办法]
在这个 1-1的布局中,有 5/8的几率存在2个雷,有3/8的几率只有1个雷,所以整个区域可能存在的雷数是 5/8*2 + 3/8 = 13/8颗
[解决办法]
探讨
引用:

引用:

而且是相关事件,不能按照独立事件的概率来分析。

除非你能同时点开两个格,否则就是独立事件

我的意思在在没开之前就计算他的概率。跟开几格有什么关系。

[解决办法]
探讨
引用:
每一个格有没有雷跟其他格都没有关系,都是独立事件

我举个反例。

x点有没有雷是取决于 abcde有没有的雷。
如果abcde有的话 x点必然没有

[解决办法]
探讨

引用:
每一个格有没有雷跟其他格都没有关系,都是独立事件

我举个反例。

x点有没有雷是取决于 abcde有没有的雷。
如果abcde有的话 x点必然没有

[解决办法]
自动扫雷有算法可以计算出100%有雷的格子,但是光靠这些不能做出完全自动扫雷的程序来,LZ大概是想要计算概率,找出概率大的格,让程序自己点开吧
[解决办法]
探讨

哦 好吧。我错了。但是1/8还是值得推敲的

[解决办法]
这个概率是可以有的
最小值 0 ,最大值 1
0:绝对不是雷
1:绝对是雷
概率是变动的,没进行一次操作,都会引起概率变化
而且,每一个单元格的概率是独立的,但又依赖于其他单元格的挖开情况以及遗留地雷数目
初始的概率所有格都相同 : 地雷总数 / 单元格总数

假设,一个 9 * 9 的矩阵,有两个雷,我们假设为第一行的第二个和第三行的第二个
0 1 0
0 0 0
0 1 0
初始情况,假设一个都没挖开
2/9 2/9 2/9
2/9 2/9 2/9
2/9 2/9 2/9

挖开[2][2]

2/8 2/8 2/8
2/8 挖开 2/8
2/8 2/8 2/8

挖开 [1][1]

挖开 2/7 2/7
2/7 挖开 2/7
2/7 2/7 2/7

假设猜中第一行第二颗为雷

挖开 地雷 1/6
1/6 挖开 1/6
1/6 1/6 1/6

分支一:下一步猜中雷
挖开 地雷 0
0 挖开 0
0 地雷 0

分支二:挖开所有不是地雷的方格

挖开 地雷 挖开
挖开 挖开 挖开
挖开 1 挖开
[解决办法]
0100352D je short winmine.01003595 ; 是雷?
0100352F cmp dword ptr ds:[10057A4], 0
01003536 jnz short winmine.01003588
01003538 mov ebp, dword ptr ds:[1005338] ; 踩到雷,但是是第一次翻
0100353E xor eax, eax
01003540 inc eax
01003541 cmp ebp, eax
01003543 jle short winmine.010035B0
01003545 mov ebx, dword ptr ds:[1005334]
0100354B mov edi, winmine.01005360
01003550 /xor ecx, ecx
01003552 |inc ecx
01003553 |cmp ebx, ecx
01003555 |jle short winmine.01003562
01003557 |/test byte ptr ds:[edi+ecx], 80
0100355B ||je short winmine.0100356C
0100355D ||inc ecx
0100355E ||cmp ecx, ebx
01003560 |\jl short winmine.01003557
01003562 |inc eax
01003563 |add edi, 20
01003566 |cmp eax, ebp
01003568 \jl short winmine.01003550
0100356A jmp short winmine.010035B0
0100356C push dword ptr ss:[esp+18]
01003570 shl eax, 5
01003573 lea eax, dword ptr ds:[eax+ecx+1005340]
0100357A mov byte ptr ds:[edx], 0F


0100357D or byte ptr ds:[eax], 80
01003580 push esi
01003581 call <winmine.计算数字,递归>
01003586 jmp short winmine.010035B0
01003588 push 4C
0100358A push eax
0100358B push esi
0100358C call <winmine.踩到雷,将雷改成CC> ; 踩到雷
01003591 push 0
01003593 jmp short winmine.010035AB
01003595 push eax
01003596 push esi
01003597 call <winmine.计算数字,递归>
0100359C mov eax, dword ptr ds:[10057A4]
010035A1 cmp eax, dword ptr ds:[10057A0]
010035A7 jnz short winmine.010035B0
010035A9 push 1
010035AB call <winmine.最终显示,参数0表示失败,1表示成功>
总结一下:程序使用BYTE型的二维数组来存储每个块的状态信息,以为一个字节中的位信息来区分块的状态,根据上面的分析可得知:
已经翻开: test 0x40 不为零
为小红旗: 0x0E
为?状态: 0x0D
没有翻开: 0x0F
雷: 0x80
翻开后: 0x4+周围的雷数
踩到雷: 0xCC

鼠标左键写入点击的小块对应的内存,如果需要翻开则将其低位改成0。
鼠标右键则是将该小块的值在小红旗,?状态,空白状态之间进行转换,并更改显示的雷数。
鼠标的弹起处理则是通过鼠标按下确定的行和列的对应小块信息进行检测,如是第一次点击则启动定时器,如果点击的不是雷则计算该小块周围的雷数并翻开该小块,然后在递归计算旁边的小块。
如果为雷则显示出所有的雷,爆炸并GameOver。有个特列就是如果第一次点击就踩到雷则不会爆炸,而是将此处的雷转移到别处。

就是说,这个程序在设计上保证玩家不会遇到第一次翻就遇到地雷的情况,印象中Win95/98似乎有第一次遇到就炸死的情况,看起来MS一直在不断提升用户的体验。



意思是:如果翻开被炸,并且是第一次翻开,那么扫雷程序会自动将这个雷移走,再翻开。

换句话说:扫雷游戏第一次不可能被雷炸到(至少XP下的是这样的)

参考:

1.http://www.unpack.cn/thread-45365-1-1.html 【菜鸟贴】自己写的一个扫雷外挂

[解决办法]
1 1 情况, 如果只有一颗雷 那么其为1/3 如果有两颗,则要根据第一的位置判断~
[解决办法]
学习!!!
[解决办法]
扫雷一直玩大多数都是通关。不用作弊气
如上面两个1。共18个格子。
18个格子除了已知的两个1.和上1平行的。之上都是100%没有雷。
和下1平行的。之下都100%没有雷。
雷只存在中间那三个。如果是两个的话就麻烦一些。可以算出来的。
[解决办法]

探讨
扫雷一直玩大多数都是通关。不用作弊气
如上面两个1。共18个格子。
18个格子除了已知的两个1.和上1平行的。之上都是100%没有雷。
和下1平行的。之下都100%没有雷。
雷只存在中间那三个。如果是两个的话就麻烦一些。可以算出来的。

[解决办法]
看的晕晕的········
[解决办法]
重新初始化时,雷没有弄好,各位没有点第一下就爆的吧,点完第一下才初始化
[解决办法]
好............东西
[解决办法]
应该是八分之一吧
[解决办法]
这是数学题吧

读书人网 >C#

热点推荐