python代码实现21点小游戏

python代码实现21点小游戏(入门级别哈)

第一次写这个博客,也是想分享一下自己的代码,有点菜,感觉面向对象学得不是很好,语句都改了很多遍,大佬们多指点哈

21点是什么?

21点, (有些又叫24点)就是从扑克牌中随机抽取4张牌,每张牌只能用一次,用加减乘除将这四张牌凑成21(24点就是凑成24)

创作历程

  1. 第一次就是想将所有组合的模板写出来,感觉自己太智障了,写了好几个小时也没列举完,自己已然忘记列举规律。

  2. 放弃第一种思路,想出第二种方法:从四个数里面先选两个数做运算得到结果 “r1”,再从剩下两个数里面选一个与 r1 做运算得到 r2 ,r2再与最后的数做运算。在这个过程里,运算都是加减乘除都算一边,然后选择一个结果进行下一个运算。这其实与我玩21点的思路十分相似。

具体解释下思路:

  1. 先发牌,随机生成四种花色与四个1~13的数字
  2. 随机抽取牌(这一步是为了改变牌的顺序)
  3. 算得结果r1,有8种运算的原因是第一个数字的符号是正是负是有关系的,如果默认是正的话算不到所有情况(比如我有两个数m1=2和m2=8,正确答案要求的过程是8-2,但是这样就算不出来6,有些同学可能会问:“下一次选择到m1=8,m2=2不就行了?”,但是我们这里是随机生成的顺序,概率很小,而且如果要求的答案是-6呢?我这里是希望用这一组顺序算出所有结果,所以会有8种运算。)
  4. r1,r2,r3都算出来了,如果r3等于21的话就是我们需要的答案了,这时就需要记录每个数字之间的符号了。我定义了一个符号列表(’+’,’-’,’*’,’/’),引用通过i,j,k与所需符号在列表中的序数之间的关系:仔细看哦,每一层运算有八个结果,前四个是正的加减乘除,后面是负的加减乘除,我先通过四舍五入确定是前四个还是后四个,这里就会输出结果0和1,刚好就是‘+’和‘-’的序数;后面是通过对4取余数确定是加减乘除之间的哪个符号。
  5. 生成1000组数的顺序,每组顺序组合成的所有答案都算一遍,算到21就停止。(顺序应该只有4 * 3 * 2 * 1种,但是反正计算机算的快,多算几千次无所谓哈!)

给代码了(大佬们多指点)

class Twentyone(object):

    def __init__(self, num=0, color='', b='', c=''):
        self.num = num
        self.color = color
        self.b = b
        self.c = c

    def sent(self):
        import random as rand
        self.b = []
        self.c = []
        for i in range(4):
            self.num = int(rand.randint(1, 13))
            self.color = rand.choice(('♠', '♥', '♣', '♦'))
            self.b.append('%s%d' % (self.color, self.num))
            self.c.append('%d' % self.num)
        return self.b

    def find(self):
        import random as rand
        f = ('+', '-', '*', '/')
        c = self.c
        rand.shuffle(c)
        m1 = float(c[0])
        m2 = float(c[1])
        m3 = float(c[2])
        m4 = float(c[3])
        for i in range(1, 8):
            r1a = m1 + m2
            r1b = m1 - m2
            r1c = m1 * m2
            r1d = m1 / m2
            r1e = -m1 + m2
            r1f = -m1 - m2
            r1g = -m1*m2
            r1h = -m1/m2
            R1 = (r1a, r1b, r1c, r1d, r1e, r1f, r1g, r1h)
            r1 = float(R1[i-1])
            for j in range(1, 5):
                r2a = r1 + m3
                r2b = r1 - m3
                r2c = r1*m3
                r2d = r1/m3
                r2e = - r1 + m3
                r2f = - r1 - m3
                r2g = - r1 * m3
                r2h = - r1 / m3
                R2 = (r2a, r2b, r2c, r2d, r2e, r2f, r2g, r2h)
                r2 = float(R2[j-1])
                for k in range(1, 8):
                    r3a = r2 + m4
                    r3b = r2 - m4
                    r3c = r2 * m4
                    r3d = r2 / m4
                    r3e = -r2 + m4
                    r3f = -r2 - m4
                    r3g = -r2 * m4
                    r3h = -r2 / m4
                    R3 = (r3a, r3b, r3c, r3d, r3e, r3f, r3g, r3h)
                    r3 = float(R3[k - 1])
                    if r3 == 21:
                        print('found it!')
                        print('%s[%s(%s %d %s %d) %s %d] %s %d' % (f[round(k/9)], f[round(j/9)], f[round(i/9)], m1, \
                                                                   f[i % 4-1], m2, f[j % 4-1], m3, f[k % 4 -1], m4))
                        return r3


def main():
    m = Twentyone()
    print(m.sent())
    p = input('press h for help, p for pass')
    i = 0
    while p == 'h' and i < 1000:
        r3 = m.find()
        if r3 == 21:
            break
        i += 1
        if i == 1000:
            print('not found')


main()

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python21小游戏模块是一种简单的实现基于命令行的21扑克游戏的模块。以下是它的代码详细解答: 首先,我们需要导入random模块,以便用于随机生成扑克牌的功能。 接下来,定义一个函数deal_card(),该函数用于生成一张随机的扑克牌。我们可以使用random模块的choice()函数从一个扑克牌列表中随机选择一张牌,并返回它。 然后,我们定义一个类Player,该类代表游戏的玩家。在__init__()方法中,我们初始化玩家的手牌列表和得分。 接下来,我们定义一个类Game,该类代表整个游戏的过程。在__init__()方法中,我们初始化玩家和庄家的手牌列表,并初始化玩家和庄家的得分。在开始游戏时,玩家和庄家都会得到两张随机的初始牌。 在游戏的过程中,玩家可以选择要继续要牌还是停止要牌。如果玩家选择继续要牌,我们会随机生成一张新的牌,并将其添加到玩家的手牌列表中。如果玩家选择停止要牌,游戏将进入庄家的回合。庄家会自动根据规则继续要牌或停止要牌。 最后,我们定义一个主函数main(),用于调用Game类,并开始游戏。在主函数中,我们会打印出玩家和庄家的当前手牌,以及玩家和庄家的当前得分。当游戏结束时,我们会根据玩家和庄家的得分判断谁赢,然后打印出游戏的结果。 这就是Python21小游戏模块的代码详细解答。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值