当前位置: 首页 > news >正文

【Dison夏令营 Day 03】使用 Python 创建我们自己的 21 点游戏

21 点(英文:Blackjack)是一种在赌场玩的纸牌游戏。这种游戏的参与者不是互相竞争,而是与赌场指定的庄家竞争。在本文中,我们将从头开始创建可在终端上玩的玩家与庄家之间的二十一点游戏。
在这里插入图片描述

二十一点规则

我们将为从未玩过二十一点的读者提供一套简短的规则。21 点的神奇数字是 21。玩家拿到的所有牌的价值相加,如果总和超过 21,玩家就会立即爆牌并输掉。

如果玩家拿到的牌正好是 21,那么玩家就赢了庄家。否则,要想获胜,玩家的牌数总和必须大于庄家的牌数总和。

每张扑克牌的面值都是 10,而 A 可以被算作 1 或 11,这对玩家的获胜机会非常有利。其余牌的价值由其编号决定。

二十一点游戏的发牌过程如下:
  • 一张牌发给朝上的玩家(所有人都能看到)。
  • 庄家给自己发一张所有人都能看到的牌。
  • 另一张牌发给朝上的玩家。
  • 庄家给自己发一张朝下的牌。
  • 玩家必须决定是用现有的牌站着还是再拿一张牌。
  • 如果玩家决定打牌,庄家会再发一张牌。
  • 如果玩家决定不出牌,庄家就会亮出隐藏的牌。
  • 庄家无权决定玩家是跟还是不跟。一般规则是,如果庄家牌的总和小于 17,庄家需要继续打出更多的牌。
  • 一旦庄家牌的总和达到或超过 17 点,庄家就有义务不出牌。
  • 根据最后的牌数决定胜负。

了解规则后,21 点游戏的编程就变得简单了。从零开始创建基于终端的游戏需要三个主要部分:游戏设计、游戏逻辑和玩家互动管理。

用 Python 设计二十一点

首先,我们将进行游戏设计。我们的任务是在终端上有效地显示一系列牌,如下图所示。

在这里插入图片描述
我们需要一个能打印卡片序列且与卡片数量无关的函数。此外,它还必须提供在需要时打印隐藏卡片的功能。

下面的代码解决了我们的问题。

# 打印卡片的功能
def print_cards(cards, hidden):s = ""for card in cards:s = s + "\t ________________"if hidden:s += "\t ________________"print(s)s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|                |"    print(s)s = ""for card in cards:if card.value == '10':s = s + "\t|  {}            |".format(card.value)else:s = s + "\t|  {}             |".format(card.value)  if hidden:s += "\t|                |"    print(s)s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|      * *       |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|    *     *     |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|   *       *    |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|   *       *    |"print(s)    s = ""for card in cards:s = s + "\t|       {}        |".format(card.suit)if hidden:s += "\t|          *     |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|         *      |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|        *       |"print(s)s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|                |"print(s)s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|                |"print(s)    s = ""for card in cards:if card.value == '10':s = s + "\t|            {}  |".format(card.value)else:s = s + "\t|            {}   |".format(card.value)if hidden:s += "\t|        *       |"        print(s)    s = ""for card in cards:s = s + "\t|________________|"if hidden:s += "\t|________________|"print(s)        print()

每张卡片的详细信息都存储为一个卡片对象。print_cards() 函数的第二个参数是一个布尔值,表示是否显示隐藏的卡片。

创建卡片

在类和对象的帮助下,我们可以创建一个花色和数值的组合来表示一张 “扑克牌”。在二十一点游戏中,一张牌有三个属性:花色、代表值和作为分数的值。

所有上述属性都在下面的 "卡 "类中维护。

# 卡片类别的定义
class Card:def __init__(self, suit, value, card_value):# 纸牌的花色,如黑桃和梅花self.suit = suit# 表示牌的价值,如 A 表示 Ace,K 表示 Kingself.value = value# 卡片的分值,如 10 分代表国王self.card_value = card_value

使用上述类,我们可以创建一副包含 52 个 Card 对象的纸牌。

一些基本价值观

每种纸牌游戏都需要一些基本价值,如花色类型、纸牌类型以及每张纸牌的价值。

为了更方便理解,我代码和备注都用全英文了

# The type of suit
suits = ["Spades", "Hearts", "Clubs", "Diamonds"]# The suit value 
suits_values = {"Spades":"\u2664", "Hearts":"\u2661", "Clubs": "\u2667", "Diamonds": "\u2662"}# The type of card
cards = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]# The card value
cards_values = {"A": 11, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, "10":10, "J":10, "Q":10, "K":10}

这里需要注意的一点是,A 最初被标记为 11 点。这一策略背后的理念是,每当玩家/发牌者的分数似乎超过 21 分时,我们就可以将 A 的分数(如果发牌)减为 1 分。

我们稍后将在本文中看到减分的实施。

生成一副扑克牌

一副普通的扑克牌由 52 张牌组成,每张牌都有不同的花色和价值组合。利用上述基本值和卡片类,我们可以生成一副扑克牌。

# The deck of cards
deck = []# Loop for every type of suit
for suit in suits:# Loop for every type of card in a suitfor card in cards:# Adding card to the deckdeck.append(Card(suits_values[suit], card, cards_values[card]))

实际上,21 点游戏涉及多副扑克牌,因此可以重复使用上述循环来填充多副扑克牌。

新创建的牌面将传递给执行游戏的函数。

blackjack_game(deck)      

让我们来了解一下玩家和电脑发牌员之间 21 点游戏单次迭代背后的游戏逻辑。

声明重要的游戏变量

在任何时刻,我们都需要以下游戏变量:

  • 玩家和庄家的发牌列表。
  • 双方牌值的总和。
