用公式逻辑决定游戏结果

2023-12-02

我正在努力成为一名更好的编码员,其中包括摆脱我的“硬编码”习惯,以保持我的程序动态且易于维护。

现在我正在编写一个简单的石头剪刀布游戏作为练习:

import time

validoptions = ["rock", "paper", "scissors"]

u1input = input("User 1, do you want to choose rock, paper or scissors?").lower()
if not u1input in(validoptions):
    u1input = input("What the hell User 1, choose a valid option: rock, paper or scissors?").lower()
u2input = input("User 2, do you want to choose rock, paper or scissors?").lower()
if not u2input in(validoptions):
    u2input = input("What the hell User 2, choose a valid option: rock, paper or scissors?").lower()

u1 = validoptions.index(u1input)
u2 = validoptions.index(u2input)

if u1 - u2 == 0:
    result = "It's a draw! Both parties have proven to be of equal strength."


print("Stakes are high... The battle is on... Calculating losses...")
for i in range(1,4):
    time.sleep(1)
    print("...")

time.sleep(1)
print(result)

对于像剪刀石头布这样的游戏,结果并不多(6 胜/负,1 平局结果,或 3^2 个单独结果)。我可以轻松地在我已经编码的抽签结果旁边编码所有可能的结果。但是,如果游戏扩展为另外 3 个选项怎么办?说:Rock, Paper, Scissors, Pans, Swords, and Rifles:这将是 6^2 = 36 个结果!

随着此列表的扩展,潜在结果的数量变得更难进行硬编码。我想使用公式或另一种“智能”动态方法来确定游戏结果,类似于if u1 - u2 == 0: line.

这有可能吗?


