用列表和字典写猜拳,这样的逻辑算合理吗?
# Python新手练习:用取模运算简化猜拳逻辑
## 1. 创作原由
大家好,我是一名高中生,目前正在自学Python。最近我姐拜托我帮她写一个“剪刀石头布”的小游戏。
一开始,我打算用最基础的逐个判断(if-elif)来写,但发现情况太多,代码不仅长而且容易写错。后来我盯着这三个选项看,突然发现了一个规律:如果把剪刀、石头、布分别对应数字 0、1、2,它们刚好是一个“前面的会被后面的压制”的循环。
受此启发,我尝试用数学里的“取模运算(%3)”来代替复杂的条件判断,写下了下面这段代码。
## 2. 核心思路
在这个程序中,我将选项映射为数字:
* 剪刀 = 0
* 石头 = 1
* 布 = 2
因为 0 会被 1 压制,1 会被 2 压制,2 会被 0 压制。
所以我发现,只要满足 `(玩家数字 + 1) % 3 == 电脑数字`,就说明电脑赢了。这样只需要一个简单的公式,就代替了所有的 if-else 判断。
## 3. 完整代码
import random def comper(player,computer,module): dic = {'剪刀': 0, '石头': 1, '布': 2} lst = [['剪刀',1], ['石头',2], ['布',0]] txt = f'电脑{lst[computer][0]}你{player}' player = dic[player] if player == computer: return 2,txt if module == 1: if (player+1)%3 == computer: return 1,txt else: return 0,txt else: if lst[lst[player][1]][1] == computer: return 0,txt else: return 1,txt lst = [0]*3 dic = {0:'你赢',1:'电脑赢',2:'平局'} t = int(input('请输入猜拳次数')) for i in range(t): compers,txt = comper(player=input('请猜拳'), computer=random.randint(0,2), module=1) print(dic[compers],txt) lst[compers] = lst[compers] + 1 if lst[1] > lst[0]: print('电脑获胜') elif lst[0] == lst[1]: print('平局') else: print('你获胜') print(f'获胜统计:你{lst[0]},电脑{lst[1]},平局{lst[2]}')