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

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

问题描述

对于烂头背枪这个游戏,相信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


结语

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

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 测试技术
【动态规划】【C++算法】1563 石子游戏 V
【动态规划】【C++算法】1563 石子游戏 V
|
2月前
|
算法 测试技术 vr&ar
【动态规划】【C++算法】1340. 跳跃游戏 V
【动态规划】【C++算法】1340. 跳跃游戏 V
|
3月前
|
机器学习/深度学习 存储 算法
手写决策树算法——基于决策树的XX联盟游戏胜负预测
手写决策树算法——基于决策树的XX联盟游戏胜负预测
40 0
|
3月前
|
搜索推荐 算法 C++
小朋友的游戏(训练排序算法)
小朋友的游戏(训练排序算法)
15 0
|
3月前
|
算法 Java 测试技术
[Java·算法·中等] LeetCode 45. 跳跃游戏 II 详细解读
[Java·算法·中等] LeetCode 45. 跳跃游戏 II 详细解读
28 0
|
4月前
|
机器学习/深度学习 算法
深度强化学习中Double DQN算法(Q-Learning+CNN)的讲解及在Asterix游戏上的实战(超详细 附源码)
深度强化学习中Double DQN算法(Q-Learning+CNN)的讲解及在Asterix游戏上的实战(超详细 附源码)
103 0
|
4月前
|
算法 开发工具 索引
三消游戏查找算法的原理和实现
三消游戏查找算法的原理和实现
69 1
|
4月前
|
算法
泡泡龙游戏开发实战教程(5):核心查找匹配算法
泡泡龙游戏开发实战教程(5):核心查找匹配算法
50 0
|
4月前
|
算法
六六力扣刷题贪心算法之跳跃游戏
六六力扣刷题贪心算法之跳跃游戏
22 0
|
4月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 174. 地下城游戏 算法解析
☆打卡算法☆LeetCode 174. 地下城游戏 算法解析