设为首页收藏本站喵玉殿官方微博

 找回密码
 少女注册中
搜索
查看: 10123|回复: 6

[编程算法] 用VB自編的彷製遊戲(附遊戲程式,遊戲本體,程式碼)

[复制链接]
发表于 2014-9-1 18:39:10 | 显示全部楼层 |阅读模式
本帖最后由 Capt.Murasa 于 2014-9-1 18:39 编辑

此遊戲的原形是經典網遊Neopets的「移形大法」東方大法好。我還未入東方,是小學生的時候,就是碰Neopets。
彷製遊戲載點於最底

遊戲網址(需注册):
http://www.neopets.com/medieval/shapeshifter_index.phtml


       
                       
       


本彷製遊戲截圖:
p6.jpg
(渣遊戲介面......要嘖的請輕嘖)



概括的遊戲規則:使用全部的紅色拼圖(本遊戲為綠色)來轉換方格,令全部方塊的圖案變成為劍(本遊戲為α)。
       
                       
       




       
                       
       




       
                       
       





game,程式載點:

https://bbs.nyasama.com/forum.php?mod=attachment&aid=Njk3NjJ8NTc0N2FhNGF8MTc2MTg5ODQwOHwwfA%3D%3D

程式碼(textbook) :

https://bbs.nyasama.com/forum.php?mod=attachment&aid=Njk3ODR8ZWY1Y2QzNzZ8MTc2MTg5ODQwOHwwfA%3D%3D

載點又傲嬌了=.=....求修正








点评

是否需要.NET Framework,注明一下(少部分机器没安)  发表于 2014-9-1 18:52

评分

参与人数 1积分 +5 喵玉币 +20 萌度 +60 收起 理由
drzzm32 + 5 + 20 + 60 高质量发帖,研究VB的人,不多,我是其中一.

查看全部评分

发表于 2014-9-1 18:46:39 | 显示全部楼层
本帖最后由 drzzm32 于 2014-9-2 18:21 编辑

直接复制链接打开即可。。。貌似论坛抽了?

.NET Framework 4.0需求

PS:为何我看不懂这个游戏啊。

Block Game.rar

216.91 KB, 下载次数: 263

本体

block game鲁脤脢陆麓a(TEXT).rar

3.92 KB, 下载次数: 253

SRC

点评

知道了,需要4.0版本  发表于 2014-9-1 20:21
Visual Basic 2010 ,應該要.NET framework  发表于 2014-9-1 18:56
回复

使用道具 举报

发表于 2014-9-1 21:50:59 | 显示全部楼层
VB大法好
回复

使用道具 举报

发表于 2014-9-2 16:38:56 | 显示全部楼层
hihihi,楼主你好我又过来玩了~

看到这种 A->B->A 的点阵和变换,ofz 第一想到的算法是二进制编码然后做位运算呢。因为闲着就跑过去注册玩了一下,发现核心算法的逻辑确实很简单,于是就有了下面这些仿制品:
3x3 点阵 http://jsfiddle.net/cm3vzfog/1/
33.JPG
4x3 点阵 http://jsfiddle.net/cm3vzfog/2/
43.JPG
稍微有点吓人的 6x5 点阵 http://jsfiddle.net/cm3vzfog/3/
65.JPG


楼主在原帖里讨论的 Interface,MustInherit 等概念,更多的是属于“设计模式”范畴的东西。关于逻辑和算法,我来补充几点吧


1. 特定位置的位翻转:使用 mask 做异或运算
异或运算的基本规则非常简单,先看一位二进制的情况(^ 表示异或算符 xor)
bit ^ mask = bit2
1 ^ 0 = 1 (mask 为 0,不翻转)
0 ^ 0 = 0 (mask 为 0,不翻转)
1 ^ 1 = 0 (mask 为 1,1 翻转为 0)
0 ^ 1 = 1 (mask 为 1,0 翻转为 1)推广到多位二进制数的时候,只要对齐再各自对每一位做运算就好了,像
num ^ mask = num2
010 ^ 100 = 110 (只翻转第一位)
010 ^ 110 = 100 (翻转一二位)
就是这么简单的规则哟

接下来,异或运算如何与游戏联系起来呢?拿这张图来说
blk1x1.JPG
只看第一行: OXX 可以编码为 011
如果要放一个 1x1 的 mask 到左上角使点阵翻转,用下面式子来表示

011 ^ 100 = 111 (变成了 XXX)
放到上面中间就是
011 ^ 010 = 001 (OOX)
放到上面右边则是
011 ^ 001 = 010 (OXO)
其他行也类似。这就是游戏的基本规则。

2. 从二进制数到点阵:填 0 移位
blk.JPG
上面使用的是 1x1 的 mask,只需要考虑一行的情况,如果是如上图红色标注的 2x2 mask 应该如何处理呢?这边用到了一点技巧
首先考虑整个 3x3 点阵,需要用三个二进制数编码 010,001 和 110;然后那个 2x2 mask 需要用两个二进制数 11 和 10,这几个数是不好直接做异或运算的。我使用的方法是把 mask 右边和下面补上 0,填充为和源点阵一样的大小(3x3),即
11   ->    110
10   ->    100
       ->    000
