![]() |
#2
bobo2cj2014-10-21 14:44
回复 楼主 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 编辑 ] |
急求,感激不尽
就是python平台上的扑克游戏