# Function for a single game of blackjack
def blackjack_game(deck):global cards_values# Cards for both dealer and playerplayer_cards = []dealer_cards = []# Scores for both dealer and playerplayer_score = 0dealer_score = 0

当我们设计游戏逻辑时,这些游戏变量就会发挥作用。

Python 二十一点游戏逻辑

整个游戏逻辑都围绕着发牌和玩家对击中或站立的选择。只要我们处理好上述两件事,今天的工作就完成了。

发牌的第一阶段:必发牌

初始发牌包括给玩家和庄家两张牌。不过,庄家的第二张牌必须保持未知。

# Initial dealing for player and dealer
while len(player_cards) < 2:# Randomly dealing a cardplayer_card = random.choice(deck)player_cards.append(player_card)deck.remove(player_card)# Updating the player scoreplayer_score += player_card.card_value# In case both the cards are Ace, make the first ace value as 1 if len(player_cards) == 2:if player_cards[0].card_value == 11 and player_cards[1].card_value == 11:player_cards[0].card_value = 1player_score -= 10# Print player cards and score      print("PLAYER CARDS: ")print_cards(player_cards, False)print("PLAYER SCORE = ", player_score)input()# Randomly dealing a carddealer_card = random.choice(deck)dealer_cards.append(dealer_card)deck.remove(dealer_card)# Updating the dealer scoredealer_score += dealer_card.card_value# Print dealer cards and score, keeping in mind to hide the second card and scoreprint("DEALER CARDS: ")if len(dealer_cards) == 1:print_cards(dealer_cards, False)print("DEALER SCORE = ", dealer_score)else:print_cards(dealer_cards[:-1], True)    print("DEALER SCORE = ", dealer_score - dealer_cards[-1].card_value)# In case both the cards are Ace, make the second ace value as 1 if len(dealer_cards) == 2:if dealer_cards[0].card_value == 11 and dealer_cards[1].card_value == 11:dealer_cards[1].card_value = 1dealer_score -= 10input()# Player gets a blackjack   
if player_score == 21:print("PLAYER HAS A BLACKJACK!!!!")print("PLAYER WINS!!!!")quit()

对于一个看似简单的交易来说,这可能是一个很大的挑战。让我们来了解一下上述代码所涉及的过程:

  • 主循环一直运行到玩家和庄家各拿到两张牌为止。
  • 庄家从牌组中随机抽取一张牌,然后在下一步中将这张牌从牌组中移除。
  • 这张牌的价值加到玩家的分数中。
  • 同样,庄家也会随机抽取一张牌,并将其价值计入庄家得分。
  • 玩家的牌正常显示在屏幕上。
  • 庄家的牌会小心显示,不会显示第二张牌及其牌值。
  • 如果任何一方拿到双 A,则会调整其分数,以确保双方都不爆牌。
  • 上述所有步骤顺利完成后,我们进入第二阶段发牌。

注:玩家和庄家的分数调整有细微差别。前者调整的是第一张牌的价值,而后者调整的是第二张牌的价值。

之所以要调整第二张牌的价值,是因为如果我们调整了第一张牌的价值,就会暴露隐藏牌是 Ace 的身份。

最后要做的一件事是检查玩家是否已经拥有 21 点。如果有,玩家获胜,游戏结束。

注:input() 函数会暂停程序,直到玩家按下 "ENTER "键。这样可以防止所有游戏事件的快速回放。

clear()函数负责清除终端,为游戏提供一个干净的界面。

第二阶段发牌:玩家的选择

发牌的第二阶段取决于玩家的决定,是要另一张牌来提高分数,还是维持现有的牌。

# Print dealer and player cards
print("DEALER CARDS: ")
print_cards(dealer_cards[:-1], True)
print("DEALER SCORE = ", dealer_score - dealer_cards[-1].card_value)print() print("PLAYER CARDS: ")
print_cards(player_cards, False)
print("PLAYER SCORE = ", player_score)# Managing the player moves
while player_score < 21:choice = input("Enter H to Hit or S to Stand : ")# Sanity checks for player's choiceif len(choice) != 1 or (choice.upper() != 'H' and choice.upper() != 'S'):clear()print("Wrong choice!! Try Again")# If player decides to HITif choice.upper() == 'H':# Dealing a new cardplayer_card = random.choice(deck)player_cards.append(player_card)deck.remove(player_card)# Updating player scoreplayer_score += player_card.card_value# Updating player score in case player's card have ace in themc = 0while player_score > 21 and c < len(player_cards):if player_cards[c].card_value == 11:player_cards[c].card_value = 1player_score -= 10c += 1else:c += 1 clear()     # Print player and dealer cardsprint("DEALER CARDS: ")print_cards(dealer_cards[:-1], True)print("DEALER SCORE = ", dealer_score - dealer_cards[-1].card_value)print()print("PLAYER CARDS: ")print_cards(player_cards, False)print("PLAYER SCORE = ", player_score)# If player decides to Standif choice.upper() == 'S':break# Check if player has a Blackjack
if player_score == 21:print("PLAYER HAS A BLACKJACK")quit()# Check if player busts
if player_score > 21:print("PLAYER BUSTED!!! GAME OVER!!!")quit()

玩家决定是打还是不打,直到分数超过 21 分或玩家决定不打为止。玩家发牌的数量没有限制,只有分数限制。

玩家每决定击中一次,就会从牌组中发出一张新牌,分数也会随之更新。如前所述,A 可以算作 1 或 11。如果分数超过 21,一段特殊的代码会将 A 的值从 11 转换为 1。

当玩家对当前分数满意时,他就会起立。当他这样做时,我们会在进行一些强制性检查(如二十一点或爆牌情况)后进入发牌的最后阶段。

