问题描述
对于烂头背枪这个游戏,相信00后的同学并不陌生,这是幼时的回忆,这个游戏本身,有烂头,枪,虎,人,鸡,蜂总共六种角色,每种四个。对应规则为烂头背枪,枪打虎,虎吃人,人养鸡,鸡啄蜂,蜂叮烂头,前者为胜,后者为负,24个角色均分给多位玩家,然后出牌直到只剩一名玩家手中有角色时游戏结束。是一款适合双人,三人以及四人娱乐的游戏。而我今天写的就是关于这个游戏的双人的随机模拟玩法:24个角色均分给两位玩家,角色相克则负的一方角色交给胜的一方,胜的一方角色不弃,角色不相克则两个角色都弃,然后出牌直到只剩一名玩家手中有角色时游戏结束。
解决方案
对于这种比较复杂的题目,我们可以将问题数字化。将烂头,枪,虎,人,鸡,蜂记为1,2,3,4,5,6,有X和Y两位玩家,若X-Y=-1或者5,则X胜,X收Y的角色;若Y-X=-1或者5,则Y胜,Y收X的角色;否则都不胜,X和Y都弃掉本回合出的角色。
分糖果问题示例代码
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 |
结语
这道题启示我们下次遇到这类比较复杂的问题时,应该有一种化繁为简的思想,找出问题中的关键之处,试试数字化,就如同数学当中解决应用题一样。实际上,算法与编程是工具,设计算法并不是目的,解决实际问题才是目的。当然,本文也有不足之处,例如规则中的弃角色在原来的游戏中并不存在,应该是各自收回继续。但是,如果使用这个规则,将会有几万轮游戏,比本文几十轮游戏多太多。然后正常的游戏应该是两个玩家的斗智斗勇,比电脑的随机要精彩太多,这也是随机模拟的一大痛点,给我读者有好的解决方案吗?