模拟两人猜拳游戏

news/2024/10/25 5:34:53/

模拟两个人猜拳,出石头剪刀布。第一轮大家随机出拳,存储模拟结果,并计算玩家 1 的胜率。改进玩家 1 的出拳策略之后,看对其胜率是否有影响。

主要思路:设计一个策略集合,放置石头剪刀布三种策略。再分别设计玩家 1 和玩家 2 的策略,每次随机从策略集合中取一种策略。最后设计比赛规则,将玩家的两种策略进行比较,输出一轮比赛结果,并存储在比赛结果列表中。可以将比赛循环多次,在结果列表中计算玩家 1 的胜利次数,以此计算玩家 1 的胜率。

# 首先导入两个库,随机库用来随机取策略,collections 库用来生成一个值是列表属性的默认字典,用来存储比赛结果import random
import collectionsdef finger_play(n): # 参数 n 控制比赛的轮数stratergy = ['paper', 'rock', 'scissors']res = collections.defaultdict(list)for i in range(1, n+1):s1 = random.choice(stratergy)s2 = random.choice(stratergy)if stratergy.index(s1) == stratergy.index(s2) + 1 or stratergy.index(s1) == stratergy.index(s2) - 2:res['player1'].append('lose')print('player1: %s, palyer2: %s, player2 win'%(s1,s2))elif stratergy.index(s1) == stratergy.index(s2) - 1 or stratergy.index(s1) == stratergy.index(s2) + 2:res['player1'].append('win')print('player1: %s, palyer2: %s, player1 win'%(s1,s2))else:res['player1'].append('tied')print('player1: %s, palyer2: %s, this round is tied'%(s1,s2))print(res, len(res['player1']))winning_percentage = res['player1'].count('win') / nprint("player1's winning percentage is: ", winning_percentage)return res

这里也可以简单的用 0,1,2 来表示石头剪刀布的策略,输出时做转换就行,这样在进行判断时就没必要取下标,直接用值进行加减计算即可

另外,比赛结果的判断语句也可以简写为

        if stratergy.index(s1) - stratergy.index(s2) in (1, -2):res['player1'].append('lose')print('player1: %s, palyer2: %s, player2 win'%(s1,s2))elif stratergy.index(s1) == stratergy.index(s2):res['player1'].append('tied')print('player1: %s, palyer2: %s, this round is tied'%(s1,s2))else:res['player1'].append('win')print('player1: %s, palyer2: %s, player1 win'%(s1,s2))

以上是简单的随机出拳游戏,真实情况人们可能会根据上一轮猜拳的结果来决定当前轮的出拳策略,例如我们可以让玩家 2 随机出拳,玩家 1 认为玩家 2 会重复上一轮出拳的策略,因此当前轮出拳的策略都要赢过玩家 2 上一轮的出拳策略。这种情况我们只要取消玩家 1 的随机出拳策略,而改为在每一次比赛结果出来后给玩家 1 的策略重新赋值,使得更新后的玩家 1 策略为玩家 2 当前策略的前一个策略即可。

import random
import collections
def finger_play(n):stratergy = ['paper', 'rock', 'scissors']res = collections.defaultdict(list)s1 = random.choice(stratergy)for i in range(1,n+1):s2 = random.choice(stratergy)if stratergy.index(s1) - stratergy.index(s2) in (1, -2):res['player1'].append('lose')print('player1: %s, palyer2: %s, player2 win'%(s1,s2))tems1 = stratergy.index(s2) - 1s1 = stratergy[tems1] # 当前局失败,更新玩家 1 的策略为玩家 2 当前策略的前一个策略elif stratergy.index(s1) == stratergy.index(s2):res['player1'].append('tied')print('player1: %s, palyer2: %s, this round is tied'%(s1,s2))tems1 = stratergy.index(s2) - 1s1 = stratergy[tems1] # 平局时玩家 1 的策略选择当前策略的前一个策略else:res['player1'].append('win')print('player1: %s, palyer2: %s, player1 win'%(s1,s2))s1 = s1 #当前比赛结果获胜,因此下一轮比赛玩家 1 依然保持该策略print(res, len(res['player1']))winning_percentage = res['player1'].count('win') / nprint("player1's winning percentage is: ", winning_percentage)return res

我们可以尝试进行 100,1000,10000,100000 轮,结果会发现,在 100 轮的时候,比赛结果会波动比较大,但是当到 1000 轮了,比赛结果基本稳定在 0.33 左右了,如果到十万轮的话,比赛结果几乎就是在 33.3%。这也说明了,只要有人是随机出拳,那么不管采用什么策略,对手的胜率大概就是 1/3,因此猜拳游戏是一个很公平的游戏。