发牌的最后阶段:庄家的牌

在发牌的最后阶段,庄家的暗牌会被揭开,庄家的分数也会被揭开。根据二十一点的标准规则,庄家必须给自己发更多的牌,直到分数大于或等于 17。

# Managing the dealer moves
while dealer_score < 17:clear() print("DEALER DECIDES TO HIT.....")# Dealing card for dealerdealer_card = random.choice(deck)dealer_cards.append(dealer_card)deck.remove(dealer_card)# Updating the dealer's scoredealer_score += dealer_card.card_value# Updating player score in case player's card have ace in themc = 0while dealer_score > 21 and c < len(dealer_cards):if dealer_cards[c].card_value == 11:dealer_cards[c].card_value = 1dealer_score -= 10c += 1else:c += 1# print player and dealer cardsprint("PLAYER CARDS: ")print_cards(player_cards, False)print("PLAYER SCORE = ", player_score)print()print("DEALER CARDS: ")print_cards(dealer_cards, False)print("DEALER SCORE = ", dealer_score)input()

庄家继续击球,直到分数越过 17 分为止。如果需要,我们也有类似的方法将 A 的牌值从 11 转换为 1。

游戏终结

当庄家的分数是 17 或更多时,我们就进入 “终局”,即比较牌局的胜负。可能会出现以下几种情况:

  • 庄家爆牌 - 庄家的分数超过 21。
  • 庄家有 21 点 - 庄家的准确分数是 21。
  • 平局 - 玩家和庄家的分数相同。
  • 闲家赢 - 闲家的分数超过庄家。
  • 庄家赢 - 庄家的分数超过闲家。

我们会检查上述每种可能性,并宣布获胜者。

# Dealer busts
if dealer_score > 21:        print("DEALER BUSTED!!! YOU WIN!!!") quit()  # Dealer gets a blackjack
if dealer_score == 21:print("DEALER HAS A BLACKJACK!!! PLAYER LOSES")quit()# TIE Game
if dealer_score == player_score:print("TIE GAME!!!!")# Player Wins
elif player_score > dealer_score:print("PLAYER WINS!!!")                 # Dealer Wins
else:print("DEALER WINS!!!")  

至此,玩家与庄家之间的 21 点游戏的单次迭代结束。

二十一点游戏的完整 Python 代码

