分享

算法创作|烂头背枪双人情况游戏随机模拟

 算法与编程之美 2021-04-22

问题描述

对于烂头背枪这个游戏,相信00后的同学并不陌生,这是幼时的回忆,这个游戏本身,有烂头,枪,虎,人,鸡,蜂总共六种角色,每种四个。对应规则为烂头背枪,枪打虎,虎吃人,人养鸡,鸡啄蜂,蜂叮烂头,前者为胜,后者为负,24个角色均分给多位玩家,然后出牌直到只剩一名玩家手中有角色时游戏结束。是一款适合双人,三人以及四人娱乐的游戏。而我今天写的就是关于这个游戏的双人的随机模拟玩法:24个角色均分给两位玩家,角色相克则负的一方角色交给胜的一方,胜的一方角色不弃,角色不相克则两个角色都弃,然后出牌直到只剩一名玩家手中有角色时游戏结束。

解决方案

对于这种比较复杂的题目,我们可以将问题数字化。将烂头,枪,虎,人,鸡,蜂记为123456,有XY两位玩家,若X-Y=-1或者5,则X胜,XY的角色;若Y-X=-1或者5,则Y胜,YX的角色;否则都不胜,XY都弃掉本回合出的角色。

分糖果问题示例代码

import randomattr = ["烂头", "", "", "", "", ""]

attr1 = attr * 4  # 每种角色四个

person1_list = []

person2_list = []

for i in range(0, int(len(attr1) / 2)):  # 两个人平分

x = random.choice(attr1)

person1_list.append(x)

attr1.remove(x)

y = random.choice(attr1)    

person2_list.append(y)

print("初始牌组随机选择完成:")

print("person1初始牌组:",end=")

print(person1_list)

print("person2初始牌组:",end=")

print(person2_list)

count = 1

while 1:

print("--------------------------------")

print("{}".format(count))    

print("--------------------------------")    

x = random.choice(person1_list)  # 1出牌,随机选择牌    

y = random.choice(person2_list)  # 2出牌,随机选择牌    

print("person1出牌{}".format(x))    

print("person2出牌{}".format(y))    

x_int = attr.index(x)  # x的索引    

y_int = attr.index(y)  # y的索引    

# print(x_int)    

# print(y_int)     

’’’

逻辑如下:    

x==y 即出牌一致,两人弃牌   

(x_int - y_int == -1) or x_int - y_int == 5 1赢,收2    

 2赢,收1    

两人出牌没有关联,弃牌

’’’

if x == y:  # 一致则放至牌堆        

print("两人出牌一致,都是{},弃牌".format(x))        

person1_list.remove(x)        

person2_list.remove(y)        

print("person1牌组:", end=")        

print(person1_list)        

print("person2牌组:", end=")        

print(person2_list)    

elif (x_int - y_int == -1) or x_int - y_int == 5:  # 1        

person1_list.append(y) # 1收牌        

person2_list.remove(y) # 2弃牌 完成逻辑2牌给1        

print("person1,收牌,现在牌组为:", end=")        

print(person1_list)        

print("person2牌组为:", end=")        

print(person2_list)    elif (y_int - x_int == -1) or y_int - x_int ==5:  # 2        

person2_list.append(x) # 同上        

person1_list.remove(x)        

print("person2,收牌,现在牌组为:", end=")

print(person2_list)        

print("person1牌组为:", end=")        

print(person1_list)    

else:  # 其它情况也弃牌        

print("不输不赢,弃牌")        

person1_list.remove(x)        

person2_list.remove(y)        

print("person1牌组:", end=")        

print(person1_list)        

print("person2牌组:", end=")        

print(person2_list)    

if len(person1_list) == 0 or len(person2_list) == 0:        

print("游戏结束", end=")        

print("--------------------------------")        

if len(person1_list) == 0:            

print("person2,最终牌组为", end=")            

print(person2_list)           

break        

else:            

print("person1,最终牌组为", end=")            

print(person1_list)

break

  count += 1

结语

这道题启示我们下次遇到这类比较复杂的问题时,应该有一种化繁为简的思想,找出问题中的关键之处,试试数字化,就如同数学当中解决应用题一样。实际上,算法与编程是工具,设计算法并不是目的,解决实际问题才是目的。当然,本文也有不足之处,例如规则中的弃角色在原来的游戏中并不存在,应该是各自收回继续。但是,如果使用这个规则,将会有几万轮游戏,比本文几十轮游戏多太多。然后正常的游戏应该是两个玩家的斗智斗勇,比电脑的随机要精彩太多,这也是随机模拟的一大痛点,给我读者有好的解决方案吗?

实习编辑:王晓姣

作者:陈鱼江、肖华、冯睿

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多