【Dison夏令营 Day 01】如何用Python写一个游戏“石头剪刀布”

欢迎你们踏入这个充满无限可能性的编程世界!作为一名热爱Python的开发者,我深感编程的魅力,并希望与你们一同分享这份乐趣和激情。编程,不仅仅是一种技能,更是一种思维方式和解决问题的工具。在Python的世界里,你们将会学习到如何用代码构建出令人惊叹的项目,从简单的文本处理到复杂的机器学习模型,每一步的进步都会让你们感受到编程的魔力。

我们生活在一个数字化、智能化的时代,编程已经成为了这个时代的通用语言。掌握编程,不仅能让你们在未来的职业生涯中更具竞争力,还能让你们更好地理解和参与这个瞬息万变的世界。因此,我诚挚地邀请你们加入我们的行列,一同探索Python的奥秘,体验编程的乐趣。无论你是初学者还是已经有一定编程经验的朋友,这里都将是你学习和成长的乐园。让我们一起用代码创造美好的未来吧!

在本教程中,您将学习如何

  • 编写自己的剪刀石头布游戏
  • 使用 input() 接收用户输入
  • 使用 while 循环连续玩几个游戏
  • 使用枚举函数清理代码
  • 字典定义更复杂的规则

什么是剪刀石头布?

你可能玩过剪刀石头布。也许你曾用它来决定谁请客吃饭,或者谁能优先选择球队的球员。

如果您不熟悉,剪刀石头布是一种两人或多人玩的手牌游戏。参与者说 “石头、剪子、布”,然后双手同时握成石头(握拳)、布(手心朝下)或剪刀(伸出两根手指)的形状。规则很简单:

  • 石头击碎剪刀。
  • 覆盖石头。
  • 剪刀剪布。

既然已经掌握了规则,就可以开始思考如何将它们转化为 Python 代码了。

用 Python 玩一次剪刀石头布游戏

利用上面的描述和规则,你可以制作一个剪刀石头布游戏。在开始之前,您需要导入用于模拟计算机选择的模块:

	import random

太棒了现在,你可以使用随机工具中的不同工具来随机化电脑在游戏中的操作。现在怎么办?由于用户也需要能够选择他们的操作,因此您需要的第一件合乎逻辑的事情就是找到一种接收用户输入的方法。

获取用户输入

获取用户输入在 Python 中非常简单。这里的目标是询问用户想选择什么操作,然后将选择赋值给一个变量:

这里代码我就保持美式键盘风格,简化学习难度(但是外国石头剪刀布的游戏名称和国内些许不一样,叫Rock Paper Scissors,就像俄罗斯方块叫Tetris)

user_action = input("Enter a choice (rock, paper, scissors): ")

这将提示用户输入一个选择,并将其保存到一个变量中,以供以后使用。既然用户已经选择了一项操作,计算机就需要决定该怎么做。

让电脑做出选择

剪刀石头布的竞技游戏涉及策略。与其为此开发一个模型,不如让计算机随机选择一个动作,这样可以节省一些时间。随机选择是让计算机选择伪随机值的好方法。

你可以使用 random.choice() 让电脑随机选择动作:

possible_actions = ["rock", "paper", "scissors"]
computer_action = random.choice(possible_actions)

这样就可以从列表中随机选择一个元素。您还可以打印用户和计算机做出的选择:

print(f"\nYou chose {user_action}, computer chose {computer_action}.\n")

打印用户和计算机的操作对用户很有帮助,而且还能帮助你在稍后调试,以防结果出现问题。

决定胜负

既然两个玩家都做出了选择,那么就需要一种方法来决定谁赢了。使用 if ... elif ... else 块,您就可以比较玩家的选择并决定胜负:

if user_action == computer_action:print(f"Both players selected {user_action}. It's a tie!")
elif user_action == "rock":if computer_action == "scissors":print("Rock smashes scissors! You win!")else:print("Paper covers rock! You lose.")
elif user_action == "paper":if computer_action == "rock":print("Paper covers rock! You win!")else:print("Scissors cuts paper! You lose.")
elif user_action == "scissors":if computer_action == "paper":print("Scissors cuts paper! You win!")else:print("Rock smashes scissors! You lose.")