import random
import os
import time# The Card class definition
class Card:def __init__(self, suit, value, card_value):# Suit of the Card like Spades and Clubsself.suit = suit# Representing Value of the Card like A for Ace, K for Kingself.value = value# Score Value for the Card like 10 for Kingself.card_value = card_value# Clear the terminal
def clear():os.system("clear")# Function to print the cards
def print_cards(cards, hidden):s = ""for card in cards:s = s + "\t ________________"if hidden:s += "\t ________________"print(s)s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|                |"    print(s)s = ""for card in cards:if card.value == '10':s = s + "\t|  {}            |".format(card.value)else:s = s + "\t|  {}             |".format(card.value)  if hidden:s += "\t|                |"    print(s)s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|      * *       |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|    *     *     |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|   *       *    |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|   *       *    |"print(s)    s = ""for card in cards:s = s + "\t|       {}        |".format(card.suit)if hidden:s += "\t|          *     |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|         *      |"print(s)    s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|        *       |"print(s)s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|                |"print(s)s = ""for card in cards:s = s + "\t|                |"if hidden:s += "\t|                |"print(s)    s = ""for card in cards:if card.value == '10':s = s + "\t|            {}  |".format(card.value)else:s = s + "\t|            {}   |".format(card.value)if hidden:s += "\t|        *       |"        print(s)    s = ""for card in cards:s = s + "\t|________________|"if hidden:s += "\t|________________|"print(s)        print()# Function for a single game of blackjack
def blackjack_game(deck):# Cards for both dealer and playerplayer_cards = []dealer_cards = []# Scores for both dealer and playerplayer_score = 0dealer_score = 0clear()# Initial dealing for player and dealerwhile len(player_cards) < 2:# Randomly dealing a cardplayer_card = random.choice(deck)player_cards.append(player_card)deck.remove(player_card)# Updating the player scoreplayer_score += player_card.card_value# In case both the cards are Ace, make the first ace value as 1 if len(player_cards) == 2:if player_cards[0].card_value == 11 and player_cards[1].card_value == 11:player_cards[0].card_value = 1player_score -= 10# Print player cards and score      print("PLAYER CARDS: ")print_cards(player_cards, False)print("PLAYER SCORE = ", player_score)input()# Randomly dealing a carddealer_card = random.choice(deck)dealer_cards.append(dealer_card)deck.remove(dealer_card)# Updating the dealer scoredealer_score += dealer_card.card_value# Print dealer cards and score, keeping in mind to hide the second card and scoreprint("DEALER CARDS: ")if len(dealer_cards) == 1:print_cards(dealer_cards, False)print("DEALER SCORE = ", dealer_score)else:print_cards(dealer_cards[:-1], True)    print("DEALER SCORE = ", dealer_score - dealer_cards[-1].card_value)# In case both the cards are Ace, make the second ace value as 1 if len(dealer_cards) == 2:if dealer_cards[0].card_value == 11 and dealer_cards[1].card_value == 11:dealer_cards[1].card_value = 1dealer_score -= 10input()# Player gets a blackjack   if player_score == 21:print("PLAYER HAS A BLACKJACK!!!!")print("PLAYER WINS!!!!")quit()clear()# Print dealer and player cardsprint("DEALER CARDS: ")print_cards(dealer_cards[:-1], True)print("DEALER SCORE = ", dealer_score - dealer_cards[-1].card_value)print() print("PLAYER CARDS: ")print_cards(player_cards, False)print("PLAYER SCORE = ", player_score)# Managing the player moveswhile player_score < 21:choice = input("Enter H to Hit or S to Stand : ")# Sanity checks for player's choiceif len(choice) != 1 or (choice.upper() != 'H' and choice.upper() != 'S'):clear()print("Wrong choice!! Try Again")# If player decides to HITif choice.upper() == 'H':# Dealing a new cardplayer_card = random.choice(deck)player_cards.append(player_card)deck.remove(player_card)# Updating player scoreplayer_score += player_card.card_value# Updating player score in case player's card have ace in themc = 0while player_score > 21 and c < len(player_cards):if player_cards[c].card_value == 11:player_cards[c].card_value = 1player_score -= 10c += 1else:c += 1 clear()     # Print player and dealer cardsprint("DEALER CARDS: ")print_cards(dealer_cards[:-1], True)print("DEALER SCORE = ", dealer_score - dealer_cards[-1].card_value)print()print("PLAYER CARDS: ")print_cards(player_cards, False)print("PLAYER SCORE = ", player_score)# If player decides to Standif choice.upper() == 'S':breakclear() # Print player and dealer cardsprint("PLAYER CARDS: ")print_cards(player_cards, False)print("PLAYER SCORE = ", player_score)print()print("DEALER IS REVEALING THE CARDS....")print("DEALER CARDS: ")print_cards(dealer_cards, False)print("DEALER SCORE = ", dealer_score)# Check if player has a Blackjackif player_score == 21:print("PLAYER HAS A BLACKJACK")quit()# Check if player bustsif player_score > 21:print("PLAYER BUSTED!!! GAME OVER!!!")quit()input() # Managing the dealer moveswhile dealer_score < 17:clear() print("DEALER DECIDES TO HIT.....")# Dealing card for dealerdealer_card = random.choice(deck)dealer_cards.append(dealer_card)deck.remove(dealer_card)# Updating the dealer's scoredealer_score += dealer_card.card_value# Updating player score in case player's card have ace in themc = 0while dealer_score > 21 and c < len(dealer_cards):if dealer_cards[c].card_value == 11:dealer_cards[c].card_value = 1dealer_score -= 10c += 1else:c += 1# print player and dealer cardsprint("PLAYER CARDS: ")print_cards(player_cards, False)print("PLAYER SCORE = ", player_score)print()print("DEALER CARDS: ")print_cards(dealer_cards, False)print("DEALER SCORE = ", dealer_score)      input()# Dealer bustsif dealer_score > 21:        print("DEALER BUSTED!!! YOU WIN!!!") quit()  # Dealer gets a blackjackif dealer_score == 21:print("DEALER HAS A BLACKJACK!!! PLAYER LOSES")quit()# TIE Gameif dealer_score == player_score:print("TIE GAME!!!!")# Player Winselif player_score > dealer_score:print("PLAYER WINS!!!")                 # Dealer Winselse:print("DEALER WINS!!!")                 if __name__ == '__main__':# The type of suitsuits = ["Spades", "Hearts", "Clubs", "Diamonds"]# The suit value suits_values = {"Spades":"\u2664", "Hearts":"\u2661", "Clubs": "\u2667", "Diamonds": "\u2662"}# The type of cardcards = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]# The card valuecards_values = {"A": 11, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, "10":10, "J":10, "Q":10, "K":10}# The deck of cardsdeck = []# Loop for every type of suitfor suit in suits:# Loop for every type of card in a suitfor card in cards:# Adding card to the deckdeck.append(Card(suits_values[suit], card, cards_values[card]))blackjack_game(deck) 

读者不必遵循整个编码顺序。通过增加多人对庄家的功能,可以对上述代码进行各种修改。

结论

二十一点游戏起初看似简单随意,但只有当玩家遵循某些策略(如算牌)时,游戏才会变得复杂。

世界上流传着许多不同版本的 21 点游戏,如瑞典酒吧 21 点游戏和家庭游戏 21 点游戏。好奇的读者可以了解这些变体,并尝试利用本文中获得的知识来实施它们。

感谢大家花时间阅读我的文章,你们的支持是我不断前进的动力。期望未来能为大家带来更多有价值的内容,请多多关注我的动态!

相关文章:

【Dison夏令营 Day 03】使用 Python 创建我们自己的 21 点游戏