我们可以写一个循环来依次增加比赛轮数,看看胜率如何变化。为了简洁起见,在多次调用的时候我们省略掉了其他的输入内容,每次只输出胜率,最后的返回值也改成胜率 winning_percentage

def game_many():rate = []i = 10while i in range(10,1000001):rate.append(finger_play(i))i *= 10print(rate)if __name__ == '__main__':game_many()

多次运行之后发现,在 10,100 这些次数时,胜率还会有所波动,但是到 10 万次的时候,基本就是 33 的胜率没啥变化了

player1's winning percentage is:  0.2
[0.2]
player1's winning percentage is:  0.3
[0.2, 0.3]
player1's winning percentage is:  0.34
[0.2, 0.3, 0.34]
player1's winning percentage is:  0.3361
[0.2, 0.3, 0.34, 0.3361]
player1's winning percentage is:  0.33018
[0.2, 0.3, 0.34, 0.3361, 0.33018]
player1's winning percentage is:  0.333628
[0.2, 0.3, 0.34, 0.3361, 0.33018, 0.333628]


http://www.ppmy.cn/news/966544.html

相关文章

猜拳游戏!

#include <stdio.h> #include <stdlib.h> #include <time.h> void liu(int a[2][3],int i,int j); void sun(int a[2][3],int i,int j); void cc(int a[2][3],int i,int j); //#define A 刘备 //#define B 孙权 //#define C 曹操 int main() {int c;int num[…

Python实现猜拳游戏

在日常休闲时间中&#xff0c;我们经常玩着许多游戏来寻找生活中的乐趣&#xff0c;猜拳游戏是童年记忆中的游戏&#xff0c;也是我们从小学会的第一个游戏。 1 问题 编写代码来完成人工机器猜拳系统 2 方法 首先引入随机数系统&#xff0c;然后设置一个参数代表为我方猜拳&…

PHP--猜拳游戏

此段代码能使计算机随机生成0、1、2三个数中的一个, 恰好能表示计算机的出拳。请编写小游戏,让用户与计算机猜拳。 example9_0.php:<html> <head> <title>猜拳游戏</title> <meta http-equiv"content-type" content"text/html;chars…

【AI理论学习】深入理解Prompt Learning和Prompt Tuning

深入理解Prompt Learning和Prompt Tuning 背景Prompt Learning简介1. Prompt是什么&#xff1f;2. 为什么要使用Prompt&#xff1f;3. Prompt Learning的形式&#xff08;举例&#xff09;4. 有哪些Pre-training language model&#xff1f;5. 常见的Prompt Learning的方法 Pro…

灵活利用ChatAI,帮助你编写文章/故事,提高创作

前言 ChatAI 对于编写文章/故事提供了广泛且有益的帮助。它可以激发灵感、提供背景知识、检查错误并提供实时反馈等功能&#xff0c;在创作过程中起到了重要辅助作用。然而&#xff0c;在使用过程中需要保持适度&#xff0c;并将其视为一个有益工具而非完全取代人类创作的替代…

可以说,今天是中国民营企业家信心暴涨的一天 —— 马云回来了

马云&#xff0c;回国了。 3月27日&#xff0c;据《科创板日报》报道&#xff0c;近日有网友在杭州文一路隧道中目击阿里巴巴集团创始人马云。视频中&#xff0c;马云乘坐一辆丰田考斯特&#xff0c;不时与身边及前面的人交谈。 据《科创板日报》从相关人士处确认&#xff0c;该…

26岁财富自由,30岁已经历成功人士的一生,OpenAI掌门人的36条人生经验

Altman30岁就经历了成功人士的一生:程序员、创始人、投资人、CEO、慈善家。 编辑丨沃特敦 OpenAI掌门人Sam Altman是美国现在最炙手可热的企业家。上周,Altman刚刚度过38岁生日。今天分享的是他30岁时总结的人生经验。那时,Altman已经是硅谷最具人气的创投明星,年纪轻轻就能…

漫漫长日,匆匆十年:YC掌门人 Sam Altman 分享36条人生经验

YC掌门人Sam Altman 上周度过了他的30岁生日&#xff0c;下面36条建议是他从自己过去10年总结出来的人生经验&#xff0c;很多人生经验看上去或许空洞&#xff0c;但是Sam还是决定用非常精炼的语言把它发布在自己的博客中。对于20几岁的年轻人来说&#xff0c;在如战场的人路上…