回复 楼主 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 编辑 ]