由于异或是位与位之间的运算,所以直接把三个二进制数合并成一个二进制数计算也是没问题的
合并后的点阵:010001110
合并后的mask:110100000
翻转后结果:010001110 ^ 110100000 = 100101110(第一行XOO,第二行XOX,第三行XXO)

好像有什么地方不对?是的,这样子将两个数对齐作异或,相当于直接把 mask 放到了点阵的左上角。为了得到上图所示的结果,我们需要把点阵与 mask 错开几位再计算。这可以用移位运算符来做(左移 << 和右移 >>)。因为是 3x3 的点阵,将 mask 向下移一行相当于把 mask 向右移 3 位
翻转后结果:010000110 ^ (110100000 >> 3) = 010111010(OXO,XXX 和 OXO)

如果到这一步能够理解的话,相信你也就可以把整个游戏的核心逻辑写出来了(以下是 javascript)
function applyFlip(num, mask, i, j) {
    return num ^ (mask >> (i * M + j))
}

只有一行代码的函数?嗯,只需要一行就够了

3. 出题
结合上面的解释,用数学逻辑来表述题面的话应该是这样:给你一个二进制数 X 和几个 mask (A, B, C...),使用移位和异或运算使
X ^ (A >> a) ^ (B >> b) ^ ... = 所有位上全是 0 或 全是 1 的二进制数(即 0 或 ~0)
求解的过程本质上就是在求 a, b, c... 这些系数

在出题的时候,重点是要得到一个合理的 X。这边需要提到异或运算的两个性质
1) 异或运算不分先后:X ^ A ^ B = X ^ B ^ A
2) 两次与同一个数异或将使其效果抵消:X ^ A ^ A = X
假设我们从 0 开始(~0 也一样),随机找几个 mask 做异或,可以得到
0 ^ A ^ B ^ ... = X
根据上面两个性质,把 X 再做相同的异或运算(不分顺序),肯定能够重新得到 0
X ^ A ^ B ^ ... = 0
相信你已经想到了,出题的方法就是从 0 (或~0)开始,随机找几个 mask (A, B, C...) 并加上 随机的偏移 (a, b, c...) 做异或运算,最后把得到的 X 和用到的 A, B, C... 告诉做题的人,让他们去猜 a, b, c... 就可以啦
注意:a, b, c...的选择虽然随机,但是有一定的限制范围,并非随便找一个数就可以的(这个限制将是暴力求解的基础)

4. 求解
这边我只讲一下暴力求解的思路。前面提到偏移量 a, b, c... 的限制从何而来?

现在有一个 2x2 的 mask,把它放到 3x3 的点阵里,有几种放法?答案是 (3 - 2 + 1) * (3 - 2 + 1) = 4,mask 的位偏移只能是 0, 1, 3, 4 这几个数;类似的,把一个 1x3 的 mask 放到 3x3 的点阵里,可能的偏移只有(3 - 1 + 1) * (3 - 3 + 1) = 3 种,即 0, 1, 2 这三个值;即使是 1x1 的 mask,最多也只有 9 种放法。由于这些值都是有限的,我们可以尝试穷尽这些所有的可能性,只要检测到结果是 0 或者 ~0 就算成功了。假设是 3x3 的点阵,有 5 个 mask,那么最差的情况也就是计算 9 的 5 次方(59049)种可能性而已哦(而且最差的情况对人类反倒是最简单的说


总结
因为一直不停地有人来找我,写这个帖子的时间比我抠代码的时间多了好几倍...不想总结啦啊啊啊

点评

其實我也說過,方格圖形不一定只有兩種,所以要再有更高的難度的話,那可以有3種﹑5種﹑或者10種,從二進制推廣至n進制,拼圖數目愈多,拼圖擺放的可能位置及組合愈多.......總至,感謝您試玩和高質量回帖!!!  发表于 2014-9-2 17:50
回复

使用道具 举报

发表于 2014-9-12 19:46:12 | 显示全部楼层
楼上大触~
vb6默默路过
回复

使用道具 举报

发表于 2014-9-13 20:44:56 | 显示全部楼层
下来看看先...
回复

使用道具 举报

发表于 2014-9-14 02:44:28 来自手机 | 显示全部楼层
移形大法啊...
到后面的关卡全都是人类无法做到的恐怖难度所以游戏设计者这样设计真的没问题吗?

点评

网上是有现有的,简单粗暴的穷举法...  发表于 2014-9-14 22:18
我相信到了後面的關卡,玩家應該會把問題交給電腦解決....只差解決問題的程式應該怎麼寫?  发表于 2014-9-14 14:05
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|无图版|手机版|小黑屋|喵玉殿

GMT+8, 2025-10-31 16:13

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表