通过先比较平局条件,可以避免很多情况。如果不这样做,就需要检查 user_action 的每个可能操作,并与 computer_action 的每个可能操作进行比较。如果先检查平局条件,那么只需对 computer_action 进行两次条件检查,就能知道计算机选择了什么。

就是这样!综合起来,您的代码现在应该是这样的:

import randomuser_action = input("Enter a choice (rock, paper, scissors): ")
possible_actions = ["rock", "paper", "scissors"]
computer_action = random.choice(possible_actions)
print(f"\nYou chose {user_action}, computer chose {computer_action}.\n")if user_action == computer_action:print(f"Both players selected {user_action}. It's a tie!")
elif user_action == "rock":if computer_action == "scissors":print("Rock smashes scissors! You win!")else:print("Paper covers rock! You lose.")
elif user_action == "paper":if computer_action == "rock":print("Paper covers rock! You win!")else:print("Scissors cuts paper! You lose.")
elif user_action == "scissors":if computer_action == "paper":print("Scissors cuts paper! You win!")else:print("Rock smashes scissors! You lose.")

您现在已经编写了代码,可以接收用户输入,为计算机选择随机操作,并决定胜负!但这只能让你在程序运行结束前玩一场游戏。

连续玩几个游戏

虽然单人剪刀石头布游戏超级有趣,但如果能连续玩几个游戏不是更好吗?循环是创建重复事件的好方法。特别是,您可以使用 while 循环来无限期地玩游戏:

import randomwhile True:user_action = input("Enter a choice (rock, paper, scissors): ")possible_actions = ["rock", "paper", "scissors"]computer_action = random.choice(possible_actions)print(f"\nYou chose {user_action}, computer chose {computer_action}.\n")if user_action == computer_action:print(f"Both players selected {user_action}. It's a tie!")elif user_action == "rock":if computer_action == "scissors":print("Rock smashes scissors! You win!")else:print("Paper covers rock! You lose.")elif user_action == "paper":if computer_action == "rock":print("Paper covers rock! You win!")else:print("Scissors cuts paper! You lose.")elif user_action == "scissors":if computer_action == "paper":print("Scissors cuts paper! You win!")else:print("Rock smashes scissors! You lose.")play_again = input("Play again? (y/n): ")if play_again.lower() != "y":break

请注意上面突出显示的几行。重要的是要检查用户是否还想继续游戏,如果不想就中断游戏。如果不进行检查,用户就会被迫继续游戏,直到使用 Ctrl+C 或类似方法终止控制台。

再次播放的检查是对字符串 "y "的检查。但像这样对特定内容进行检查可能会使用户更难停止游戏。如果用户输入 "yes "或 "no "呢?字符串比较往往很棘手,因为你永远不知道用户会输入什么。他们可能全小写,也可能全大写,甚至两者混合。

下面是几个不同字符串比较的结果:

>>> play_again = "yes"
>>> play_again == "n"
False
>>> play_again != "y"
True

嗯。这不是你想要的。如果用户输入 “yes”,本以为可以再次游戏,但却被踢出了游戏,他们可能会不太高兴。

使用 enum.IntEnum 描述操作

由于字符串比较可能导致如上所示的问题,因此最好尽可能避免字符串比较。然而,您的程序首先会要求用户输入一个字符串!如果用户错误地输入了 "Rock "或 "rOck "怎么办?大小写很重要,所以它们不会相等:

print("rock" == "Rock")

由于大小写很重要,"r "和 "R "并不等同。一个可行的解决方案是用数字来代替。给每个操作分配一个数字可以省去一些麻烦:

ROCK_ACTION = 0
PAPER_ACTION = 1
SCISSORS_ACTION = 2

这样,您就可以通过分配的编号来引用不同的操作。整数不会像字符串那样存在比较问题,因此可以使用。现在,您可以让用户输入一个数字,然后直接与这些值进行比较:

user_input = input("Enter a choice (rock[0], paper[1], scissors[2]): ")
user_action = int(user_input)
if user_action == ROCK_ACTION:# Handle ROCK_ACTION

