前言

本文描述的是在控制台上完成三人及以上的石头剪刀布小游戏的方法和思路,具体代码暂不提供。 (规则是输了的退出,留下一人为最后的赢家)

主要分为 两个步骤,一个问题 


步骤一 创建对象以及确定其输出的类型

有多少人参与,就有多少个对象,由于游戏的过程中自己不知道其他人会出些什么,所以在这里除自己是可输入的以外,其他都有电脑随机输出,因此要导入模块。

另外可以用一个类完成也可以多写几个类,这里以一个类来分析。


导模块

import random

创类,创对象

class Game:

def player(self): # 自己
pl = input("石头or剪刀or布")
return pl

def computer(self): # 电脑
choices = ["石头", "剪刀", "布"]
computer = random.choice(choices)
return computer
quantity = int(input("有几个人参与?"))
use = {}
for i in range(quantity):
t = Game()
if i == 0:
use[i] = t.player()
else:
use[i] = t.computer()

采用字典的形式,key为谁(0为自己,其他都为电脑),value为对应所出的类型。


步骤二 定义规则

基本思路:1,分组(一样的在一个列表里)2,以组为单位根据规则判断输赢

3,用递归的思路实现平局重出

def rule(self, user):

ls1 = []
ls2 = []
ls3 = []

print(f"d{user}")
for k, v in user.items():
if v == '石头':

ls1.append(k)

elif v == '布':

ls2.append(k)

elif v == '剪刀':

ls3.append(k)
print(ls1)
print(ls2)
print(ls3)

# ls1 石头,ls2 布, ls3 剪刀
if len(ls1) == 0: # 出石头的人数为0
if len(ls3) == 1: # 只有一个人(胜者)
print('赢:', ls3[0])
return ls3[0]
else:
temp = {}
for u in ls3:
if u == 0: # 判断user是否是人工玩家
uv = self.player() # 人工玩家重新出
else:
uv = self.computer() # 电脑玩家重新出
temp[u] = uv
return self.rule(temp)
elif len(ls2) == 0: # 出布的为0
if len(ls1) == 1:
print('赢:', ls1[0])
return ls1[0]
else:
temp = {}
for u in ls1:
if u == 0:
uv = self.player()
else:
uv = self.computer()
temp[u] = uv
return self.rule(temp)
elif len(ls3) == 0: # 出剪刀的为0
if len(ls2) == 1: # ls1 石头,ls2 布, ls3 剪刀
print('赢:', ls2[0])
return ls2[0]
else:
temp = {}
for u in ls2:
if u == 0:
uv = self.player()
else:
uv = self.computer()
temp[u] = uv
return self.rule(temp)
else:
temp = {}
for u in user.keys():
if u == 0:
uv = self.player()
else:
uv = self.computer()
temp[u] = uv
print(temp)
return self.rule(temp)

一个问题:递归深度

因采用递归的方法实现的这个规定,所以可能会存在平局太多(人多)超过递归深度的问题。当然可以通过调整递归深度来解决,但没必要。

解决思路:标记递归,到了一定数目后强制退出,所以人重来。

def rule(self, user, j):
if j == 10:
print("别耗了,重来吧")
ww()
return
j += 1

运行结果展示

Python实现三人(多人)猜拳(石头剪刀布,猜丁壳)_随机


本篇文章为本人原创,还请尊重。

若有错误还请各路大神多多指点。