我最初的想法是Rock–Paper–Scissors (RPS) rules:

  • It's a cyclic relation between the elements where each element beats the one in before it (Scissors beats (cuts) Paper)
    • The 1st element (that doesn't have anything before) beats the last one (and the cycle is complete)
  • 当添加更多元素时,只是为了让更多的用户可以玩(只要用户数少了1比元素数),但现在我看到了这是不对的因为有些情况下结果可能是不确定的(实际上唯一有效的情况是没有 2 个玩家选择相同的选项)

显然(感谢[维基百科]:石头剪刀布), 为一个balanced游戏(元素数量为奇数):

  • 每个元素都击败了其他一半的元素(因此,输给了另一半)

    • The (1st) one before it
    • The 3rd one before it
    • The 5th one before it
    • ...
    • 当到达列表的开头时,跳转到其末尾(环绕式)

    这是 3 个元素的概括(RPS)游戏(也适用于RPSLS)

下面是将上述规则放入代码中的样子(我还重新设计了它以纠正代码片段中的一些错误)。所有的“魔法”都发生在outcome.

代码00.py:

#!/usr/bin/env python3

import sys


_elements_list = [
    ["Rock", "Paper", "Scissors"],
    ["Rock", "Paper", "Scissors", "Spock", "Lizard"],  # !!! The order is DIFFERENT (RPSSL) than the name of the game: RPSLS !!!
]

elements_dict = {len(item): item for item in _elements_list}
del _elements_list


def get_users_choices(valid_options):
    ret = [-1] * 2
    for i in (0, 1):
        user_choice = None
        while user_choice not in valid_options:
            user_choice = input("Enter user {0:d} option (out of {1:}): ".format(i + 1, valid_options))
        ret[i] = valid_options.index(user_choice)
    return ret


def outcome(idx0, idx1, count):  # Returns -1 when 1st player wins, 0 on draw and 1 when 2nd player wins
    if idx0 == idx1:
        return 0
    index_steps = [-i * 2 - 1 for i in range(count // 2)]  # Index steps (n // 2 items) from current index: {-1, -3, -5, ...} (negative values mean: before)
    idx0_beat_idxes = [(idx0 + i + count) % count for i in index_steps]  # Wrap around when reaching the beginning of the list
    if idx1 in idx0_beat_idxes:
        return -1
    return 1


def main():
    element_count = 3  # Change it to 5 for RPSLS
    if element_count <= 2:
        raise ValueError("Can't play game")
    elements = elements_dict.get(element_count)
    if not elements:
        raise ValueError("Invalid option count")
    choices = get_users_choices(elements)
    res = outcome(*choices, element_count)
    if res == 0:
        print("'{0:s}' and '{1:s}' are DRAW.".format(elements[choices[0]], elements[choices[1]]))
    elif res < 0:
        print("'{0:s}' WINS over '{1:s}'.".format(elements[choices[0]], elements[choices[1]]))
    else:
        print("'{0:s}' LOSES to '{1:s}'.".format(elements[choices[0]], elements[choices[1]]))


if __name__ == "__main__":
    print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    main()
    print("\nDone.")

Output:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057491776]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code00.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32

Enter user 1 option (out of ['Rock', 'Paper', 'Scissors']): Rock
Enter user 2 option (out of ['Rock', 'Paper', 'Scissors']): Scissors
'Rock' WINS over 'Scissors'.

Done.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用公式逻辑决定游戏结果 的相关文章

  • 如何同时运行多个功能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有以下代码 my func1 my func2 my func3 my func4 my func5 是否可以同时计算函数的数据 而
  • 如何在 Pandas Python 中按 id 对行进行排名

    我有一个像这样的数据框 id points1 points2 1 44 53 1 76 34 1 63 66 2 23 34 2 44 56 我想要这样的输出 id points1 points2 points1 rank points2
  • Python 不考虑 distutils.cfg

    我已经尝试了给出的所有内容 并且所有教程都指向相同的方向 即使用 mingw 作为 python 而不是 Visual C 中的编译器 我确实有 Visual C 和 mingw 当我想使用 pip 安装时 问题开始出现 它总是给Unabl
  • Python:json_normalize pandas 系列给出 TypeError

    我在 pandas 系列中有数万行像这样的 json 片段df json IDs lotId 1 Id 123456 date 2009 04 17 bidsCount 2 IDs lotId 2 Id 123456 date 2009 0
  • Scrapy 文件管道不下载文件

    我的任务是构建一个可以下载所有内容的网络爬虫 pdfs 在给定站点中 Spider 在本地计算机和抓取集线器上运行 由于某种原因 当我运行它时 它只下载一些但不是全部的 pdf 通过查看输出中的项目可以看出这一点JSON 我已经设定MEDI
  • 将整数系列转换为交替(双元)二进制系列

    我不知道如何最好地表达这个问题 因为在这里谷歌搜索和搜索总是让我找到更复杂的东西 我很确定这是基本的东西 但对于我的生活来说 我找不到一个好的方法来做到这一点下列 给定一个整数序列 比如说 for x in range 0 36 我想将这些
  • Python 内置对象的 __enter__() 和 __exit__() 在哪里定义?

    我读到每次使用 with 时都会调用该对象的 enter 和 exit 方法 我知道对于用户定义的对象 您可以自己定义这些方法 但我不明白这对于 打开 等内置对象 函数甚至测试用例是如何工作的 这段代码按预期工作 我假设它使用 exit 关
  • Python Selenium 打印另存为 PDF 等待文件名输入

    我正在尝试通过打印对话框将网站另存为 PDF 我的代码允许我另存为pdf 但要求我输入文件名 我不知道如何将文件名传递到弹出框 附上我的代码 import time from selenium import webdriver import
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • 如何知道python运行脚本的路径?

    sys arg 0 给我 python 脚本 例如 python hello py 返回 sys arg 0 的 hello py 但我需要知道 hello py 位于完整路径中的位置 我怎样才能用Python做到这一点 os path a
  • 了解 Python 2.7 中的缩进错误

    在编写 python 代码时 我往往会遇到很多缩进错误 有时 当我删除并重写该行时 错误就会消失 有人可以为菜鸟提供 python 中 IndentationErrors 的高级解释吗 以下是我在玩 CheckIO 时收到的最近 inden
  • 使用会话在 Django 中将文件从一个视图传递到另一个视图

    我当前的工作项目要求我允许用户上传各种格式的文件 目前仅处理 CSV 格式 然后使用包含的数据来绘制图表Pandas http pandas pydata org 图书馆 我决定将图形渲染到模板的最简单方法是为图形创建特定视图 然后将图像从
  • 哪种方式最适合Python工厂注册?

    这是一个关于这些方法中哪一种被认为是最有效的问题 Pythonic 我不是在寻找个人意见 而是在寻找惯用的观点 我的背景不是Python 所以这会对我有帮助 我正在开发一个可扩展的 Python 3 项目 这个想法类似于工厂模式 只不过它是
  • 获取多个同名请求参数

    我的问题是给定的代码 from flask import Flask request app Flask name app route def hello return str request values get param None a
  • 如何检测一个二维数组是否在另一个二维数组内?

    因此 在堆栈溢出成员的帮助下 我得到了以下代码 data needle s which is a png image base64 code goes here decoded data decode base64 f cStringIO
  • tf.print() vs Python print vs tensor.eval()

    看来在Tensorflow中 至少有三种方法可以打印出张量的值 我一直在读here https www freecodecamp org news debugging tensorflow a starter e6668ce72617 an
  • AWS 将 MQTT 消息存储到 DynamoDB

    我构建了一个定期发送 MQTT 消息的 python 脚本 这是发送到后端的 JSON 字符串 Id 1234 Ut 1488395951 Temp 22 86 Rh 48 24 在后端 我想将 MQTT 消息存储到 DynamoDB 表中
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • 如何有效地比较 pandas DataFrame 中的行?

    我有一个 pandas 数据框 其中包含雷击记录以及时间戳和全球位置 格式如下 Index Date Time Lat Lon Good fix 0 1 20160101 00 00 00 9962692 7 1961 60 7604 1
  • 使用 python 将 CSV 文件上传到 Microsoft Azure 存储帐户

    我正在尝试上传一个 csv使用 python 将文件写入 Microsoft Azure 存储帐户 我已经发现C sharp https blogs msdn microsoft com jmstall 2012 08 03 convert

随机推荐

  • 在浏览器中显示 Excel 文件。 PHPExcel

    例如我正在使用这样的代码
  • 从另一个类访问变量 - Objective-C

    这个问题可能之前已经被问过 所以我很抱歉 我正在开发一个 iPhone 应用程序 假设我在 class1 中有一个变量 var 我想在 class2 中添加一个 UIButton 当点击它时 会将 var 重置为 0 当应用程序关闭时 会保
  • Apache Camel 中的集群:多个 JVM 相同的 CamelContext

    我有一个部署在集群上的应用程序 根据环境 集群可能有 2 或 4 个 JVM 该应用程序具有我们在所有 JVM 上部署的相同 CamelContext 因此 所有 JVM 都有相同的路由 对于 FTP 路由 这很好 因为它具有竞争力 并且只
  • C# 中的别名关键字(如 typedef)?

    我有 2 个库 在不同平台上有不同的大小写 似乎其他所有内容都是相同的 方法名称 参数顺序等 我如何创建一个别名 以便我当前的平台 a 拼写在编译时起作用对于平台 b 我真的不想为大小写差异制作一个包装器 您可以使用 using 关键字创建
  • C# 到 VB6 COM 事件(“对象或类不支持事件集”)

    真的是用这个把我的头发拉出来了 我有一个 C 项目 其接口定义为 Externally Accessible API InterfaceType ComInterfaceType InterfaceIsIDispatch public in
  • 如何在 WiX 中安装时填充组合框?

    编辑 我已经更新了下面的代码 现在它可以工作了 感谢罗布的回答 我找到了几页展示如何执行此操作 http www cmcrossroads com content view 13160 120 http www mail archive c
  • 带有国家点击和缩放功能的 d3 世界地图几乎无法正常工作

    我正在制作一张具有点击缩放功能的世界地图 当点击一个国家时 地图会放大 但该国家并不总是居中 当你点击并重复时 也会发生同样的情况 它似乎永远不会提供相同的结果 注意 如果禁用过渡功能 缩放和居中确实有效 只有在添加旋转时才会显示不正确 我
  • 隐藏用户表单后如何返回或重新显示它?

    我在 UserForm2 的一个命令按钮中包含以下代码 Private Sub CButton1 Click UserForm1 Show Me Hide End Sub Now Userform1显示 然后我在 Userform1 的一个
  • 如何打印使用 Apache Poi 和 java 制作的工作簿文件?

    我在 eclipse 中创建一页工作簿文件 需要打开打印对话框并打印这些文件 我了解如何打开打印对话框和所有内容 我只是找不到如何告诉系统它是我想要打印的工作簿文件 wb 因此 除非它知道我想用它打印什么 否则打开对话框是行不通的 有人至少
  • 未在此范围内声明的变量

    我正在为类制作一个程序 由于某种原因 当在类定义中声明它时 它给了我这个错误 错误 在函数中 void setMessageBuffer std string 错误 message 在这方面没有申明 class apple private
  • 是否可以在不使用 win32 API 库的情况下在 C# 中获取 LAN 中连接的 IP 地址列表?

    我正在尝试获取在 LAN 中连接的 IP 地址列表 是否可以在不使用 win32 API 库 Netapi32 dll 的情况下获得 有什么想法可以在不使用非托管 win32 动态库的情况下获得 Windows 7 操作系统的目标 您可以使
  • UIButton 与 UITableViewCellSelectionStyleGray 选择颜色

    我试图将 UIButton 的选定颜色设置为 UITableViewCellSelectionStyleGray 的颜色 问题是 UIButton 的选择颜色无法设置 只能设置图像 有谁知道如何使用 UITableViewCellSelec
  • 如何在 C# Windows 应用程序中的表单之间传递值?

    我有两个表单 A 和 B 表单 A 是应用程序的默认启动表单 我在 Form A 中做了一些事情 然后我想并行运行 Form B 然后通过 从表单 A 到表单 B 中的方法的参数 How Ian 给出了一些示例代码 但我想提出更广泛的观点
  • 使用 Excel 2016 将范围保存为图片

    该代码的目的是将一系列单元格保存为桌面上的图片 该文件已创建 但不包含任何单元格数据 它是具有范围相对大小的空白图像 该问题出现在 Office 2016 中 在 2013 中有效 Sub SendSnapshot2 Dim strRng
  • 将 CAGradient 遮罩层应用到 UITextView

    我有一个 UITextView 带有可滚动文本 我试图对其应用渐变层 因此可见文本的底部总是稍微淡出 这是我的代码 CAGradientLayer maskLayer CAGradientLayer layer maskLayer colo
  • 获取 EditText 中按下的键

    I want to know which key has been pressed in an EditText For example if a is pressed I want to get the value as a How ca
  • 在对象中按名称查找嵌套属性的最佳方法

    我有一个对象 dataLayer 它可以增加和减少长度 具体取决于您访问的页面数量 我想要 循环遍历目标并查找属性名称 ecommerce 我特别想找到 brandcode 的值 必须与 pagetitle Login Page 位于同一对
  • 如何使用 UIImage(contentsOfFile:String) 方法从 Images.xcassets 文件夹加载图像

    我知道之间的区别UIImage named String and UIImage contentsOfFile String 我刚刚保存了超过 200MB 的图像图片 xcassets文件夹 我发现我的应用程序内存使用量很大 超过 500
  • 无法从 java jar 运行 python 脚本

    在 IntelliJ 中工作时一切正常 但在我构建 jar 之后它就停止了 起初 只是我忘记将它放入 jar 构建配置中 但现在在确保它在那里之后 我仍然无法运行它 这些是我尝试的方法 InputStream script mainView
  • 用公式逻辑决定游戏结果

    我正在努力成为一名更好的编码员 其中包括摆脱我的 硬编码 习惯 以保持我的程序动态且易于维护 现在我正在编写一个简单的石头剪刀布游戏作为练习 import time validoptions rock paper scissors u1in