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

news2024/10/4 22:22:50

欢迎你们踏入这个充满无限可能性的编程世界!作为一名热爱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 random

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.")

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

连续玩几个游戏

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

import random

while 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 IntEnum

class Action(IntEnum):
    Rock = 0
    Paper = 1
    Scissors = 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 IntEnum

class Action(IntEnum):
    Rock = 0
    Paper = 1
    Scissors = 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}")
        continue

    computer_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 scissors
        Action.Paper: [Action.Rock],  # Paper beats rock
        Action.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 = 0
    Paper = 1
    Scissors = 2
    Lizard = 3
    Spock = 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 IntEnum

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

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]
}

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 action

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

def 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}")
        continue

    computer_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.coloradmin.cn/o/1871434.html

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

相关文章

生成器模式详解:用法与示例

目录 生成器模式生成器模式结构生成器模式应用场景生成器模式优缺点练手题目题目描述输入描述输出描述提示信息题解 生成器模式 生成器模式&#xff0c;又称建造者模式&#xff0c;是一种创建型设计模式&#xff0c; 使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代…

UE5的引擎初始化流程

UE5的引擎初始化流程 首先跟着UE的官方文档[1]获取到UE的源代码&#xff0c;然后在参考GitHub上repo的readme&#xff0c;将UE引擎从源码build出来。以Windows平台为例&#xff0c;先找到引擎的入口函数&#xff1a; int32 WINAPI WinMain(_In_ HINSTANCE hInInstance, _In_op…

头歌资源库(17)多机调度问题

一、 问题描述 二、算法思想 首先&#xff0c;将作业按照所需时间从大到小排序。 创建一个长度为m的数组task_time&#xff0c;用来记录每台机器已经加工的作业时间。 从第一个作业开始&#xff0c;依次将作业分配给空闲的机器&#xff0c;并更新task_time数组。 对于每个…

springboot 集成阿里云 OSS

引入依赖 <!-- 阿里云oss依赖 --> <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.9.1</version> </dependency><?xml version"1.0" encoding"…

阿里云centos 7.9 使用宝塔面板部署.netcore 6.0

前言&#xff1a; 我有一个netcore6.0的系统接口和手机端程序的站点程序之前是部署在一台windows测试服务器的IIS站点中&#xff0c; 服务器最近压力太大扛不住了&#xff0c;买了一台centos7.9的阿里云服务器准备进行迁移。具体操作日记如下。 一、安装宝塔面板 这一步涉及…

【人工智能学习之图像操作(二)】

【人工智能学习之图像操作&#xff08;二&#xff09;】 图像上的运算图像混合按位运算 图像的几何变换仿射变换透视变换膨胀操作腐蚀操作开操作闭操作梯度操作礼帽操作黑帽操作 图像上的运算 图像上的算术运算&#xff0c;加法&#xff0c;减法&#xff0c;图像混合等。 加减…

AI进阶指南第五课,大模型相关概念(知识库,微调)

虽然前面大概讲了一下大模型的一些基本概念&#xff0c;但是那些都比较偏向于大模型本身&#xff0c;但是我们使用的时候如果只靠大模型肯定是不行的。 就好比如果一个人只有一个脑子&#xff0c;其他什么部位也没有的话&#xff0c;那场面。&#xff08;感觉现在网上的AI图片…

泰迪智能科技实验室产品-云计算资源管理平台介绍

云计算资源管理平台是一款集群应用程序管理平台&#xff0c;以Docker、Kubernetes为核心引擎的容器化应用部署、运行环境&#xff0c;对数据中心的物理服务器、网络、存储、虚拟服务器等基础架构资源进行集中统一的管理、分配、监控等。平台旨在围绕行业应用逐步由“虚拟化”向…

llama-3 本地化部署实验

国产大模型的API 有限&#xff0c;编写langchain 应用问题很多。使用openai 总是遇到网络问题&#xff0c;尝试使用ollama在本地运行llama-3。结果异常简单。效果不错。llama-3 的推理能力感觉比openai 的GPT-3.5 好。 Ollama 下载 官网&#xff1a;https://ollama.com/downl…

计算机毕业设计hadoop+spark+hive知识图谱医生推荐系统 医生数据分析可视化大屏 医生爬虫 医疗可视化 医生大数据 机器学习 大数据毕业设计

