| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1551 人关注过本帖
标题:求一个poker游戏
只看楼主 加入收藏
pagelu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-8-6
收藏
 问题点数:0 回复次数:1 
求一个poker游戏
急求,感激不尽

就是python平台上的扑克游戏
搜索更多相关主题的帖子: 游戏 poker 
2010-08-06 15:14
bobo2cj
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-10-21
收藏
得分:0 
回复 楼主 pagelu
你这个帖子很久了!
rule.py:
# coding:utf8
gameRule = '''
            红狗(Red Dog)游戏规则

    庄家发出两张牌之后,玩家猜第三张牌的点数是否在前两张之间.游戏中,
2至10的牌的点数不变,J作11点,Q作12点,K作13点,A作14点. 用52张牌的标
准扑克,每局完后都洗牌. 发出的两张牌有以下三种可能性.
1. 一对:
    庄家发的两张牌点数相同. 在这种情况下,停止加注,庄家自动发第三张牌.
    如果第三张牌的点数仍旧与前两张相同, 所有玩家赢得11比1赔率的酬金.
    如果第三张牌的点数与前两张不同, 则为平局, 赌金归还玩家, 有些赌场
    如果第三张牌的点数与前两张不同,就算庄家赢,玩家输.
2. 点数相连:
    庄家发的两张牌点数是相连的,例如6和7,或J和Q.在这种情况下,庄家不发
    第三张牌. 双方为平局, 赌金归还玩家.
3. 点数不相连:
    游戏中大部分是这类情况,庄家发的两张牌点数不相同也不相连.庄家公布
    两张牌点数跨度, 并放一个标牌在桌上显示点数跨度.例如,两张牌是3和J,
    点数跨度则是7(注意:不是8!),因为3与J之间跨过7个点数(4, 5, 6, 7,
     8, 9, 10).
    不同跨度的赔率不同:
    跨度为1的赔率是5:1,跨度为2的赔率是4:1,
    跨度为3的赔率是2:1,其余跨度的赔率是1:1.
注意:
    当当庄家公布点数跨度并用标牌显示后, 玩家可以在庄家发第三张牌之前
选择加注(RAISE), 或者玩家保持原先的赌金金额(STAND). 接着庄家发
第三张牌. 如果第三张牌点数在前两张之间, 玩家赢牌. 如果第三张牌点数在
前两张之外或与前两张的某一张相同,庄家赢牌.故点数不相连时,不可能有平局.
--------------------------------------------------------------------------------'''


config.py:
# coding:utf8
base = 5        # 最少投注多少金币
money = 500        # 初始金币数量


reddog.py:
# coding:utf8
# running python2.7.8
import rule, config
import random, time, os