由于 input() 返回的是字符串,因此需要使用 int() 将返回值转换为整数。然后就可以将输入值与上述每个操作进行比较。这种方法效果很好,但可能需要正确命名变量才能跟踪它们。更好的方法是使用 enum.IntEnum 并定义自己的操作类!

使用 enum.IntEnum 可以创建属性并为其赋值,与上图类似。这样可以将动作归类到自己的命名空间中,使代码更具表现力,从而有助于清理代码:

from enum import IntEnumclass Action(IntEnum):Rock = 0Paper = 1Scissors = 2

这将创建一个自定义动作,您可以用它来引用您支持的不同类型的动作。它的工作原理是将其中的每个属性分配给您指定的值。

比较仍然简单明了,现在它们有了一个与之相关的有用的类名:

>>> Action.Rock == Action.Rock
True

由于成员值相同,因此比较结果相同。类名还能让人更清楚地看出您要比较的是两个操作。

您甚至可以从一个 int 创建一个 Action:

>>> Action.Rock == Action(0)
True
>>> Action(0)
<Action.Rock: 0>

Action 会查看传入的值并返回相应的 Action。这很有帮助,因为您现在可以将用户输入作为一个 int,并从中创建一个 Action。再也不用担心拼写问题了!

程序的流程(图)

虽然 "剪刀石头布 "看似并不复杂,但仔细考虑玩 "剪刀石头布 "的步骤非常重要,这样才能确保您的程序涵盖所有可能的情况。对于任何项目,即使是小项目,绘制出所需行为的流程图并围绕流程图执行代码都是很有帮助的。使用项目列表也能达到类似的效果,但较难捕捉到循环和条件逻辑等内容。

流程图不必过于复杂,甚至不必使用真正的代码。只需提前描述所需的行为,就能帮助您在问题发生之前解决它们!

下面是一个描述剪刀石头布游戏的流程图:

在这里插入图片描述
每个玩家选择一个动作,然后决出胜负。这个流程图对于您编码的单个游戏来说是准确的,但对于现实生活中的游戏来说却不一定准确。在现实生活中,玩家会同时选择他们的行动,而不是像流程图所示那样一次选择一个。

不过,在编码版本中,这种做法是可行的,因为玩家的选择对电脑是隐藏的,而电脑的选择对玩家也是隐藏的。两名玩家可以在不同时间做出选择,而不会影响游戏的公平性。

流程图可以帮助您及早发现可能出现的错误,还可以让您了解是否需要添加更多功能。例如,下面的流程图描述了如何反复玩游戏,直到用户决定停止:

在这里插入图片描述
在不编写代码的情况下,您可以看到第一个流程图没有办法再次播放。这种方法可以让你在编程前解决类似的问题,从而帮助你创建更整洁、更易于管理的代码!

将代码拆分成函数

现在,您已经使用流程图勾勒出了程序的流程,您可以尝试组织代码,使其更接近您所确定的步骤。一种自然的方法是为流程图中的每个步骤创建一个函数。函数是将大段代码分隔成更小、更易于管理的代码块的好方法。

您不一定需要创建一个函数来再次执行条件检查,但如果您愿意,也可以这样做。如果还没有,可以先导入随机并定义 Action 类:

import random
from enum import IntEnumclass Action(IntEnum):Rock = 0Paper = 1Scissors = 2

希望到目前为止这一切看起来都很熟悉!下面是 get_user_selection()的代码,它不接收任何参数,只返回一个 Action:

def get_user_selection():user_input = input("Enter a choice (rock[0], paper[1], scissors[2]): ")selection = int(user_input)action = Action(selection)return action

现在你再也不用担心将来添加或删除操作的问题了!通过测试,您可以看到代码是如何提示用户并返回与用户输入值相关的操作的:

>>> get_user_selection()
Enter a choice (rock[0], paper[1], scissors[2]): 0
<Action.Rock: 0>

现在需要一个函数来获取计算机的操作。与 get_user_selection()函数一样,该函数不需要参数并返回一个 Action。由于 Action 的取值范围在 0 到 2 之间,因此需要在此范围内生成一个随机数。random.randint() 可以帮你做到这一点。

