转珠游戏(如神魔之塔等)高Combo路径计算器

By jerryxjr1220 at 2021-09-21 • 0人收藏 • 145人看过

不知道有没有人玩过转珠类游戏,比如神魔之塔这种。

20140307121013098.jpg

它的核心玩法就是在6×5的棋盘上通过一次性移动珠子使得不同颜色的珠子连成3个或以上的直排或横排即可发生消除。

千万别以为是简单的消消乐游戏,其实要达成高Combo(一般5连击以上)还是挺有难度的。

于是,想到了让程序通过穷举法来计算高Combo的路径。

先上Python的代码:

#coding: utf-8
import copy
import time

mx = [
[0,0,1,0,3,2],
[0,2,3,4,1,1],
[3,2,2,1,3,5],
[3,3,1,4,4,5],
[0,3,1,4,5,0],
]

class ZhuanZhu():
def __init__(self, m):
self.m = m
self.max = 0
self.step = 0
self.optimization = []
#self.visited = [m]
self.history = [[m, [(i, j)]] for i in range(5) for j in range(6)]

def move(self):
dir = [(0,1),(1,0),(0,-1),(-1,0)]
history = copy.deepcopy(self.history)
self.history = []
while history:
each = history.pop()
m = each[0]
path = each[1]
pos = path[len(path)-1]
x, y = pos
for d in dir:
dm = copy.deepcopy(m)
dp = copy.deepcopy(path)
nx, ny = x+d[0], y+d[1]
if nx<0 or nx>4 or ny<0 or ny>5:
continue
if (nx, ny) in path:
continue
tmp = dm[nx][ny]
dm[nx][ny] = dm[x][y]
dm[x][y] = tmp
#if dm not in self.visited:
self.step += 1
#self.visited.append(dm)
dp.append((nx,ny))
self.history.append([dm, dp])

def judge(self):
most = 0
maxcount = []
for each in self.history:
m = each[0]
path = each[1]
count = 0
for row in m:
c = 1
for i in range(1,6):
if row[i] == row[i-1]:
c += 1
else:
if c>=3:
c += 1
else:
c = 1
continue
if i == 5 and c>=3:
count += 1
for row in [[m[i][j] for i in range(5)] for j in range(6)]:
c = 1
for i in range(1,5):
if row[i] == row[i-1]:
c += 1
else:
if c>=3:
c += 1
else:
c = 1
continue
if i == 4 and c>=3:
count += 1
if count > most:
most = count
maxcount = each
self.max = most
self.optimization = maxcount

def print(self):
m = copy.deepcopy(self.m)
opt = self.optimization[0]
path = self.optimization[1]
for x,y in path:
m[x][y] = "*"
print("初始:")
for row in self.m:
for e in row:
print(e, end=" ")
print()
print(f"最大连击Combo数:{self.max}")
print("最优解:")
for row in opt:
for e in row:
print(e, end=" ")
print()
print(f'路径:{path}')
for row in m:
for e in row:
print(e, end=" ")
print()
print(f'总共模拟了:{self.step}种组合')


t = time.time()

zz = ZhuanZhu(mx)
for r in range(8):
zz.move()
zz.judge()
zz.print()

print(f"用时:{int(time.time()-t)}秒")

执行结果:

pi@raspberrypi:~/Documents/Python Projects $ /bin/python3 "/home/pi/Documents/Python Projects/zhuanzhu.py"

初始:

0 0 1 0 3 2 

0 2 3 4 1 1 

3 2 2 1 3 5 

3 3 1 4 4 5 

0 3 1 4 5 0 

最大连击Combo数:5

最优解:

0 0 0 1 3 2 

0 2 3 0 1 1 

3 2 1 4 3 5 

3 2 1 4 4 5 

3 3 1 4 5 0 

路径:[(4, 0), (3, 0), (3, 1), (2, 1), (2, 2), (2, 3), (1, 3), (0, 3), (0, 2)]

0 0 * * 3 2 

0 2 3 * 1 1 

3 * * * 3 5 

* * 1 4 4 5 

* 3 1 4 5 0 

总共模拟了:48310种组合

用时:18秒


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
加入本站专享群:783804676
AARDIO语言QQ大群:70517368
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
C大Aardio论坛:Aar爱好者论坛
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
赞助商:才仁机械




Loading...