21 点(英文&#xff1a;Blackjack)是一种在赌场玩的纸牌游戏。这种游戏的参与者不是互相竞争&#xff0c;而是与赌场指定的庄家竞争。在本文中&#xff0c;我们将从头开始创建可在终端上玩的玩家与庄家之间的二十一点游戏。 二十一点规则 我们将为从未玩过二十一点的读者提供…...

Workbench密码登录登录失败

Workbench密码登录登录失败操作系统禁用了密码登录方式&#xff0c;会导致使用了正确的用户名和密码仍无法登录 sudo vim /etc/ssh/sshd_config 输入O进入编辑 改完后重启 systemctl restart sshd.service 登录报错 有试了几遍登上了 可能是改完还要等一会儿...

哈尔滨高校大学智能制造实验室数字孪生可视化系统平台项目的验收

哈尔滨高校大学智能制造实验室数字孪生可视化系统平台项目的验收&#xff0c;标志着这一技术在教育领域的应用取得了新的突破。项目旨在开发一个数字孪生可视化系统平台&#xff0c;用于哈尔滨高校大学智能制造实验室的设备模拟、监测与数据分析。项目的主要目标包括&#xff1…...

009、MongoDB的分片策略

目录 MongoDB的分片策略:范围分片vs哈希分片 1. 范围分片(Range Sharding) 1.1 工作原理 1.2 优点 1.3 缺点 1.4 研究支持 2. 哈希分片(Hash Sharding) 2.1 工作原理 2.2 优点 2.3 缺点 2.4 研究支持 3. 选择合适的分片策略 4. 实践案例 4.1 电子商务平台 4.2 社…...

go~缓存设计配合singleFlight

一个缓存设计&#xff0c;配合go的singleFlight 最开始的设计如下 添加分布式缓存 上线后分布式缓存上涨的流量并不等于下游下降的流量&#xff0c;而是下游下降的流量 * 2&#xff5e;3 究其原因&#xff0c;就是采用了go的singleFlight&#xff0c;假定请求缓存时长10ms&a…...

多线程引发的安全问题

前言&#x1f440;~ 上一章我们介绍了线程的一些基础知识点&#xff0c;例如创建线程、查看线程、中断线程、等待线程等知识点&#xff0c;今天我们讲解多线程下引发的安全问题 线程安全&#xff08;最复杂也最重要&#xff09; 产生线程安全问题的原因 锁&#xff08;重要…...

在晋升受阻或遭受不公待遇申诉时,这样写是不是好一些?

在晋升受阻或遭受不公待遇申诉时&#xff0c;这样写是不是好一些&#xff1f; 在职场中&#xff0c;晋升受阻或遭受不公待遇是员工可能面临的问题之一。面对这样的情况&#xff0c;如何撰写一份有效的申诉材料&#xff0c;以维护自己的合法权益&#xff0c;就显得尤为重要。#李…...

LeetCode 2710.移除字符串中的尾随零:模拟

【LetMeFly】2710.移除字符串中的尾随零&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/ 给你一个用字符串表示的正整数 num &#xff0c;请你以字符串形式返回不含尾随零的整数 num 。 示例 1&#xff1a; 输…...

代码随想录训练营第二十三天 39组合总和 40组合总和II 131分割回文串

第一题&#xff1a; 原题链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 终止条件&#xff1a; 用一个sum值来记录当前组合中元素的总和。当sum的值大于target的时候证明该组合不合适&#xff0c;直接return。当sum的值等于target的…...

【C++】数组、字符串

六、数组、字符串 讨论数组离不开指针&#xff0c;指针基本上就是数组的一切的基础&#xff0c;数组和指针的相关内容参考我的C系列博文&#xff1a;【C语言学习笔记】四、指针_通过变量名访问内存单元中的数据缺点-CSDN博客【C语言学习笔记】三、数组-CSDN博客 1、数组就是&…...

MySQL InnoDB支持几种行格式

数据库表的行格式决定了一行数据是如何进行物理存储的&#xff0c;进而影响查询和DML操作的性能。 在InnoDB中&#xff0c;常见的行格式有4种&#xff1a; 1、COMPACT&#xff1a;是MySQL 5.0之前的默认格式&#xff0c;除了保存字段值外&#xff0c;还会利用空值列表保存null…...

Day6: 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

题目344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; void reverseString(vector<char>& s) {int len s.size();int left 0;int right len - 1;while (left < right){swap(s[left], s[right--]);}return;} 题目541. 反转字符串 II - 力扣&#xff0…...

kubekey 离线安装高可用 kubernetes 集群

1. 准备环境 版本&#xff1a; kubernetes: v1.29.2 kubesphere: v3.4.1 kubekey: v3.1.1 说明&#xff1a; kubekey 只用于安装 kubernetes&#xff0c;因为 kubesphere 的配置在安装时经常需要变动&#xff0c;用 ks-installer 的 yaml 文件更好管理&#xff1b;ks-installe…...

大数据面试题之Hive(2)

目录 Hive的join操作原理&#xff0c;leftjoin、right join、inner join、outer join的异同? Hive如何优化join操作 Hive的mapjoin Hive语句的运行机制&#xff0c;例如包含where、having、group by、orderby&#xff0c;整个的执行过程? Hive使用的时候会将数据同步到HD…...

求推荐几款http可视化调试工具?

Postman 非常流行的API调试工具&#xff0c;适用于构建、测试和文档化APIs。它支持各种HTTP方法&#xff0c;有强大的集合和环境管理功能&#xff0c;以及代码生成能力。 BB-API 是一款旨在提升开发效率的工具&#xff0c;它专注于提供简约、完全免费且功能强大的HTTP模拟请…...

Python逻辑控制语句 之 判断语句--if else结构

1.if else 的介绍 if else &#xff1a;如果 ... 否则 .... 2.if else 的语法 if 判断条件: 判断条件成立&#xff0c;执行的代码 else: 判断条件不成立&#xff0c;执行的代码 &#xff08;1&#xff09;else 是关键字, 后⾯需要 冒号 &#xff08;2&#xff09;存在冒号…...

word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法

问题描述&#xff1a;word2016中新建页面显示出来的页面没有页眉页脚&#xff0c;只显示正文部分。设置了页边距也不管用。 如图1 图1 解决&#xff1a; 点击“视图”——“多页”——“单页”&#xff0c;即可。如图2操作 图2 结果展示&#xff1a;如图3 图3...

8.javaSE基础进阶_泛型generics(无解通配符?+上下界统配符superextends)

文章目录 泛型generics一.泛型简介二.泛型类1.泛型方法 三.泛型接口四.泛型进阶1.*<?>无解通配符*2.上界通配符 < ? extends E>3.下界通配符 < ? super E>4.泛型擦除 泛型generics 一.泛型简介 JDK5引入,一种安全机制,编译时检测不匹配类型 特点: 将数…...

酒店客房管理系统(Java+MySQL)

技术栈 Java: 作为主要编程语言。Swing GUI: 用于开发图形用户界面。MySQL: 作为数据库管理系统。JDBC: 用于连接和操作MySQL数据库。 功能要点 管理登录认证 系统提供管理员登录认证功能。通过用户名和密码验证身份&#xff0c;确保只有授权的用户可以访问和管理酒店客房信…...

S32K3 --- Wdg(内狗) Mcal配置

前言 看门狗的作用是用来检测程序是否跑飞,进入死循环。我们需要不停地喂狗,来确保程序是正常运行的,一旦停止喂狗,意味着程序跑飞,超时后就会reset复位程序。 一、Wdg 1.1 WdgGeneral Wdg Disable Allowed : 启用此参数后,允许在运行的时候禁用看门狗 Wdg Enable User…...

LeetCode 算法:二叉树的层序遍历 c++

原题链接&#x1f517;&#xff1a;二叉树的层序遍历 难度&#xff1a;中等⭐️⭐️ 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;roo…...

博途TIA Portal「集成自动化软件」下载安装,TIA Portal 灵活多变的编程环境

在编程领域&#xff0c;博途TIA Portal以其卓越的编程工具和灵活多变的编程环境&#xff0c;为众多用户提供了前所未有的便利。这款软件不仅支持多种编程语言&#xff0c;如梯形图&#xff08;Ladder Diagram&#xff09;、功能块图&#xff08;Function Block Diagram&#xf…...

火了10年的电脑监控软件有哪些?盘点8款热门的电脑监控软件

电脑监控软件领域经历了多年的发展&#xff0c;一些软件因为其稳定的功能、良好的用户体验和不断更新的技术支持&#xff0c;得以在市场上保持长期的热度和用户基础。以下是几款在过去十年里广受好评且持续流行的内网监控软件&#xff1a; 1.安企神&#xff1a;由河北安企神网络…...

入门Java爬虫:认识其基本概念和应用方法

Java爬虫初探&#xff1a;了解它的基本概念与用途&#xff0c;需要具体代码示例 随着互联网的快速发展&#xff0c;获取并处理大量的数据成为企业和个人不可或缺的一项任务。而爬虫&#xff08;Web Scraping&#xff09;作为一种自动化的数据获取方法&#xff0c;不仅能够快速…...

Flask新手入门(一)

前言 Flask是一个用Python编写的轻量级Web应用框架。它最初由Armin Ronacher作为Werkzeug的一个子项目在2010年开发出来。Werkzeug是一个综合工具包&#xff0c;提供了各种用于Web应用开发的工具和函数。自发布以来&#xff0c;Flask因其简洁和灵活性而迅速受到开发者的欢迎。…...

Grafana-11.0.0 在线部署教程

Grafana-11.0.0 在线部署教程 环境&#xff1a; 操作系统&#xff1a; ubuntugrafana版本&#xff1a; 11.0.0 &#xff08;建议不要按照最新版&#xff09;grafana要求的系统配置不高&#xff0c;建议直接部署在监控服务器上&#xff0c;比如zabbix服务器、prometheus服务器…...

pytorch-01

加载mnist数据集 one-hot编码实现 import numpy as np import torch x_train np.load("../dataset/mnist/x_train.npy") # 从网站提前下载数据集&#xff0c;并解压缩 y_train_label np.load("../dataset/mnist/y_train_label.npy") x torch.tensor(y…...

梦想CAD二次开发

1.mxdraw简介 mxdraw是一个HTML5 Canvas JavaScript框架&#xff0c;它在THREE.js的基础上扩展开发&#xff0c;为用户提供了一套在前端绘图更为方便&#xff0c;快捷&#xff0c;高效率的解决方案&#xff0c;mxdraw的实质为一个前端二维绘图平台。你可以使用mxdraw在画布上绘…...

Eureka的介绍与使用

Eureka 是 Netflix 开源的一款服务注册与发现组件&#xff0c;在微服务架构中扮演着重要的角色。 一、Eureka 的介绍 工作原理 服务注册&#xff1a;各个微服务在启动时&#xff0c;会向 Eureka Server 发送注册请求&#xff0c;将自身的服务名、实例名、IP 地址、端口等信息注…...

ChatGPT之母:AI自动化将取代人类,创意性工作或将消失

目录 01 AI取代创意性工作的担忧 1.1 CTO说了啥 02 AI已开始大范围取代人类 01 AI取代创意性工作的担忧 几天前的采访中&#xff0c;OpenAI的CTO直言&#xff0c;AI可能会扼杀一些本来不应该存在的创意性工作。 近来一篇报道更是印证了这一观点。国外科技媒体的老板Miller用…...

【深度学习驱动流体力学】湍流仿真到深度学习湍流预测

目录 一、湍流项目结构二、三个OpenFOAM湍流算例1. motorBike背景和目的文件结构和关键文件使用和应用湍流仿真深度学习湍流预测深度学习湍流预测的挑战和应用结合湍流仿真与深度学习2. pitzDaily背景和目的文件结构和关键文件使用和应用3. pitzDailyMapped背景和目的文件结构和…...

如何从0构建一款类似pytest的工具

Pytest主要模块 Pytest 是一个强大且灵活的测试框架&#xff0c;它通过一系列步骤来发现和运行测试。其核心工作原理包括以下几个方面&#xff1a;测试发现&#xff1a;Pytest 会遍历指定目录下的所有文件&#xff0c;找到以 test_ 开头或 _test.py 结尾的文件&#xff0c;并且…...

6.27-6.29 旧c语言

#include<stdio.h> struct stu {int num;float score;struct stu *next; }; void main() {struct stu a,b,c,*head;//静态链表a.num 1;a.score 10;b.num 2;b.score 20;c.num 3;c.score 30;head &a;a.next &b;b.next &c;do{printf("%d,%5.1f\n&…...

Unidbg调用-补环境V3-Hook

结合IDA和unidbg,可以在so的执行过程进行Hook,这样可以让我们了解并分析具体的执行步骤。 应用场景:基于unidbg调试执行步骤 或 还原算法(以Hookzz为例)。 1.大姨妈 1.1 0x1DA0 public void hook1() {...

从AICore到TensorCore:华为910B与NVIDIA A100全面分析

华为NPU 910B与NVIDIA GPU A100性能对比&#xff0c;从AICore到TensorCore&#xff0c;展现各自计算核心优势。 AI 2.0浪潮汹涌而来&#xff0c;若仍将其与区块链等量齐观&#xff0c;视作炒作泡沫&#xff0c;则将错失新时代的巨大机遇。现在&#xff0c;就是把握AI时代的关键…...

Edge 浏览器退出后,后台占用问题

Edge 浏览器退出后&#xff0c;后台占用问题 环境 windows 11 Microsoft Edge版本 126.0.2592.68 (正式版本) (64 位)详情 在关闭Edge软件后&#xff0c;查看后台&#xff0c;还占用很多系统资源。实在不明白&#xff0c;关了浏览器还不能全关了&#xff0c;微软也学流氓了。…...

实验八 T_SQL编程

题目 以电子商务系统数据库ecommerce为例 1、在ecommerce数据库&#xff0c;针对会员表member首先创建一个“呼和浩特地区”会员的视图view_hohhot&#xff0c;然后通过该视图查询来自“呼和浩特”地区的会员信息&#xff0c;用批处理命令语句将问题进行分割&#xff0c;并分…...

【爆肝34万字】从零开始学Python第2天: 判断语句【入门到放弃】

目录 前言判断语句True、False简单使用作用 比较运算符引入比较运算符的分类比较运算符的结果示例代码总结 逻辑运算符引入逻辑运算符的简单使用逻辑运算符与比较运算符一起使用特殊情况下的逻辑运算符 if 判断语句引入基本使用案例演示案例补充随堂练习 else 判断子句引入else…...

React 19 新特性集合

前言&#xff1a;https://juejin.cn/post/7337207433868197915 新 React 版本信息 伴随 React v19 Beta 的发布&#xff0c;React v18.3 也一并发布。 React v18.3相比最后一个 React v18 的版本 v18.2 &#xff0c;v18.3 添加了一些警告提示&#xff0c;便于尽早发现问题&a…...

耐高温水位传感器有哪些

耐高温水位传感器在现代液位检测技术中扮演着重要角色&#xff0c;特别适用于需要高温环境下稳定工作的应用场合。这类传感器的设计和材质选择对其性能和可靠性至关重要。 一种典型的耐高温水位传感器是FS-IR2016D&#xff0c;它采用了PPSU作为主要材质。PPSU具有优良的耐高温…...

Symfony国际化与本地化:打造多语言应用的秘诀

标题&#xff1a;Symfony国际化与本地化&#xff1a;打造多语言应用的秘诀 摘要 Symfony是一个高度灵活的PHP框架&#xff0c;用于创建Web应用程序。它提供了强大的国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;功能&#xff0c;允许开发者轻松创…...

ApolloClient GraphQL 与 ReactNative

要在 React Native 应用程序中设置使用 GraphQL 的简单示例&#xff0c;您需要遵循以下步骤&#xff1a; 设置一个 React Native 项目。安装 GraphQL 必要的依赖项。创建一个基本的 GraphQL 服务器&#xff08;或使用公共 GraphQL 端点&#xff09;。从 React Native 应用中的…...

【贡献法】2262. 字符串的总引力

本文涉及知识点 贡献法 LeetCode2262. 字符串的总引力 字符串的 引力 定义为&#xff1a;字符串中 不同 字符的数量。 例如&#xff0c;“abbca” 的引力为 3 &#xff0c;因为其中有 3 个不同字符 ‘a’、‘b’ 和 ‘c’ 。 给你一个字符串 s &#xff0c;返回 其所有子字符…...

C#基于SkiaSharp实现印章管理(3)

本系列第一篇文章中创建的基本框架限定了印章形状为矩形&#xff0c;但常用的印章有方形、圆形等多种形状&#xff0c;本文调整程序以支持定义并显示矩形、圆角矩形、圆形、椭圆等4种形式的印章背景形状。   定义印章背景形状枚举类型&#xff0c;矩形、圆形、椭圆相关的尺寸…...

如何理解泛型的编译期检查

既然说类型变量会在编译的时候擦除掉&#xff0c;那为什么我们往 ArrayList 创建的对象中添加整数会报错呢&#xff1f;不是说泛型变量String会在编译的时候变为Object类型吗&#xff1f;为什么不能存别的类型呢&#xff1f;既然类型擦除了&#xff0c;如何保证我们只能使用泛型…...

计算机组成原理:海明校验

在上图中&#xff0c;对绿色的7比特数据进行海明校验&#xff0c;需要添加紫色的4比特校验位&#xff0c;总共是蓝色的11比特。紫色的校验位pi分布于蓝色的hi的1, 2, 4, 8, 16, 32, 64位&#xff0c;是2i-1位。绿色的数据位bi分布于剩下的位。 在下图中&#xff0c;b1位于h3&a…...

信息学奥赛初赛天天练-39-CSP-J2021基础题-哈夫曼树、哈夫曼编码、贪心算法、满二叉树、完全二叉树、前中后缀表达式转换

PDF文档公众号回复关键字:20240629 2022 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 5.对于入栈顺序为a,b,c,d,e的序列&#xff0c;下列( )不合法的出栈序列 A. a&#xff0c;b&a…...

第11章 规划过程组(收集需求)

第11章 规划过程组&#xff08;一&#xff09;11.3收集需求&#xff0c;在第三版教材第377~378页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;主要输出 1、需求跟踪矩阵 内容 业务需要、机会、目的和目标 项目目标 项目范围和 WBS 可…...

探索WebKit的守护神:深入Web安全策略

探索WebKit的守护神&#xff1a;深入Web安全策略 在数字化时代&#xff0c;网络已成为我们生活的一部分&#xff0c;而网页浏览器作为我们探索网络世界的窗口&#xff0c;其安全性至关重要。WebKit作为众多流行浏览器的内核&#xff0c;例如Safari&#xff0c;其安全性策略是保…...

unity ScrollRect裁剪ParticleSystem粒子

搜了下大概有这几种方法 通过模板缓存通过shader裁剪区域&#xff1a;案例一&#xff0c;案例二&#xff0c;案例三&#xff0c;三个案例都是类似的方法&#xff0c;需要在c#传入数据到shader通过插件 某乎上的模板缓存方法link&#xff0c;&#xff08;没有登录看不到全文&a…...

Hbase面试题总结

一、介绍下HBase架构 --HMaster HBase集群的主节点&#xff0c;负责管理和协调整个集群的操作。它处理元数据和表的分区信息&#xff0c;控制RegionServer的负载均衡和故障恢复。--RegionServer HBase集群中的工作节点&#xff0c;负责存储和处理数据。每个RegionServer管理若…...

随着量子计算的崭露头角,C 语言在未来是否需要做出适应性的改变,以适应新的计算架构和算法?

随着量子计算的发展&#xff0c;C语言可能需要进行一些适应性的改变以适应新的计算架构和算法。量子计算与经典计算存在很大的差异&#xff0c;涉及到量子比特、量子门和量子算法等概念。因此&#xff0c;为了更好地支持量子计算&#xff0c;C语言可能需要引入新的数据类型和算…...

Codeforces Round955 (Div2)--(A~D)题解

Problem - A - Codeforces 思路&#xff1a;如果领先方互换&#xff0c;那么“NO”&#xff0c;否则“YES”。 void solve(){ Aint x1,y1; cin>>x1>>y1;int x2,y2; cin>>x2>>y2;if(x1>y1&&x2>y2||x1<y1&&…...

怎样将word默认Microsoft Office,而不是WPS

设置——>应用——>默认应用——>选择"word"——>将doc和docx都选择Microsoft Word即可...

互联网信任危机:Perplexity搜索引擎如何破坏内容创作者的权益

前段时间&#xff0c;Perplexity搜索引擎还是一颗冉冉升起的明日之星&#xff0c;手握巨额投资&#xff0c;有很美好的未来前景&#xff0c;这时&#xff0c;如果不出意外的话&#xff0c;要出意外。 喜好儿网 Perplexity这家公司&#xff0c;它正试图通过创建一个新型的“答…...

算法训练营第七十三天 | Bellman_ford算法、SPFA算法、Bellman_ford之判断负权回路

算法训练营第七十三天 | Bellman_ford算法、SPFA算法、Bellman_ford之判断负权回路 Bellman_ford算法 题目链接&#xff1a; https://kamacoder.com/problempage.php?pid1152 对所有边松弛一次&#xff0c;相当于计算 起点到达 与起点一条边相连的节点 的最短距离&#xff…...

记录使用 Vue3 过程中的一些技术点

1、自定义组件&#xff0c;并使用 v-model 进行数据双向绑定。 简述&#xff1a; 自定义组件使用 v-model 进行传参时&#xff0c;遵循 Vue 3 的 v-model 机制。在 Vue 3 中&#xff0c;v-model 默认使用了 modelValue 作为 prop 名称&#xff0c;以及 update:modelValue 作为…...

如何恢复被盗的加密货币?

本世纪&#xff0c;网络犯罪的首要目标是加密货币。 这要归功于加密货币的日益普及和价值&#xff0c;网络犯罪分子已经认识到经济收益的潜力&#xff0c;并将重点转向利用这种数字资产中的漏洞。 在今天的文章中&#xff0c;我们将讨论加密货币恢复和被盗加密货币恢复。 我们…...

使用 Python 发送 TRON-USDT 和 TRX 交易

文章目录 一、前提准备1.1 环境设置1.2 获取钱包地址和私钥二、发送USDT(TRC-20)交易2.1 流程2.2 USDT交易脚本三、发送TRX交易3.1 流程3.2 TRX交易脚本四、注意事项4.1 注意事项4.2 改进后的USDT和TRX交易脚本本文档介绍如何使用Python和tronpy库发送TRON网络上的USDT(TRC-…...

【算法】递归、搜索与回溯——汉诺塔

题解&#xff1a;汉诺塔(递归、搜索与回溯算法) 目录 1.题目2.题目背景(拓展了解)3.题解4.参考代码5.细节6.总结 1.题目 题目链接&#xff1a;LINK 2.题目背景(拓展了解) 汉诺塔问题是一个通过隐式使用递归栈来进行实现的一个经典问题&#xff0c;该问题最早的发明人是法国…...

机器人非线性控制方法——线性化与解耦

机器人非线性控制方法是针对具有非线性特性的机器人系统所设计的一系列控制策略。其中&#xff0c;精确线性化控制和反演控制是两种重要的方法。 1. 非线性反馈控制 该控制律采用非线性反馈控制的方法&#xff0c;将控制输入 u 分解为两个部分&#xff1a; α(x): 这是一个与…...

设计模式 19 模板模式 Template Pattern

设计模式 19 模板模式 Template Pattern 1.定义 模板模式&#xff08;Template Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤的具体实现延迟到子类中。在模板模式中&#xff0c;定义了一个抽象类&#xff0c;其中包含了一个…...