random.randint() 会返回一个介于指定最小值和最大值(含)之间的随机数值。你可以使用 len() 来帮助确定代码中的上限:

def get_computer_selection():selection = random.randint(0, len(Action) - 1)action = Action(selection)return action

由于 Action 值从 0 开始计数,而 len() 从 1 开始计数,因此必须执行 len(Action) - 1。

测试时,不会出现提示。它只会返回与随机数相关的操作:

>>> get_computer_selection()
<Action.Scissors: 2>

看起来不错!接下来,您需要一个决定胜负的方法。这个函数将接受两个参数,即用户的操作和计算机的操作。它不需要返回任何内容,因为它只会将结果显示到控制台:

def determine_winner(user_action, computer_action):if user_action == computer_action:print(f"Both players selected {user_action.name}. It's a tie!")elif user_action == Action.Rock:if computer_action == Action.Scissors:print("Rock smashes scissors! You win!")else:print("Paper covers rock! You lose.")elif user_action == Action.Paper:if computer_action == Action.Rock:print("Paper covers rock! You win!")else:print("Scissors cuts paper! You lose.")elif user_action == Action.Scissors:if computer_action == Action.Paper:print("Scissors cuts paper! You win!")else:print("Rock smashes scissors! You lose.")

这与您用来决定胜负的第一次比较非常相似。现在,您可以直接比较 Action 类型,而不必担心那些讨厌的字符串!

您甚至可以通过向 determine_winner() 传递不同的选项来测试它,看看会打印出什么结果:

>>> determine_winner(Action.Rock, Action.Scissors)
Rock smashes scissors! You win!

既然您是从数字创建操作,那么如果用户试图从 3 创建操作,会发生什么情况?请记住,您目前定义的最大数字是 2:

>>> Action(3)
ValueError: 3 is not a valid Action

哎呀你不希望发生这种情况。您可以在流程图的什么地方添加一些逻辑,以确保用户输入了有效的选择?

在用户做出选择后立即进行检查是合理的:

在这里插入图片描述

如果用户输入的数值无效,则重复上述步骤获取用户的选择。对用户选择的唯一真正要求是它必须介于 0 和 2 之间(包括 0 和 2)。如果用户的输入超出了这个范围,就会出现 ValueError 异常。为了避免向用户显示默认的错误信息,可以对异常进行处理。

现在,您已经定义了一些反映流程图步骤的函数,您的游戏逻辑变得更加有条理和紧凑了。现在您的 while 循环只需包含这些内容:

while True:try:user_action = get_user_selection()except ValueError as e:range_str = f"[0, {len(Action) - 1}]"print(f"Invalid selection. Enter a value in range {range_str}")continuecomputer_action = get_computer_selection()determine_winner(user_action, computer_action)play_again = input("Play again? (y/n): ")if play_again.lower() != "y":break

这样看起来是不是干净多了?请注意,如果用户未能选择一个有效的范围,就会使用 continue 而不是 break。这使得代码继续循环的下一次迭代,而不是中断循环。

Rock Paper Scissors … Lizard Spock

如果你看过《生活大爆炸》,那么你可能对 Rock Paper Scissors Lizard Spock 并不陌生。如果不熟悉,那么这里有一张图,描述了这个游戏和决定胜负的规则:

在这里插入图片描述
您可以使用上面学到的工具来实现这个游戏。例如,你可以添加到 Action 中,并为 lizard 和 Spock 创建值。然后,你只需修改 get_user_selection() 和 get_computer_selection(),将这些选项纳入其中。不过,更新 determine_winner() 会耗费大量精力。

与其在代码中添加大量 if … elif … else 语句,不如使用字典来帮助显示操作之间的关系。字典是显示键值关系的好方法。在这种情况下,键可以是一个动作(如剪刀),而值可以是它击败的动作列表。

那么,只有三个选项的 determine_winner() 会是什么样子呢?每个动作只能打败一个其他动作,因此列表中只能包含一个项目。下面是您之前的代码:

