鱼C论坛

 找回密码
 立即注册
查看: 1544|回复: 0

[原创] 新手python38课作品---金字塔卡牌游戏

[复制链接]
发表于 2020-3-7 22:54:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
法国读书的时候,跟法国人喝酒学会玩的一个游戏,金字塔(Pyramide). 用的方法都是小甲鱼老师课上教的,感觉应该会有很多有待优化精简的部分。。。有没有大佬有耐心看看给点建议的,不胜感激.

金字塔游戏解说

首先,这是一个来自古埃及的卡牌游戏。。。

每位玩家会拿到4张牌。玩家要先看清自己的牌,并记住买张牌的顺序!!!玩家不能向他人透露自己的卡牌。 法老有情提示:顺序真的很重要哦。
金字塔形的公共牌一共有4行,从底行到顶行每行牌数,及对应惩罚基数分别为4张(每张1分),3张(每张2分),2张(每张3分),1张(每张4分)。
公共牌会从底行开始依次翻开。
每张公共牌翻开后,玩家之间可以互相自由发起挑战,每个玩家只能挑战一次。

挑战规则如下:

1.挑战发起者可以质疑他所选中的玩家,“你相信我有N张这张公共牌么?”,一张公开牌最多挑战3个人次,可以是同一个人哦。

    【例子】比如有A,B,C三个玩家,该轮公共牌是第3行的"2":A向B,C发起挑战:“B,你相信我有两张2么?”  (消耗2个人次)
                                                                         “C, 你相信我有1张2么?”  (消耗1个人次)
                                                         A总共发出3个人次挑战。

    因为扑克牌相同个号码最多4张,(我们这里去除大小王),玩家手里至多有3张同号,公开牌才会有可能出现1张,所以N<=3。

2.挑战发出后,被挑战者可以选择完全相信,部分相信,完全不信。
    完全相信:选择妥协,积分扣除(被挑战张数*该公开牌惩罚基数),个人不相信张数=0
    部分相信:相信的张数同上操作,扣除惩罚基数,个人不相信张数记入总不相信张数。
    完全不信:被挑战张数全部计入总不相信张总数。

    接着上方【例子】,若:B选择相信A有1张2,则B先扣2分,个人不相信张数=1,C同时选择不相信A,总不相信张数=2。
                     若:B选择相信A有两张2,则B扣4分,个人不相信张数=0,C选择不相信A,总不相信张数=1。
                    
3.被挑战者回应后,如果总不相信张数不等于0,则挑战者需要展示等量的个人卡牌序号,并验证这些序号对应的牌都等号于该公开牌,才算挑战成功。
    挑战成功:不相信玩家分别扣除(两倍惩罚基数*个人不相信张数)
    挑战失败:挑战玩家扣除(两倍惩罚基数*总不相信张数)

    接着上方【例子】,若:A 选择自己第1和第3张牌,经过验证,确实都等于2。则挑战成功:B,C分别扣除4分。
                     若:A 选择自己第1和第3张牌,经过验证,不都等于2。则挑战失败:A扣除8分。
   
当没有任何玩家再争对此公开牌发起挑战后,开始翻起下一张公共牌,一直到金字塔顶。

玩家起始分都为0分,最终分最低者失败,需要喝酒哦!法老悄悄告诉你,其实在古埃及,每扣一分就要喝一口哦。

游戏过程中,忘记自己卡牌或顺序的玩家可以点击Help来查询自己的卡牌,不过会扣除5分哦!

