当前位置: 首页 > 科技观察

来骗金华?那种

时间:2023-03-19 20:31:05 科技观察

序< titlesplit >又叫三张牌,是一种在全国广为流传的民间多人纸牌游戏。比如JJ游戏中的诈金花(赢三张牌)就有独特的比牌规则。游戏过程中需要考验玩家的勇气和智慧。--《百度百科》前几天在交流群里,一个叫【^-^】的粉丝分享了一个扑克牌诈骗的话题,要求用Python实现。题目如下:自己写一个程序实现发牌,比较大小判断输赢。####游戏规则:一副扑克牌,去掉大小K,每位玩家发3张牌,最后比较大小看谁赢。牌有以下几种:豹:三张相同的牌,比如三张6。顺进:又称同花顺,即同花色的三个顺子,如红心5、6、7。顺:又称拖拉机,不同花色,而是一对顺子,如5的红心、方块6、黑桃7,组成顺子对子:2张牌相同单:最大的单子是A这些牌的大小顺序是,**豹>顺进>顺子>对子>单**####程序需要实现的点:1.思路解决这个问题,首先要构造一副扑克牌,根据扑克牌的属性和特点。拆解,再构建播放器用户,这里经常使用字典和列表来存储信息,这是经过实践检验的。2.解决方案针对这个问题,粉丝[^-^]给出了解决方案,直接上传代码如下:#-*-coding:utf-8-*-importrandompuke=[]#Storeplayingcardsnum_list=['2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'10'、'J'、'Q'、'K'、'A']hua_list=['梅花','红心','黑桃','方块']sort_dic={'2':0,'3':1,'4':2,'5':3,'6':4,'7':5,'8':6,'9':7,'10':8,'J':9,'Q':10,'K':11,'A':12,'Pair':15,'Shunzi':30,'Shunjin':60,'Leopard':100}count_new_list=[]#存储玩家分数和排序后的排名count_dic={}#存储玩家分数#准备52张牌huainhua_list:fornuminnum_list:a=hua+numpuke.append(a)player_dic={'玩家1':[],'玩家2':[],'玩家3':[],'玩家4':[],'Player5':[]}#随机发牌给五个玩家#print(len(puke))forkey,valueinplayer_dic.items():foriinrange(3):plate=random.sample(puke,3)player_dic[key]=plateforiinplate:puke.remove(i)print(player_dic)#获取玩家的牌类型defpaixing(list1):num=[]huase=[]foriinlist1:a=i[2:]b=i[:2]num.append(a)huase.append(b)returnnum,huase#sort_dic={'2':0,'3':1,'4':2,'5':3,'6':4}#对数字的卡片类型进行排序defsort(num):new_num=[]sort_list2=[]list1=[]foriinnum:new_num.append(sort_dic[i])new_num=sorted(new_num)#sortedis[2,4,7]fornewinnew_num:sort_list2.append([kfork,vinsort_dic.items()ifv==new])forminsort_list2:forninm:list1.append(n)returnlist1#玩家牌的统计分数defcount(num,huase):a=0base_count=sort_dic[num[0]]+sort_dic[num[1]]+sort_dic[num[2]]ifnum[0]==num[1]andnum[1]==num[2]:paixing='Leopard'a=base_count+sort_dic[paixing]elif(sort_dic[num[0]]+1==sort_dic[num[1]]andsort_dic[num[2]]-1==sort_dic[num[1]])and(huase[0]==huase[1]andhuase[1]==huase[2]):paixing='顺进'a=base_count+sort_dic[paixing]elif(sort_dic[num[0]]+1==sort_dic[num[1]])和(sort_dic[num[2]]-1==sort_dic[num[1]])和(huase[0]!=huase[1]或huase[1]!=huase[2]):paixing='顺子'a=base_count+sort_dic[paixing]elif(num[0]==num[1]andnum[1]!=num[2])or(num[1]==num[2]andnum[0]!=num[1])or(num[0]==num[2]andnum[1]!=num[0]):paixing='pair'a=base_count+sort_dic[paixing]else:a=base_countreturna#Sort存储玩家分数的字典defcompare(count_dic):d=list(zip(count_dic.values(),count_dic.keys()))returnsorted(d,reverse=True)forkey,valueinplayer_dic.items():num,huase=paixing(value)num=sort(num)count1=count(num,huase)count_dic[key]=count1print(key+"卡片是:"+str(value))count_new_list=compare(count_dic)#print(count_new_list)print('最终排名:'+"\t"+count_new_list[0][1]+"第一名"+"\t"+count_new_list[1][1]+"第2名"+"\t"+count_new_list[2][1]+"第三名"+"\t"+count_new_list[3][1]+"第四名"+"\t"+count_new_list[4][1]+《第五名》)代码看起来确实不少,100多行,读起来需要一些时间,但是知识点涉及的int并不复杂,基本有点Python基础,看得懂代码运行后,可以看到如下效果:但是后面看这段代码的时候,发现中间有一个地方真的是多余的。稍微修改一下,代码更简洁了,给一些函数和变量命名。一些具有实际意义的对应词更具可读性,代码如下:#-*-coding:utf-8-*-importrandompuke=[]#storeplayingcardsnum_list=['2','3','4','5','6','7','8','9','10','J','Q','K','A']hua_list=['俱乐部','红心','黑桃','方块']sort_dic={'2':0,'3':1,'4':2,'5':3,'6':4,'7':5,'8':6,'9':7,'10':8,'J':9,'Q':10,'K':11,'A':12,'YesSon':15,'Shunzi':30,'Shunjin':60,'Leopard':100}count_new_list=[]#存储玩家分数和排序后的排名count_dic={}#存储玩家分数#为hua_list中的hua准备52张牌:fornuminnum_list:a=hua+numpuke.append(a)player_dic={'玩家1':[],'玩家2':[],'玩家3':[],'玩家4':[],'玩家5':[]}#随机发牌给五个玩家print(len(puke))forkey,valueinplayer_dic.items():foriinrange(3):plate=random.sample(puke,3)player_dic[key]=plateforiinplate:puke.remove(i)print(player_dic)#获取玩家的卡牌类型defpaixing(list1):num=[]huase=[]fordatainlist1:huase_type=data[:2]pai_number=data[2:]num.append(pai_number)huase.append(huase_type)returnnum,huase#对玩家的品牌统计分数defget_score(num,huase):base_count=sort_dic[num[0]]+sort_dic[num[1]]+sort_dic[num[2]]ifnum[0]==num[1]andnum[1]==num[2]:paixing='豹子'score=base_count+sort_dic[paixing]elif(sort_dic[num[0]]+1==sort_dic[num[1]]andsort_dic[num[2]]-1==sort_dic[num[1]])and(huase[0]==huase[1]andhuase[1]==huase[2]):paixing='顺金'score=base_count+sort_dic[paixing]elif(sort_dic[num[0]]+1==sort_dic[num[1]])and(sort_dic[num[2]]-1==sort_dic[num[1]])and(huase[0]!=huase[1]orhuase[1]!=huase[2]):paixing='顺子'score=base_count+sort_dic[paixing]elif(num[0]==num[1]andnum[1]!=num[2])or(num[1]==num[2]andnum[0]!=num[1])or(num[0]==num[2]andnum[1]!=num[0]):paixing='对子'score=base_count+sort_dic[paixing]else:分数=基础_countreturnscoreif__name__=='__main__':forkey,valueinplayer_dic.items():num,huase=paixing(value)#对数字卡进行排序num=sorted(num)score=get_score(num,huase)count_dic[key]=scoreprint(key+"Thecardis:"+str(value))#对存储玩家分数的字典进行排序count_new_list=sorted(zip(count_dic.values(),count_dic.keys()),reverse=True)print("Finalranking:")foriinrange(len(count_new_list)):print(count_new_list[i][1]+'\t',end='')3.总结我是Python高级用户,本文中现实生活中的诈骗金花游戏是基于Python编程,利用Python基础知识中的列表、字典、函数等实现在线诈骗金花的过程。