def determine_winner(user_action, computer_action):if user_action == computer_action:print(f"Both players selected {user_action.name}. It's a tie!")elif user_action == Action.Rock:if computer_action == Action.Scissors:print("Rock smashes scissors! You win!")else:print("Paper covers rock! You lose.")elif user_action == Action.Paper:if computer_action == Action.Rock:print("Paper covers rock! You win!")else:print("Scissors cuts paper! You lose.")elif user_action == Action.Scissors:if computer_action == Action.Paper:print("Scissors cuts paper! You win!")else:print("Rock smashes scissors! You lose.")

现在,您可以有一本字典来描述胜利条件,而不是与每个 "Action "进行比较:

def determine_winner(user_action, computer_action):victories = {Action.Rock: [Action.Scissors],  # Rock beats scissorsAction.Paper: [Action.Rock],  # Paper beats rockAction.Scissors: [Action.Paper]  # Scissors beats paper}defeats = victories[user_action]if user_action == computer_action:print(f"Both players selected {user_action.name}. It's a tie!")elif computer_action in defeats:print(f"{user_action.name} beats {computer_action.name}! You win!")else:print(f"{computer_action.name} beats {user_action.name}! You lose.")

您仍然要像以前一样,首先检查平局条件。但是,我们不再比较每个操作,而是比较 user_input 与 computer_action 之间的操作。由于键值对是一个列表,因此可以使用成员运算符 in 来检查其中是否包含某个元素。

由于不再使用冗长的 if … elif … else 语句,因此为这些新操作添加检查相对比较简单。您可以先将 lizard 和 Spock 添加到 Action 中:

class Action(IntEnum):Rock = 0Paper = 1Scissors = 2Lizard = 3Spock = 4

接下来,添加图表中的所有胜利关系。确保在 "Action"下面添加,这样 victories 就能引用 "Action "中的所有内容:

victories = {Action.Scissors: [Action.Lizard, Action.Paper],Action.Paper: [Action.Spock, Action.Rock],Action.Rock: [Action.Lizard, Action.Scissors],Action.Lizard: [Action.Spock, Action.Paper],Action.Spock: [Action.Scissors, Action.Rock]
}

请注意,现在每个 Action 都有一个包含两个元素的列表。而在剪刀石头布的基本实现中,只有一个元素。

因为你有意编写了 get_user_selection(),以适应新的动作,所以你不需要修改任何代码。get_computer_selection() 也是如此。由于 Action 的长度发生了变化,随机数的范围也会随之改变。

看看现在的代码有多简短和易于管理!要查看完整程序的全部代码,请展开下面的方框。

Rock Paper Scissors Lizard Spock

import random
from enum import IntEnumclass Action(IntEnum):Rock = 0Paper = 1Scissors = 2Lizard = 3Spock = 4victories = {Action.Scissors: [Action.Lizard, Action.Paper],Action.Paper: [Action.Spock, Action.Rock],Action.Rock: [Action.Lizard, Action.Scissors],Action.Lizard: [Action.Spock, Action.Paper],Action.Spock: [Action.Scissors, Action.Rock]
}def get_user_selection():choices = [f"{action.name}[{action.value}]" for action in Action]choices_str = ", ".join(choices)selection = int(input(f"Enter a choice ({choices_str}): "))action = Action(selection)return actiondef get_computer_selection():selection = random.randint(0, len(Action) - 1)action = Action(selection)return actiondef determine_winner(user_action, computer_action):defeats = victories[user_action]if user_action == computer_action:print(f"Both players selected {user_action.name}. It's a tie!")elif computer_action in defeats:print(f"{user_action.name} beats {computer_action.name}! You win!")else:print(f"{computer_action.name} beats {user_action.name}! You lose.")while True:try:user_action = get_user_selection()except ValueError as e:range_str = f"[0, {len(Action) - 1}]"print(f"Invalid selection. Enter a value in range {range_str}")continuecomputer_action = get_computer_selection()determine_winner(user_action, computer_action)play_again = input("Play again? (y/n): ")if play_again.lower() != "y":break

就是这样!你已经用 Python 代码实现了rock paper scissors lizard Spock。仔细检查一下,确保没有遗漏任何东西,然后试玩一下。

结论

恭喜您您刚刚完成了第一个 Python 游戏!现在,您已经知道如何从零开始创建剪刀石头布游戏,并能以最小的代价扩展游戏中可能的操作数量。

在本教程中,您将学会如何

  • 编写自己的剪刀石头布游戏
  • 使用 input() 接收用户输入
  • 使用 while 循环连续玩几个游戏
  • 使用枚举函数清理代码
  • 字典描述更复杂的规则

这些工具将在你的编程冒险中继续帮助你。如果您有任何问题,请随时在下面的评论区联系我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何寻找强势货币和弱势货币?

外汇交易的独特之处在于&#xff0c;它融合了两种货币的价值&#xff0c;其中一种货币的价值通过另一种货币来体现。举例来说&#xff0c;USDJPY外汇反映了美元与日元之间的价值关系&#xff0c;而EURUSD则代表了欧元与美元的价值对比。 通过开仓操作&#xff0c;我们预测一种…

Linux学习第54天:Linux WIFI 驱动:蓝星互联

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 数字化、现代化的今天&#xff0c;随处的WIFI给与了大众极大的方便&#xff0c;也感受到了科技的力量。万物互联、无线互联越来越成为一个不可逆转的趋势。现在比较火…

四川赤橙宏海商务信息咨询有限公司抖音电商领航者

在数字化浪潮席卷全球的今天&#xff0c;电商行业无疑是其中最为活跃、最具潜力的领域之一。而在中国这片广袤的土地上&#xff0c;四川赤橙宏海商务信息咨询有限公司以其独特的视角和前瞻性的战略布局&#xff0c;成为了抖音电商服务领域的佼佼者。今天&#xff0c;就让我们一…

stm32学习笔记---TIM输入捕获(代码部分)输入捕获模式测频率/PWMI模式测频率占空比

目录 第一个代码&#xff1a;输入捕获模式测频率 调整频率 PWM.c PWM.h 输入捕获 IC.c 输入捕获初始化步骤 TIM.h库函数 TIM_ICInit TIM_PWMIConfig TIM_ICStructInit TIM_SelectInputTrigger TIM_SelectOutputTrigger TIM_SelectSlaveMode 单独配置四个通道的分…

聊一聊UDF/UDTF/UDAF是什么,开发要点及如何使用?

背景介绍 UDF来源于Hive&#xff0c;Hive可以允许用户编写自己定义的函数UDF&#xff0c;然后在查询中进行使用。星环Inceptor中的UDF开发规范与Hive相同&#xff0c;目前有3种UDF&#xff1a; A. UDF--以单个数据行为参数&#xff0c;输出单个数据行&#xff1b; UDF&#…

打破生态「孤岛」,Catizen将开启Telegram小游戏2.0时代?

Catizen&#xff1a;引领Telegram x TON生态的顶级猫咪链游 在区块链游戏领域&#xff0c;吸引玩家的首要因素往往是游戏的趣味性。然而&#xff0c;仅靠趣味性无法评估一个项目的长期价值和发展潜力。真正能在区块链游戏市场中取得长久成功的项目&#xff0c;无一例外都依靠扎…

【消息队列】RabbitMQ集群原理与搭建

目录 前言1、集群搭建1.1、安装RabbitMQ1.1.1、前置要求1.1.2、安装Erlang环境①创建yum库配置文件②加入配置内容③更新yum库④正式安装Erlang 1.1.3、安装RabbitMQ1.1.4、RabbitMQ基础配置1.1.5、收尾工作 1.2、克隆VMWare虚拟机1.2.1、目标1.2.2、克隆虚拟机1.2.3、给新机设…

智能充电桩网关,构建高效充电网络

近年来我国新能源汽车的增长速度出现明显的上升趋势&#xff0c;但是其充电桩的发展还比较缓慢。目前在充电桩系统设计期间仍存在一些问题&#xff0c;主要表现在充电设施短缺、充电难等问题&#xff0c;这些问题的发生均会在一定程度上限制新能源汽车的发展&#xff0c;这就需…

navicat Premium发布lite免费版本了

Navicat Premium发布lite免费版本了&#xff0c;下面是完整功能对比链接 Navicat Premium 功能列表 | Navicat 免费版本下载链接如下&#xff1a; Navicat | 免费下载 Navicat Premium Lite 开发功能完全够用&#xff0c;点赞。 dbeaver该如何应对。

振弦采集仪在大型工程安全监测中的应用探索

振弦采集仪在大型工程安全监测中的应用探索 振弦采集仪是一种用于监测结构振动和变形的设备&#xff0c;它通过采集振弦信号来分析结构的动态特性。在大型工程安全监测中&#xff0c;振弦采集仪具有重要的应用价值&#xff0c;可以帮助工程师和监测人员实时了解结构的状况&…

如何在线上快速定位bug(干货)

想必有许多人都想我刚进公司一样不会快速定位线上bug吧&#xff0c;不会快速定位bug会大大降低我们的开发效率&#xff0c;随之而来的就是工作质量下降、业绩下滑。 我总结了一些我常用的线上定位技巧&#xff0c;希望能帮助到大家&#xff01; 我这里以使用阿里云日志分析作…

Attention步骤

一个典型的Attention思想包括三部分&#xff1a;Qquery、Kkey、Vvalue。 Q是query&#xff0c;是输入的信息&#xff1b;key和value成组出现&#xff0c;通常是原始文本等已有的信息&#xff1b;通过计算Q与K之间的相关性a&#xff0c;得出不同的K对输出的重要程度&#xff1b;…

2021年12月电子学会青少年软件编程 中小学生Python编程等级考试三级真题解析(选择题)

2021年12月Python编程等级考试三级真题解析 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、小明在学习计算机时&#xff0c;学习到了一个十六进制数101,这个十六进制数对应的十进制数的数值是 A、65 B、66 C、256 D、257 答案&#xff…

为什么javaer认为后台系统一定要用java开发?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;公司有两个开发团队&#xf…

4年突破20亿,今麦郎如何持续策划凉白开极致产品力?

范总在方便面市场拥有30年的丰富经验&#xff0c;并曾创造过奇迹。1994年&#xff0c;他从冰糖生意进入方便面行业&#xff0c;创立今麦郎的前身华龙集团。当时&#xff0c;方便面市场已经进入红海阶段&#xff0c;市场上有上千家企业&#xff0c;康师傅和统一占据了80%的市场份…

计算机视觉-期末复习-简答/名词解释/综合设计

目录 第一讲--计算机/机器视觉概述 名词解释 简答 第二讲--图像处理概述 名词解释 简答 第三讲没划重点习题 第四讲--特征提取与选择 名词解释 简答 综合题 第五讲--不变特征 名词解释 简答 第六讲--物体分类与检测 简答 综合题 第七讲--视觉注意机制 简答 …

三角洲行动卡顿严重?这样快速解决三角洲行动国服卡顿问题

三角洲行动官方精心设计的游戏地图和敌人布局&#xff0c;加上“曼德尔砖”等目标导向性道具的引入&#xff0c;更是为玩家之间的竞技和争夺增添了无数的变数。每一次的争夺都如同是一场智慧与勇气的较量&#xff0c;让人热血沸腾&#xff0c;无法自拔。在这个战场上&#xff0…

第六篇:精通Docker Compose:打造高效的多容器应用环境

精通Docker Compose&#xff1a;打造高效的多容器应用环境 1. 引言 1.1 目的与重要性 在现代软件开发中&#xff0c;随着应用程序的复杂性不断增加&#xff0c;传统的单一容器部署方式已无法满足需求。Docker Compose作为一种强大的工具&#xff0c;专门用于定义和运行多容器…

用户中心项目全流程

企业做项目流程 需求分析 > 设计&#xff08;概要设计 、 详细设计&#xff09; > 技术选型 >初始化项目 / 引入需要的技术 > 写个小demo > 写代码 &#xff08;实现业务逻辑&#xff09; > 测试&#xff08;单元测试&#xff09;> 代码提交 / 代码评审 …

ClickHouse-Keeper安装使用

1.rpm 安装 clickhouse-keeper rpm -ivh clickhouse-keeper-23.8.11.28.x86_64.rpm 2.修改keeper的配置文件 vi /etc/clickhouse-keeper/keeper_config.xml修改部分参数 1.可修改日志等存储路径 2.增加监听配置 <listen_host>0.0.0.0</listen_host> 3.server_id…