介绍有点长。。。清楚明白那就开始吧!!!!

  1. import random
  2. import easygui as g


  3. def game():
  4.     cartes=(list(range(2,11))+['J','Q','K','A'])*4    #去掉大小王52张牌集
  5.     random.shuffle(cartes)                            #洗牌
  6.     rang=[4,3,2,1]    #公开牌金字塔型
  7.     sum_rang=rang[0]
  8.     base=1          #惩罚基数或者行数
  9.     global name_info
  10.     for i in range(num_players):
  11.         name=g.enterbox('N.%d player, pls enter your name:'%(i+1))
  12.         g.msgbox('We are going to distribute carte,make sure there\'s no others!!!',ok_button='[O]K')
  13.         player_carte=[]
  14.         for j in range(4):
  15.             player_carte.append(cartes.pop())    #给每个玩家发牌
  16.         dictplayer[i]=Player(name,player_carte)  #实例化玩家对象
  17.         name_info+='N.%d player :%s\n'%((i+1),name)   #记录所有玩家名称及对应编号
  18.         g.msgbox('Please remember your cartes and its ORDERS!!!And then press OK\n'+str(dictplayer[i].cartes),ok_button='[O]K')
  19.       
  20.     for i in range(sum(rang)):   
  21.         open_carte=cartes.pop()   #翻公开牌
  22.         if i>=sum_rang:      #让惩罚基数对应行数增加
  23.             sum_rang+=rang[base]
  24.             base+=1  
  25.         while True:
  26.             temp=g.buttonbox('\nThe N.%d open carte is :【%s】\nThe base is %d POINTS now.\n\nAnyone dares to CHALLANGER ??? '%(i+1,open_carte,base),choices=('[Y]es','[N]o','[H]elp','[C]heck scores'))
  27.             if temp=='[N]o':
  28.                 break
  29.             if temp=='[Y]es':
  30.                 challenging(open_carte,base)  #进入挑战环节
  31.                 score()     #显示当前分数
  32.             if temp=='[H]elp':
  33.                 please_help_me()
  34.             elif temp=='[C]heck scores':
  35.                 score()
  36.                
  37.     score(a=0)
  38.    
  39.             
  40. def challenging(open_carte,base):   #挑战功能
  41.     num_challenger=int(g.enterbox('Who\'s challenging ? Enter player number pls.\n\n'+name_info))-1    #挑战者编号
  42.     listnum_challenged=list(range(1,num_players+1))   
  43.     listnum_challenged.remove(num_challenger+1)#去掉自身编号
  44.     listnum_challenged=listnum_challenged*3
  45.     listnum_challenged.sort()
  46.     listnum_challenged=g.multchoicebox('Who\'s the target ?\nChoose player number please,you have AT MOST 3 choices,it can be the same person ! \n\n'\
  47.                                        +name_info,choices=listnum_challenged)
  48.     listnum_challenged=list(map(int,listnum_challenged))    #被挑战者编号列表,该功能将列表字符串都变成整数
  49.     list_dontbelieve=[] #被挑战而且不信的人编号
  50.     name_dontbelieve=[] #被挑战且不信的人名
  51.     already=[]   #已经提问过的被挑战者
  52.     count_dontbelieve=0  #总共不相信人次
  53.     for i in listnum_challenged[:]:
  54.         if i not in already:    #已出现过的被挑战者不再重复出现
  55.             already.append(i)
  56.             num_challenged=i-1    #单个被挑战者编号
  57.             times=listnum_challenged.count(i)   #该玩家被挑战次数
  58.             
  59.             def compromise(a,b):    #编号b玩家,被a次挑战并完全妥协
  60.                         g.msgbox('Oh! %s, you will never know the truth...'%dictplayer[b].name,ok_button='[O]K')
  61.                         dictplayer[b].credit-=base*a   #妥协相信扣一倍基数
  62.             def dontBelieve(a,b):    #编号b玩家,仅相信a次,不完全信
  63.                         nonlocal times,count_dontbelieve
  64.                         dictplayer[b].credit-=base*a
  65.                         dictplayer[b].base=base*(times-a)     #记录该玩家直面挑战的倍数
  66.                         list_dontbelieve.append(b)
  67.                         name_dontbelieve.append(dictplayer[b].name)
  68.                         count_dontbelieve+=(times-a)
  69.             if times>1:   #被挑战多次
  70.                 temp=int(g.enterbox('%s, you are challenged for %d times, how many times do you trust %s ?'\
  71.                                 %(dictplayer[num_challenged].name,times,dictplayer[num_challenger].name)))
  72.             else:  #被挑战一次
  73.                 temp=g.ynbox('%s,do you trust %s ?'%(dictplayer[num_challenged].name,dictplayer[num_challenger].name))
  74.                 if temp=='Yes':
  75.                     temp=1
  76.             if temp==times : #完全妥协
  77.                 compromise(temp,num_challenged)
  78.             else:
  79.                 dontBelieve(temp,num_challenged)
  80.                     
  81.     name_dontbelieve=' & '.join(name_dontbelieve) #去掉首尾'[]'
  82.     if list_dontbelieve!=[]:       #如果还有人不相信
  83.         temp=g.multchoicebox('%s,you have to entre in TOTAL  %d  cartes to convince %s'\
  84.                             %(dictplayer[num_challenger].name,count_dontbelieve,name_dontbelieve),choices=[1,2,3,4])  #记录挑战者出示的牌序号
  85.         temp=list(map(int,temp))

  86.         for each in temp:   #检查出示的每张卡牌
  87.            win=1
  88.            if dictplayer[num_challenger].cartes[each-1]==open_carte:    #若相等,则继续
  89.                continue
  90.            else:
  91.                win=0                 #任一张不等则输
  92.                break
  93.         if win:
  94.             for each in list_dontbelieve:
  95.                dictplayer[each].credit-=2*dictplayer[each].base  #挑战者成功,不信的被挑战者依次扣不信张数乘2倍基数
  96.             g.msgbox('AMAZINGGG!!!%s,you really got %d 【%s】'%(dictplayer[num_challenger].name,count_dontbelieve,open_carte),ok_button='[O]K')
  97.         else:            #挑战者失败,挑战者扣2倍基数*坚持不信人数
  98.             dictplayer[num_challenger].credit-=2*base*count_dontbelieve
  99.             g.msgbox('Bravooooo!!!%s, %s is a big liar!'%(name_dontbelieve,dictplayer[num_challenger].name),ok_button='[O]K')

  100.             
  101.    
  102. def score(a=1):   #当前分数展示
  103.     text=''
  104.     min=0
  105.     title='Current scores !'
  106.     pic=''
  107.     for i in range(num_players):
  108.         if dictplayer[i].credit<min:     #计算最低分玩家
  109.             min=dictplayer[i].credit
  110.             min_num=i
  111.         text+='N.%d player:%-5s, your score is %2d.\n'%(i+1,dictplayer[i].name,dictplayer[i].credit)
  112.     if a:
  113.         pass
  114.     else:
  115.         text+='\n\n%s, you are looser! Finish your beer !!!'%dictplayer[min_num].name
  116.         title='GAME OVER!!!'
  117.     g.msgbox(text,title,ok_button='[O]K')


  118. def please_help_me():   #忘牌提示
  119.     num=g.enterbox('Who wants to see his cartes ? Enter player number pls:\n\n'+name_info)
  120.     if num:
  121.         num=int(num)-1
  122.         temp=g.ynbox('%s,are you sure ? It will cost you 5 points !!!'%dictplayer[num].name)
  123.         if temp:
  124.             g.msgbox(dictplayer[num].cartes,ok_button='[O]K')
  125.             dictplayer[num].credit-=5
  126.             score()
  127.         else:
  128.             print('Carry on, trust yourself !!!',ok_button='[O]K')


  129. class Player:   #玩家类
  130.    credit=0
  131.    base=1
  132.    def __init__(self,name,cartes):
  133.        self.name=name
  134.        self.cartes=cartes
  135.    
  136.   
  137. dictplayer={}
  138. name_info='' #记录所有玩家名称及对应编号
  139. num_players=int(g.enterbox('Please enter number of players:',title='欢迎来到神秘的古埃及!!!'))

  140. game()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-1 17:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表