|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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()
复制代码 |
|