【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 点(英文:Blackjack)是一种在赌场玩的纸牌游戏。这种游戏的参与者不是互相竞争,而是与赌场指定的庄家竞争。在本文中,我们将从头开始创建可在终端上玩的玩家与庄家之间的二十一点游戏。 二十一点规则 我们将为从未玩过二十一点的读者提供…...

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

哈尔滨高校大学智能制造实验室数字孪生可视化系统平台项目的验收
哈尔滨高校大学智能制造实验室数字孪生可视化系统平台项目的验收,标志着这一技术在教育领域的应用取得了新的突破。项目旨在开发一个数字孪生可视化系统平台,用于哈尔滨高校大学智能制造实验室的设备模拟、监测与数据分析。项目的主要目标包括࿱…...
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
一个缓存设计,配合go的singleFlight 最开始的设计如下 添加分布式缓存 上线后分布式缓存上涨的流量并不等于下游下降的流量,而是下游下降的流量 * 2~3 究其原因,就是采用了go的singleFlight,假定请求缓存时长10ms&a…...

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

在晋升受阻或遭受不公待遇申诉时,这样写是不是好一些?
在晋升受阻或遭受不公待遇申诉时,这样写是不是好一些? 在职场中,晋升受阻或遭受不公待遇是员工可能面临的问题之一。面对这样的情况,如何撰写一份有效的申诉材料,以维护自己的合法权益,就显得尤为重要。#李…...
LeetCode 2710.移除字符串中的尾随零:模拟
【LetMeFly】2710.移除字符串中的尾随零:模拟 力扣题目链接:https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/ 给你一个用字符串表示的正整数 num ,请你以字符串形式返回不含尾随零的整数 num 。 示例 1: 输…...
代码随想录训练营第二十三天 39组合总和 40组合总和II 131分割回文串
第一题: 原题链接:39. 组合总和 - 力扣(LeetCode) 思路: 终止条件: 用一个sum值来记录当前组合中元素的总和。当sum的值大于target的时候证明该组合不合适,直接return。当sum的值等于target的…...

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

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

Day6: 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
题目344. 反转字符串 - 力扣(LeetCode) 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 - 力扣࿰…...
kubekey 离线安装高可用 kubernetes 集群
1. 准备环境 版本: kubernetes: v1.29.2 kubesphere: v3.4.1 kubekey: v3.1.1 说明: kubekey 只用于安装 kubernetes,因为 kubesphere 的配置在安装时经常需要变动,用 ks-installer 的 yaml 文件更好管理;ks-installe…...
大数据面试题之Hive(2)
目录 Hive的join操作原理,leftjoin、right join、inner join、outer join的异同? Hive如何优化join操作 Hive的mapjoin Hive语句的运行机制,例如包含where、having、group by、orderby,整个的执行过程? Hive使用的时候会将数据同步到HD…...
求推荐几款http可视化调试工具?
Postman 非常流行的API调试工具,适用于构建、测试和文档化APIs。它支持各种HTTP方法,有强大的集合和环境管理功能,以及代码生成能力。 BB-API 是一款旨在提升开发效率的工具,它专注于提供简约、完全免费且功能强大的HTTP模拟请…...

Python逻辑控制语句 之 判断语句--if else结构
1.if else 的介绍 if else :如果 ... 否则 .... 2.if else 的语法 if 判断条件: 判断条件成立,执行的代码 else: 判断条件不成立,执行的代码 (1)else 是关键字, 后⾯需要 冒号 (2)存在冒号…...

word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法
问题描述:word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。设置了页边距也不管用。 如图1 图1 解决: 点击“视图”——“多页”——“单页”,即可。如图2操作 图2 结果展示:如图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数据库。 功能要点 管理登录认证 系统提供管理员登录认证功能。通过用户名和密码验证身份,确保只有授权的用户可以访问和管理酒店客房信…...

S32K3 --- Wdg(内狗) Mcal配置
前言 看门狗的作用是用来检测程序是否跑飞,进入死循环。我们需要不停地喂狗,来确保程序是正常运行的,一旦停止喂狗,意味着程序跑飞,超时后就会reset复位程序。 一、Wdg 1.1 WdgGeneral Wdg Disable Allowed : 启用此参数后,允许在运行的时候禁用看门狗 Wdg Enable User…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...