第一次写这个博客,也是想分享一下自己的代码,有点菜,感觉面向对象学得不是很好,语句都改了很多遍,大佬们多指点哈
21点, (有些又叫24点)就是从扑克牌中随机抽取4张牌,每张牌只能用一次,用加减乘除将这四张牌凑成21(24点就是凑成24)
第一次就是想将所有组合的模板写出来,感觉自己太智障了,写了好几个小时也没列举完,自己已然忘记列举规律。
放弃第一种思路,想出第二种方法:从四个数里面先选两个数做运算得到结果 “r1”,再从剩下两个数里面选一个与 r1 做运算得到 r2 ,r2再与最后的数做运算。在这个过程里,运算都是加减乘除都算一边,然后选择一个结果进行下一个运算。这其实与我玩21点的思路十分相似。
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()