鱼C论坛

 找回密码
 立即注册
查看: 1656|回复: 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分哦!

介绍有点长。。。清楚明白那就开始吧!!!!
import random
import easygui as g


def game():
    cartes=(list(range(2,11))+['J','Q','K','A'])*4    #去掉大小王52张牌集
    random.shuffle(cartes)                            #洗牌
    rang=[4,3,2,1]    #公开牌金字塔型
    sum_rang=rang[0]
    base=1          #惩罚基数或者行数
    global name_info
    for i in range(num_players):
        name=g.enterbox('N.%d player, pls enter your name:'%(i+1))
        g.msgbox('We are going to distribute carte,make sure there\'s no others!!!',ok_button='[O]K')
        player_carte=[]
        for j in range(4):
            player_carte.append(cartes.pop())    #给每个玩家发牌
        dictplayer[i]=Player(name,player_carte)  #实例化玩家对象
        name_info+='N.%d player :%s\n'%((i+1),name)   #记录所有玩家名称及对应编号
        g.msgbox('Please remember your cartes and its ORDERS!!!And then press OK\n'+str(dictplayer[i].cartes),ok_button='[O]K')
      
    for i in range(sum(rang)):    
        open_carte=cartes.pop()   #翻公开牌
        if i>=sum_rang:      #让惩罚基数对应行数增加
            sum_rang+=rang[base]
            base+=1  
        while True:
            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'))
            if temp=='[N]o':
                break
            if temp=='[Y]es':
                challenging(open_carte,base)  #进入挑战环节
                score()     #显示当前分数
            if temp=='[H]elp':
                please_help_me()
            elif temp=='[C]heck scores':
                score()
                
    score(a=0)
    
            
def challenging(open_carte,base):   #挑战功能
    num_challenger=int(g.enterbox('Who\'s challenging ? Enter player number pls.\n\n'+name_info))-1    #挑战者编号
    listnum_challenged=list(range(1,num_players+1))   
    listnum_challenged.remove(num_challenger+1)#去掉自身编号
    listnum_challenged=listnum_challenged*3
    listnum_challenged.sort()
    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'\
                                       +name_info,choices=listnum_challenged)
    listnum_challenged=list(map(int,listnum_challenged))    #被挑战者编号列表,该功能将列表字符串都变成整数
    list_dontbelieve=[] #被挑战而且不信的人编号
    name_dontbelieve=[] #被挑战且不信的人名
    already=[]   #已经提问过的被挑战者
    count_dontbelieve=0  #总共不相信人次
    for i in listnum_challenged[:]:
        if i not in already:    #已出现过的被挑战者不再重复出现
            already.append(i)
            num_challenged=i-1    #单个被挑战者编号
            times=listnum_challenged.count(i)   #该玩家被挑战次数
            
            def compromise(a,b):    #编号b玩家,被a次挑战并完全妥协
                        g.msgbox('Oh! %s, you will never know the truth...'%dictplayer[b].name,ok_button='[O]K')
                        dictplayer[b].credit-=base*a   #妥协相信扣一倍基数
            def dontBelieve(a,b):    #编号b玩家,仅相信a次,不完全信
                        nonlocal times,count_dontbelieve
                        dictplayer[b].credit-=base*a
                        dictplayer[b].base=base*(times-a)     #记录该玩家直面挑战的倍数
                        list_dontbelieve.append(b)
                        name_dontbelieve.append(dictplayer[b].name)
                        count_dontbelieve+=(times-a)
            if times>1:   #被挑战多次
                temp=int(g.enterbox('%s, you are challenged for %d times, how many times do you trust %s ?'\
                                %(dictplayer[num_challenged].name,times,dictplayer[num_challenger].name)))
            else:  #被挑战一次
                temp=g.ynbox('%s,do you trust %s ?'%(dictplayer[num_challenged].name,dictplayer[num_challenger].name))
                if temp=='Yes':
                    temp=1
            if temp==times : #完全妥协
                compromise(temp,num_challenged)
            else:
                dontBelieve(temp,num_challenged)
                    
    name_dontbelieve=' & '.join(name_dontbelieve) #去掉首尾'[]'
    if list_dontbelieve!=[]:       #如果还有人不相信
        temp=g.multchoicebox('%s,you have to entre in TOTAL  %d  cartes to convince %s'\
                            %(dictplayer[num_challenger].name,count_dontbelieve,name_dontbelieve),choices=[1,2,3,4])  #记录挑战者出示的牌序号
        temp=list(map(int,temp))

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

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


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


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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 13:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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