测试过程及结果 本次对于医生推荐系统测试通过手动测试的方式共进行了两轮测试。 &#xff08;1&#xff09;第一轮测试中执行了个20个测试用例&#xff0c;通过16个&#xff0c;失败4个&#xff0c;其中属于严重缺陷的1个&#xff0c;属于一般缺陷的3个。 &#xff08;2&am…

llm学习2--使用embedding和数据处理

首先可以简单了解一下向量数据库相关知识&#xff1a; 向量数据库相关知识&#xff08;搬运学习&#xff0c;建议还是看原文&#xff0c;这个只是我自己的学习记录&#xff09;-CSDN博客 补充&#xff1a; 使用embedding API 文心千帆API Embedding-V1是基于百度文心大模型…

微服务应用与开发知识点练习【Gateway,OpenFeign,Dubbo,RocketMQ和RabbitMQ,JPA,Redis,Mycat】

一、选择题 【Gateway】 1.Spring Cloud Gateway与Nacos整合实现负载均衡时&#xff0c;路由配置中的URI前缀应该是&#xff1f;&#xff08;A &#xff09; A. lb:// B. nacos:// C. http:// D. discovery:// Spring Cloud Gateway与Nacos整合实现负载均衡时&#xff0c…

【Linux系统编程】进程控制(创建、退出、等待、替换)

目录 再聊进程创建 进程终止 进程等待 进程程序替换 再聊进程创建 初识进程创建 关于进程创建&#xff0c;这里只会说结论&#xff0c;在上面这篇文章中对进程创建进行了比较详细的阐述&#xff0c;而接下来要介绍的&#xff0c;都是基于上文说过的来展开的 一些较为重要…

【FFmpeg】avformat_alloc_output_context2函数

【FFmpeg】avformat_alloc_output_context2函数 1.avformat_alloc_output_context21.1 初始化AVFormatContext&#xff08;avformat_alloc_context&#xff09;1.2 格式猜测&#xff08;av_guess_format&#xff09;1.2.1 遍历可用的fmt&#xff08;av_muxer_iterate&#xff0…

Bad owner or permissions on C:\\Users\\username/.ssh/config > 过程试图写入的管道不存在。

使用windows连接远程服务器出现Bad owner or permissions 错误 问题&#xff1a; 需要修复文件权限 SSH 配置文件应具有受限权限以防止未经授权的访问 确保只有用户对该.ssh/config文件具有读取权限 解决方案&#xff1a; 在windows下打开命令行&#xff0c;通过以下命令打开文…

Spring Cloud Alibaba之负载均衡组件Ribbon

一、什么是负载均衡&#xff1f; &#xff08;1&#xff09;概念&#xff1a; 在基于微服务架构开发的系统里&#xff0c;为了能够提升系统应对高并发的能力&#xff0c;开发人员通常会把具有相同业务功能的模块同时部署到多台的服务器中&#xff0c;并把访问业务功能的请求均…

Kubernetes之 资源管理

系列文章目录 Kubernetes之 资源管理 文章目录 系列文章目录前言一、资源管理介绍二、YAML语言介绍 1.1.YAML语法&#xff1a;2.读入数据总结 一、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 1. kub…

SMTP 转发器/中继

设置中继邮件服务器 我将设置一个邮件服务器&#xff0c;该服务器稍后将用作 SMTP 中继服务器。首先&#xff0c;在 Digital Ocean 中创建了一个新的 Ubuntu Droplet&#xff1a; Postfix MTA 安装在droplet上&#xff0c;并带有&#xff1a; apt-get install postfix 在pos…

序列检测器(Moore型)

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 请用Moore型状态机实现序列“1101”从左至右的不重叠检测。 电路的接口如下图所示。当检测到“1101”&#xff0c;Y输出一个时钟周期的高电平脉冲。 接口电路图如下&#xff1a; 输入描述&#xff1a…

【机器学习300问】132、自注意力机制(Self-Attention)和传统注意力机制(Attention)的区别?

最近学习注意力机制的时候&#xff0c;发现相同的概念很多&#xff0c;有必要给这些概念做一下区分&#xff0c;不然后续的学习可能会混成一团。本文先区分一下自注意力机制和传统注意力机制。我会先直接给出它们之间有何区别的结论&#xff0c;然后通过一个例子来说明。 【机…