Python写的计算24点小游戏

最近在学习PHP & Python,@hongqn 在他的《Python 于Web 2.0网站的应用》中提到了Python的哲学,我想这个应该就是我一直在寻找的吧。于是花了一下午在优酷上看完了《Python.Django视频教程-台湾辅仁大》的视频教程专辑,开始了写个Python小游戏的计划。

系统是Mac OS X Snow Leopard,结果装了个Xcode 3.1,啥东东都编译不了,很多python setup.py install都安装不通过。后来才知道雪豹必须装Xcode3.2+才行。

以下是我边写边学的python计算24点小游戏。求解24点算法那块我实在是没啥头绪,就这么悲剧的放着吧,毕竟这块不是我写这个小游戏的初衷。网上查了一些算法,不是错的就是用啥穷举的方法。通过写这个小游戏,我学会了以下一些内容:

1、dictionary的操作,’i’ in dict返回True or False

2、list的操作,list.append()、”.join(list)、list.sort()

3、整型随机数生成,random.randint()

4、正则表达式,re.match()、

5、字符操作,替换 string.replace()、大小转换string.upper()

6、eval()语句的用法及其安全性问题

7、类型转换,int(str)、str(int)

8、程序执行时传入自定义参数的方法,for argv in sys.argv

9、判断当前运行程序是否为其本身 __name__==’__main__’

10、指定程序字符编码encoding: utf-8 放在第一行注释中

除以上几点外,程序中用到的其他语句有:import、循环、字符串拼接、print多行。

代码展示:

# Code by yekai.net, encoding: utf-8
import random
import re
import sys

nums = []
poker = False

def conver2Cards(nums):
    cards = []
    cardDict = {'1':'A','11':'J','12':'Q','13':'K'}
    for i in nums:
        if poker and str(i) in cardDict:
            cards.append(cardDict[str(i)])
        else:
            cards.append(str(i))
    return cards

def getCards():
    newnums = []
    global nums
    for i in range(4):
        newnums.append(random.randint(1,13))
    nums = newnums;
    return conver2Cards(newnums)

def getAnswer(nums):    
    for i in nums:
        return ''.join(str(nums)) + '\n抱歉,24点算法我写不出来,请指教:http://yekai.net/?p=217'
            
def calc(exp):
    match = re.match('^\(?[0-9]{1,2}[-+*/]{1}\(?[0-9]{1,2}\)?[-+*/]{1}\(?[0-9]{1,2}\)?[-+*/]{1}[0-9]{1,2}\)?$',exp)
    if match:
        inputnums = re.split('[-+*/()]+',exp.replace('(','').replace(')',''))
        inputnums = [int(i) for i in inputnums]
        inputnums.sort()
        if nums != inputnums: return -1
        if eval(exp) == 24:
            return 1
        else:
            return 0
    else:
        return -2
    
def newGame():
    running = True
    print '-------------------\nCards:  ' +'  '.join(getCards()) + '\n'
    nums.sort()
    while True:
        x = raw_input('Input Your Answer:').upper()
        if x == 'Q':
            running = False
            print 'Game Over, bye~\n'
            break
        elif x == 'K':
            print('Answer:' + getAnswer(nums))
            break
        elif x == '':
            continue
        else:
            x = x.replace('A','1').replace('J','11').replace('Q','12').replace('K','13')
            y = calc(x)
            if(y == -2):
                print 'Please Input Correct Format,el: (2+6)*(5-2)'
            elif(y == -1):
                print 'Please use the given cards!'
            elif(y == 0):
                print 'ERROR:'+ x +'='+ str(eval(x)) + '\nPlease Try Again:)'
            else:
                print 'CORRECT!'
                break
            
    if running:
        newGame()
    else:
        sys.exit()

if __name__=='__main__':
    for argv in sys.argv:
        if(argv == 'poker=on'):poker = True
    print """
======Welcome to calc24 game======
Notes:
[Q] Exit Game
[K] Get Answer
Poker Mode: poker=on
"""
    newGame()

 

下载源文件:calc24.py

 

posted @ 2010-06-27 19:16  猫哥_kaiye  阅读(2036)  评论(0编辑  收藏  举报