class Card(object):
    """docstring for Univalse"""
    def __init__(self):
        # 牌面对应点数(A代表14)
        self.points = {'2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'J':11, 'Q':12, 'K':13, 'A':14}
        # 一副52张牌(去大小王)
        self.cards = {1:'黑桃A', 2:'黑桃2', 3:'黑桃3', 4:'黑桃4', 5:'黑桃5', 6:'黑桃6', 7:'黑桃7', 8:'黑桃8', 9:'黑桃9',10:'黑桃10',11:'黑桃J',12:'黑桃Q',13:'黑桃K'
                    ,14:'红桃A',15:'红桃2',16:'红桃3',17:'红桃4',18:'红桃5',19:'红桃6',20:'红桃7',21:'红桃8',22:'红桃9',23:'红桃10',24:'红桃J',25:'红桃Q',26:'红桃K'
                    ,27:'梅花A',28:'梅花2',29:'梅花3',30:'梅花4',31:'梅花5',32:'梅花6',33:'梅花7',34:'梅花8',35:'梅花9',36:'梅花10',37:'梅花J',38:'梅花Q',39:'梅花K'
                    ,40:'方块A',41:'方块2',42:'方块3',43:'方块4',44:'方块5',45:'方块6',46:'方块7',47:'方块8',48:'方块9',49:'方块10',50:'方块J',51:'方块Q',52:'方块K'}
        self.keys = list(self.cards.keys())       # 列表化Cards字典key,便于处理
        self.newkeys = []                        # 洗过牌后的cards.key的新顺序

    # 按牌面返回点数
    def retPoint(self, card):
        return self.points[card[6:]]    # 牌对应的点数,切片时注意汉字的len

    # 洗牌
    def shuffle(self):
        random.shuffle(self.keys)        # 打乱key的顺序,尽量随机化

    # 切牌
    def cutCard(self):
        startKey = random.randint(0,51)                # 从52张牌数中随机一个数(为什么不是1-52,是因为要从list中取对应数)
        self.newkeys = self.keys[startKey:]+self.keys[0:startKey]    # 从第startKey开始腰牌

    # 发牌
    def perflop(self):
        card1 = self.cards[self.newkeys[0]]    # 第一张牌
        card2 = self.cards[self.newkeys[1]]    # 第二张牌
        card3 = self.cards[self.newkeys[2]]    # 第三张牌
        point1 = self.retPoint(card1)        # 第一张牌点数
        point2 = self.retPoint(card2)        # 第二张牌点数
        point3 = self.retPoint(card3)        # 第三张牌点数
        # 先亮出点数小的牌,后亮出点数大的牌
        if point1 > point2:
            return [card2,card1,point2,point1,point1-point2-1,card3,point3]
        else:
            return [card1,card2,point1,point2,point2-point1-1,card3,point3]

class Banker(object):
    """docstring for Banker"""
    def __init__(self):
        self.card = Card()
        self.getCards=[]
        self.money = Money()

    # 开局准备
    def ready(self):
        print '庄家:> 准备开局,请各位玩家准备进入!'
        print '庄家:> 下注规则:各位玩家投注金额需是$5的倍数(如,$5/$50/$100等),多少我都能赔起!'

    # 开局
    def start(self):
        self.card.shuffle()
        self.card.cutCard()
        self.getCards = self.card.perflop()
        print '庄家:> 前两张开牌:    %s    %s' % (self.getCards[0], self.getCards[1])
        span = self.getCards[4]    # 跨度
        if span == 0:    # 点数相连
            print '庄家:> 两张牌点数相连,平局!'
            return False    # 直接准备下一局
        else:
            if span > 0:    # 点数不相连
                print '庄家:> 跨度:              %d' % span
                return True    # 交给第三张牌的处理
            else:    # 一对
                print '庄家:> 两张一对,停止加注!'
                return False    # 直接交给第三张牌的处理
   
    # 第三张牌
    def thirdCard(self):
        card3 = self.getCards[5]
        point3 = self.getCards[6]
        span = self.getCards[4]    # 跨度
        if span == 0:    # 点数相连
            print '系统:> 玩家余额 $%d' % self.money.jin(self.money.zongjiazhu())
            pass
        else:
            print '庄家:> 第三张开牌:        %s' % card3
            zongzhue = self.money.zongjiazhu()        # 总下注金额
            if span > 0:    # 点数不相连
                if point3 <= self.getCards[2] or point3 >= self.getCards[3]:
                    print '系统:> 抱歉!这局庄家赢!'
                    print '系统:> 玩家余额 $%d' % self.money.chu()
                elif point3 > self.getCards[2] or point3 < self.getCards[3]:
                    print '系统:> 恭喜玩家!',
                    if span == 1:
                        print '赢得5:1的赔率金额: $%d !' % (zongzhue * 6)
                        print '系统:> 玩家余额 $%d' % self.money.jin(zongzhue * 6)        # 跨度1,5倍赔率+1倍总下注金额
                    elif span == 2:
                        print '赢得4:1的赔率金额: $%d !' % (zongzhue * 5)
                        print '系统:> 玩家余额 $%d' % self.money.jin(zongzhue * 5)        # 跨度2,4倍赔率+1倍总下注金额
                    elif span == 3:
                        print '赢得2:1的赔率金额: $%d !' % (zongzhue * 3)
                        print '系统:> 玩家余额 $%d' % self.money.jin(zongzhue * 3)        # 跨度3,2倍赔率+1倍总下注金额
                    else:
                        print '赢得1:1的赔率金额: $%d !' % (zongzhue * 2)    # 加上括号,防止被认为是把前面的文字打印2遍
                        print '系统:> 玩家余额 $%d' % self.money.jin(zongzhue * 2)        # 其余跨度,5倍赔率+1倍总下注金额
                else:
                    pass
            else:            # 一对 span < 0
                if point3 == self.getCards[2]:
                    print '系统:> 恭喜玩家!赢得11:1的赔率金额: $%d !' % (zongzhue * 12)
                    print '系统:> 玩家余额 $%d' % self.money.jin(zongzhue * 12)        # 11倍赔率,加上之前的总下注,即为总下注的12倍
                else:
                    print '系统:> 第三张牌点数不同,平局!'
                    print '系统:> 玩家余额 $%d' % self.money.jin(zongzhue)
        self.end()

    # 结束
    def end(self):
        print '系统:> 玩家总下注金额清零 $%d' % self.money.zongjiazhu(-(self.money.zongjiazhu()))        # 总下注额清零(10-10)
        print '系统:> 请等待下一局开局.'
        print '--------------------------------------------------------------------------------'
        time.sleep(1)

class Player(object):
    """docstring for Player"""
    def __init__(self):
        self.card = Card()
        self.money = Money()

    def joinGame(self):
        while True:
            comd = raw_input('系统:> 是否加入这局(y/n,回车默认y,5秒后默认n,退出输入q)?: ')
            if comd == 'y' or comd == '':
                balance = self.money.chkBalance()
                if balance == 0:
                    print '系统:> 抱歉!您的余额为$0,无法下注,正在退出游戏!'
                    print '系统:> 请修改money文件中余额数量后,再进入游戏!'
                    return 'q'
                else:
                    print '系统:> 玩家余额 $%d' % balance
                    print '系统:> 玩家总下注金额 $%d' % self.money.zongjiazhu()        # 总下注金额已清零
                    time.sleep(0.5)
                    return True
            elif comd == 'n':
                print '玩家:> 我不想加入这局!'
                return False
            elif comd == 'q':
                print '系统:> 玩家退出游戏!'
                return 'q'
            else:
                print '系统:> 命令错误,只能输入字母y或n或q或直接回车!'
                time.sleep(0.5)
                continue

    # 直接回车或输入的是0,放弃此局 / 放弃加注
    def giveUp(self, input):
        if input == '' or input == '0':
            return True

    # 下注
    def bet(self):
        while True:
            firstBet = raw_input('系统:> 各位玩家请请下注(需是$%s的倍数,PASS请直接回车!): ' % self.money.base)
            # 放弃此局
            if self.giveUp(firstBet):
                print '玩家:> PASS!'
                time.sleep(0.5)
                return False
            # 检查输入的金额
            input = self.money.chkInput(firstBet)
            if input == 'lack':
                continue
            elif input == 'beyond':
                continue
            elif input:
                print '玩家:> 下注 $%s' % firstBet
                print '系统:> 玩家余额 $%d' % self.money.chu(int(firstBet))
                print '系统:> 玩家总下注金额 $%d' % self.money.zongjiazhu(int(firstBet))
                time.sleep(0.5)
                return True
            else:
                continue
    # 加注(再下注)
    def againBet(self):
        while True:
            secondBet = raw_input('系统:> 各位玩家请加注(需是$%s的倍数,STAND请直接回车!): ' % self.money.base)
            # 放弃加注
            if self.giveUp(secondBet):
                print '玩家:> STAND!'
                print '系统:> 玩家余额 $%d' % self.money.chkBalance()
                print '系统:> 玩家总下注金额 $%d' % self.money.zongjiazhu()
                time.sleep(0.5)
                return True        # 放弃加注也开第三张
            # 检查输入的金额
            againInput = self.money.chkInput(secondBet)
            if againInput == 'lack':
                continue
            elif againInput == 'beyond':
                continue
            elif againInput:
                print '玩家:> 加注 $%s' % secondBet
                print '系统:> 玩家余额 $%d' % self.money.chu(int(secondBet))
                print '系统:> 玩家总下注金额 $%d' % self.money.zongjiazhu(int(secondBet))
                time.sleep(0.5)
                return True
            else:
                continue

        
class Money(object):
    """docstring for Money"""
    def __init__(self):
        self.base = config.base        # 下注金额基数
        self.rwFile = RWFile()

    # 数钱出账
    def chu(self, money=0):
        lose = self.rwFile.readFile(self.rwFile.moneyFilePath)-money
        self.rwFile.writeFile(self.rwFile.moneyFilePath, lose)
        return lose

    # 赢钱进账
    def jin(self, money=0):
        win = self.rwFile.readFile(self.rwFile.moneyFilePath)+money
        self.rwFile.writeFile(self.rwFile.moneyFilePath, win)
        return win

    # 总下注金额
    def zongjiazhu(self, money=0):
        zongzhue = self.rwFile.readFile(self.rwFile.amountFilePath)+money
        self.rwFile.writeFile(self.rwFile.amountFilePath, zongzhue)
        return zongzhue

    # 检查输入的金额
    def chkInput(self, number):
        if number.isdigit():    # 数字
            if self.chkBalance() == 0:
                print '提醒:> 您当前余额为$0,无法加注!'        # 此处是"加注",为什么不是"下注"?,因为玩家加入游戏后就对玩家余额进行检查,如果是$0,则直接提示无法继续游戏,要求退出!都不给下注的机会,故不会存在余额为$0的情况下还可以下注的,但可以加注,因为第一次下注时全下了!
                time.sleep(0.5)
                return 'lack'
            elif int(number) <= self.chkBalance():        # 输入的金额在玩家余额之内
                if int(number) % self.base == 0:        # 输入的金额是base的倍数
                    return True
                else:
                    print '提醒:> 输入的金额必须是$%s的倍数,请重新输入!' % self.base
                    time.sleep(0.5)
                    return False
            else:
                print '提醒:> 输入的金额$%s已超出您当前余额$%d,请重新输入!' % (number,self.chkBalance())
                time.sleep(0.5)
                return 'beyond'
        else:
            print '提醒:> 抱歉,你输入的不是金额数字,请重新输入!'
            time.sleep(0.5)
            return False

    # 查询余额
    def chkBalance(self):
        balance = self.rwFile.readFile(self.rwFile.moneyFilePath)
        return balance

class RWFile(object):
    """读写金钱和总下注金额文本文件"""
    def __init__(self):
        self.moneyFilePath = 'money.txt'        # 必须utf8格式的txt文本
        self.amountFilePath = 'amount.txt'        # 必须utf8格式的txt文本

    # 读(返回读到的数)
    def readFile(self, filePath):
        f = open(filePath,'r')
        money = f.read()
        if money == '' and not money.isdigit():
            print '存储玩家金钱的文件: "%s" 的内容不是一个金额数字,系统已恢复成初始值!'
            money = config.money            # 恢复为config中的money数
        f.close
        return int(money)

    # 写
    def writeFile(self, filePath, money = 0):
        f = open(filePath,'w')
        f.write(str(money))
        f.close()

    # 检查配置文件,money文件,amount文件
    def chkFile(self):
        # 检查配置文件
        if not str(config.base).isdigit() or not str(config.money).isdigit():
            print '配置文件config.py不正确!必须是数字,且其中前后无空格!'
            return False
        # money文件是否存在
        if not os.path.isfile(self.moneyFilePath) or not os.path.isfile(self.amountFilePath):
            f1 = open(self.moneyFilePath,'w')
            f1.write(str(config.money))
            f1.close()

            f2 = open(self.amountFilePath,'w')
            f2.write('0')
            f2.close()
            
            return True
        return True

def main():
    # 显示游戏规则
    print rule.gameRule
    # a=[]
    # for i in range(2,15):
    #     a.append(i)
    # print a
    banker = Banker()
    player = Player()
   
    rwFile = RWFile()
    if not rwFile.chkFile():
        return

    while True:
        banker.ready()                    # 庄家准备
        playComd = player.joinGame()    # 系统提示玩家是否加入这局
        if playComd == 'q':
            break
        elif playComd:
            # 加入
            if player.bet():            # 玩家下注
                # 下注
                if banker.start():        # 庄家开局,发前两张牌
                    if player.againBet():    # 玩家加注
                        banker.thirdCard()        # 庄家发第三张牌
                else:
                    banker.thirdCard()        # 庄家发第三张牌
            else:
                # 没下注
                banker.end()        # 庄家结束这局
        else:
            # PASS
            banker.end()            # 庄家结束这局
            continue
        
if __name__ == '__main__':
    main()

[ 本帖最后由 bobo2cj 于 2014-10-21 14:47 编辑 ]
2014-10-21 14:44
快速回复:求一个poker游戏
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025887 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved