21点游戏python简单实现
规则简述
-
玩家共两个角色:电脑和人类,电脑是庄家
-
游戏开始时,先给人类和电脑每个玩家分别发两张牌作为底牌,庄家底牌只漏一张
-
判断双方底牌是否直接为21点,如果其中一方为21点则直接判胜利,并在总分上加一分。如果双方都是21点,那就是平局,不得分。
-
当初始牌面上,没有直接出现21点,人类玩家根据自己的牌面大小决定是否继续要牌。如果要牌,那就在牌堆中抽一张,然后再次判断胜负。如果人类牌面的总点数超过了21点,那就直接判输
-
如果人类玩家停止要牌了,并且没有因为超过21点而被判输的情况下,则电脑要牌。电脑要牌这里,可以自己设计一个规则:
5.1 比如电脑一直要牌,直到比人类玩家大才停止要牌。
5.2 根据牌堆中剩余牌的数量,计算赢的概率,然后设置一个阈值,超过阈值就要,低于就不要。
5.3 … -
循环4和5的步骤
-
完成一轮游戏的时候,可由人类玩家决定,是否继续玩下一轮
-
牌堆中剩余的牌数不够玩一轮游戏的时候,游戏自动结束。
-
计算规则: 2. 3. 4. 5. 6. 7. 8. 9. 10分别是正常的点数,J. Q. K都是10点
-
A比较特殊,首先把A当做1来计算,牌面总分数如果小于21,那么再把A当做11再计算一次,如果这个时候仍然小于21,那么A就当11算,如果这个时候牌面总分数大于了21,那么A就当1算。
游戏流程图设计
功能设计
class poke
class dealer
- field:
- cards: 每一个荷官对应多副牌
- function:
- give_one_card(): 发牌
class Player
- field:
- name: 昵称
- score: 总比分
- points:计数器
- cards_in_hand->list: 手牌
- function:
- who_win(player): 判断未提前结束下与其他玩家的胜负
- now_count(): 计算当前牌数字
- get(*cards): 将荷官发的牌加入手牌
代码实现
# usr/bin/env python3;
#-*-coding: utf-8-*
import random
from sys import exit
class Poke:
'''
Poke类用来初始化一个牌堆
'''
def __init__(self):
self.cards = [[face, suite] for face in "♠♥♦♣" for suite in [1,2,3,4,5,6,7,8,9,10,'J','Q','K']]
random.shuffle(self.cards)
class Dealer:
'''
Dealer类初始化一个荷官
主要用来实现取牌和发牌的作用
'''
def __init__(self):
self.cards = Poke().cards
def give_one_card(self):
'''
给玩家发牌
return: list
'''
if not self.cards:
# 重新取一副牌并洗牌
self.cards.extend(Poke().cards)