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

问题描述对于烂头背枪这个游戏,相信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 = 1while 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牌给1print("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)breakelse:print("person1赢,最终牌组为", end=")print(person1_list)breakcount += 1结语这道题启示我们下次遇到这类比较复杂的问题时,应该有一种化繁为简的思想,找出问题中的关键之处,试试数字化,就如同数学当中解决应用题一样。实际上,算法与编程是工具,设计算法并不是目的,解决实际问题才是目的。当然,本文也有不足之处,例如规则中的弃角色在原来的游戏中并不存在,应该是各自收回继续。但是,如果使用这个规则,将会有几万轮游戏,比本文几十轮游戏多太多。然后正常的游戏应该是两个玩家的斗智斗勇,比电脑的随机要精彩太多,这也是随机模拟的一大痛点,给我读者有好的解决方案吗?实习编辑:王晓姣作者:陈鱼江、肖华、冯睿

(0)

相关推荐

  • UC头条:聊聊python中的list——基本操作

    在学习数据结构的时候,从老师和同学口中得知了python中用于实现线性表的list(列表).在查阅相关资料后,感觉这真是一个有趣又好用的数据结构.于是打算写几篇博客,加深对list原理和使用方法的理解 ...

  • 算法创作|神奇语言问题解决方法

    问题描述一位同学正在学习一门神奇的语言,其中的单词都是由小写英文字母组成,有些单词很长,而这位同学一直记不住,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现的最多来分辨单词,现在请帮助这位同学 ...

  • 算法创作|规则数列计算解决方法

    问题描述如下图所示,小明用从 1 开始的正整数"蛇形"填充无限大的矩阵.1 2 6 7 15 -3 5 8 14 -4 9 13 -10 12 -11 --(1)容易看出矩阵第二行 ...

  • 算法创作|阶梯电价问题解决方法

    问题描述为了提倡居民节约用电,某省电力公司执行"阶梯电价",安装一户一表的居民用户电价分为两个"阶梯":月用电量50千瓦时(含50千瓦时)以内的,电价为0.53 ...

  • 算法创作 | 0到n-1中缺失的数字问题解决方法

    问题描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字.示例1:输入:[0,1,3 ...

  • 算法创作|找出游戏的获胜者问题解决方法

    问题描述共有 n 名小伙伴一起做游戏.小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号.确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i ...

  • 算法创作 | 二叉树遍历问题解决方法

    问题描述二叉树的先序遍历.中序遍历.后序遍历怎么求?解决方案给你一个二叉树(如图)那么怎么找出它的先序遍历.中序遍历.后序遍历呢?我们先看一个简单二叉树来了解它的概念. 所谓前序,中序,后序就是指根所 ...

  • 算法创作|“画雪人”问题解决方法

    问题描述示例:运用Turtle画出一个戴帽子的雪人在你门前,我堆起一个雪人,代表笨拙的我,把你久等...解决方案掌握turtle库,you can do you want.代码清单 1 DFS求解1到 ...

  • 算法创作|打家劫舍

    问题描述在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根".除了"根"之外,每栋房子有且只有一个&q ...

  • 算法创作 | 将数字变成 0 的操作次数

    问题描述给你一个非负整数 num ,请你返回将它变成 0 所需要的步数.如果当前数字是偶数,你需要把它除以 2 :否则,减去 1 .为了方便理解题意,下面给出两个示例:示例 1:输入:num = 14 ...