没错!C语言小白又开始学习python啦,现在光荣晋升一位python小白,于是我又用python重新编了一次之前的游戏,具体规则请参见我的上一篇文章。

遗憾的是,下面200行代码并没有涉及到面向对象的思想,重新编这个游戏只是为了熟悉python基础语法用来练手的。代码如下:

import random
from time import time, sleepdef input_name(): #输入每位玩家姓名(为了显示的美观性,字符长度不要超过7,1个汉字当做2个字符计算)for i in range(4):card_P[i] = input("请输入第{}位玩家的名字:".format(i+1))print("\n", end = '')sleep(0.5)def shuffle(cards, card_num): #洗牌random.seed(time)for i in range(200):swap_x = random.randint(0,card_num)swap_y = random.randint(0,card_num)cards[swap_x],cards[swap_y] = cards[swap_y],cards[swap_x]def give_card(): #发牌for i in range(56):card[i//14].append(init_card[i])for i in range(4): #用空字符填充每位玩家手牌至56张card[i] += ['']*42def count_cards(cards): #计算传入列表中最后一个非空字符位置temp = -1 #用反向递减序号递减至非空字符位置,数字处理后返回while cards[temp] == '':temp -= 1if len(cards) == abs(temp)-1: #处理列表所有元素均为空字符的情况return 0return len(cards)-abs(temp)+1def print_card(): #在窗体中打印每位玩家的姓名及已经打出的手牌global playernumcnt = count_cards(card_P)for i in range(cnt):print(card_P[i]+'\t\t', end = '')if i % playernum == playernum - 1 and i != cnt-1: #断行print('\n')print('\n')def judge(): #判断是否满足奖励条件global fruits_num, playernumfruits_num = [0, 0, 0, 0] #表示明牌区不同种类水果牌对应水果个数for i in range(playernum, count_cards(card_P)):d = {'香蕉':0, '草莓':1, '樱桃':2, '柠檬':3}if card_P[i] != '': #处理空字符索引越界情况fruits_num[d[card_P[i][0:2]]] += int(card_P[i][2]) #水果个数累加print("{:*^54}".format("水果个数"))print("{:13}{:13}{:13}{:13}\n".format('香蕉'+str(fruits_num[0])+'个','草莓'+str(fruits_num[1])\+'个','樱桃'+str(fruits_num[2])+'个','柠檬'+str(fruits_num[3])+'个')+'*'*58+"\n")ls_back = [] #表示满足奖励条件的水果牌种类for i in range(4):if fruits_num[i]%5 == 0 and fruits_num[i] != 0:ls_back.append(i)return ls_back #返回满足奖励条件的水果牌种类def punish(n): #罚牌rec_player = [0, 1, 2, 3]rec_player.remove(n) #在罚牌过程中获得牌的玩家列表for i in rec_player:if out_flag[i] == 0: #已出局的玩家不能获得牌card[i][card[i].index('')] = card[n].pop(0)card[n].append('')def reward(n, fruit_kinds): #奖励牌d = {0:'香蕉', 1:'草莓', 2:'樱桃', 3:'柠檬'}i = playernumfor kind in fruit_kinds:while i < count_cards(card_P):if card_P[i] != '' and card_P[i][0:2] == d[kind]: #明牌区符合条件的水果牌交给第n位玩家card[n][card[n].index('')] = card_P[i]for j in range(15):if j*playernum+i < 155: #将待删除的牌用下一位置的牌覆盖card_P[j*playernum+i] = card_P[(j+1)*playernum+i]i -= 1i += 1shuffle(card[n], card[n].index('')-1) #玩家得到牌之后洗牌for i in range(4): #同时清除另一明牌区符合条件的牌(明牌区有两个:card_P,show_card,暗牌区是card)for j in range(56):if show_card[i][j] != '' and show_card[i][j][0:2] == d[kind]:show_card[i][j] = ''def del_empty_string(): #删除列表中某些元素global playernum, counts, card_Pi = 0while i < counts-playernum + 2: #删除card_P列表中counts位置之前连续的playernum个空字符if card_P[i:i+playernum] == ['']*playernum:del card_P[i:i+playernum]card_P += ['']*playernum #此行代码使card_P变成局部变量!!!i -= 1; counts -= playernumi += 1for i in range(4): #删除show_card[i]列表中非空字符之前的空字符while show_card[i].index('') < count_cards(show_card[i]):del show_card[i][show_card[i].index('')]show_card[i].append('')def ring_bell(): #按铃阶段bell = input('请按铃:')print("\n", end = '')if bell[0] == '0':return Noneelif bell[0] in ['q', 'p', 'z', 'm']:d = {'q':0, 'p':1, 'z':2, 'm':3} #将输入的按键转化为明确代表玩家身份的数字0,1,2,3fruit_kinds = judge() #接收满足条件的水果牌(可能是空列表,没有满足条件的牌)sleep(1)if len(fruit_kinds) == 0: #判断是否有水果牌满足条件if card[d[bell[0]]].index('') == 0:print("判断错误!您手上没有牌可以惩罚。\n")else:print("判断错误!已惩罚。\n")punish(d[bell[0]])else:reward(d[bell[0]], fruit_kinds)del_empty_string() #执行reward之后,show_card和card_P列表中出现可以被删除的空字符print("判断正确!已奖励。\n")print_surplus_cards(cal_cards())else:print("请输入正确的按键!\n")ring_bell()def judge_out(): #判断是否有人出局global playernum, countstemp = 0 #用于指示第temp个出局标志为0的玩家(当玩家数小于4时提供正确的card_P索引)for i in range(4): #遍历四个玩家以判断是否满足出局条件if out_flag[i] == 0:if card[i].index('')+count_cards(show_card[i]) == 0:sleep(1)print("{:=^54}".format(card_P[temp]+"出局")+"\n")out_flag[i] += 1 #该玩家出局标志置为1del card_P[temp:counts+1:playernum] #清除该出局玩家对应的牌counts -= counts//playernum + 1 #明牌区索引变量随之改变playernum -= 1temp += 1def print_surplus_cards(cards): #打印场上玩家剩余牌数global playernumsleep(1)temp = 16*playernum-14print('-'*(temp//2)+"剩余牌数"+'-'*(temp//2))for i in range(len(cards)):print("{:4}:{:>2}张\t".format(card_P[i], cards[i]), end = '')print('\n'+'-'*(temp+8)+"\n\n\n")def cal_cards(): #计算储存场上玩家牌数的列表cards = []for i in range(4):if out_flag[i] == 0:cards.append(card[i].index('')+show_card[i].index(''))return cardsdef judge_over(playernum): #判断游戏是否结束cards = cal_cards()isTrue = card[0].index('') == 0 and card[1].index('') == 0 and card[2].index('') == 0 and card[3].index('') == 0if playernum == 2 or isTrue: #玩家只剩下两人或者所有人的牌出完时游戏结束print_surplus_cards(cards)for i in range(len(cards)):if cards[i] == max(cards):breaksleep(3)print("{:=^54}".format("游戏结束")+"\n")if isTrue:print("所有人的牌出完了,", end = '')print("{}胜利!\n".format(card_P[i]))return 1return 0def play(): #游戏正式开始print("{:=^54}".format("游戏开始")+"\n")sleep(1)global playernum, countsi = 0 #用于指示出牌局数while i < 1000:if out_flag[i % 4] == 1: #玩家出局时跳过该玩家出牌局i += 1cnt1 = i % 4cnt2 = i // 4if input("请{}输入0出牌:".format(card_P[counts%playernum])) == '0':sleep(1)if card[cnt1][0] != '': #处理无牌可出情况card[cnt1].append('')show_card[cnt1][cnt2] = card[cnt1].pop(0) #show_card列表中将出现可以被删除的空字符cnt_temp = countsif out_flag[cnt1] == 0:while card_P[cnt_temp] == '':cnt_temp -= playernumcard_P[cnt_temp+playernum] = show_card[cnt1][cnt2]del_empty_string() #删除上述空字符print_card()ring_bell()judge_out()sleep(1)if judge_over(playernum):breakelse:print("\n嘿嘿!您手上没牌了哦。\n")sleep(1)i += 1; counts += 1else:print("\n请输入正确的按键!\n")init_card = ['香蕉1']*5+['香蕉2']*3+['香蕉3']*3+['香蕉4']*2+['香蕉5']+\['草莓1']*5+['草莓2']*3+['草莓3']*3+['草莓4']*2+['草莓5']+\['樱桃1']*5+['樱桃2']*3+['樱桃3']*3+['樱桃4']*2+['樱桃5']+\['柠檬1']*5+['柠檬2']*3+['柠檬3']*3+['柠檬4']*2+['柠檬5']
card = [[], [], [], []] #card的0,1,2,3四个位置分别代表四个玩家的手牌(暗牌区)
show_card = [['']*56, ['']*56, ['']*56, ['']*56] #show_card的0,1,2,3四个位置分别代表四个玩家已经打出的手牌(明牌区)
playernum = 4 #记录场上玩家数目,当有玩家出局时更新此变量,不同函数的执行过程和结果随该变量发生改变
card_P = ['']*160 #储存用于在窗体打印的玩家姓名和打出的手牌
out_flag = [0, 0, 0, 0] #玩家是否出局的标志,0,1,2,3四个位置分别代表四个玩家
fruits_num = [0, 0, 0, 0] #记录场上不同种类水果牌对应水果数目,0,1,2,3四个位置分别代表香蕉、草莓、樱桃、柠檬
counts = 4 #用于指示card_P列表下标索引
input_name()
print("…………发牌中…………\n")
sleep(3)
shuffle(init_card, 55)
give_card()
play()

桌游“德国心脏病”的python代码实现相关推荐

  1. 桌游“德国心脏病”的C语言代码实现

    目前C语言小白,刚接触C语言半年,最近借着学校课程设计的机会写了一个小游戏,打算分享出来. PS:由于本人代码水平很差,所以600行代码中有很多重复代码,程序的结构也不是太合理,如果有哪位大神感兴趣给 ...

  2. 游码编程之Python代码应用

    一.概述: 游码编程(RLC, Run Length Coding) ,又称"运动长度编码"或"行程编码",是一种统计编码,该编码属于无损压缩编码,是栅格数据压 ...

  3. python带你采集桌游、剧本杀游戏店数据信息~

    前言 嗨喽~大家好呀,这里是魔王呐 ! 又是学习的一天,让我们开始叭~ 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install ...

  4. Python 桌游:骰子街

    骰子街是一款经典桌游.规则简单.易学.这里是规则讲解和游玩的视频.这个视频的作者桌游林吃素开了一家桌游店"小狮子桌游铺"(淘宝),我在这家桌游店买了骰子街豪华版,包含基础版和扩展. ...

  5. 基于Python的马尼拉PC端桌游设计与实现

    目录 第一章 需求分析 4 1 引言 4 1.1编写目的 4 1.2背景 4 2 任务概述 4 2.1目标 4 2.2用户的特点 5 2.3假定和约束 5 3 需求规定 5 3.1对功能的规定 5 3 ...

  6. [开坑] pygame设计联机对战桌游

    [开坑] pygame设计联机对战桌游 新春唠嗑 pygame 学习路径 开发工具 文章汇总(2020/2/11更新) 新春唠嗑 因为疫情,在家禁足了一个月,打游戏打得昏天暗地,实在是浪费光阴.这些日 ...

  7. [pygame] pygame设计联机对战桌游(一)

    [pygame] pygame设计联机对战桌游(1-1) 内容概要 昨日问题 官方教程 1. 弹弹球demo 完整代码 逐句解读 2. 导入和初始化 3. 用pygame制作游戏 3.1 简介 3.2 ...

  8. 弹球游戏python代码含记分模式_python编写弹球游戏的实现代码

    用Blender制作一个兵乓球小游戏,要编写Python代码需要安装pygame 包没有面对困难的勇气,也就没有享受快乐的权利. python 怎么写双人弹球游戏最难过的事不是别人又得罪你了,而是你自 ...

  9. python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码

    点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货! 介绍 无论你使用哪种编程语言或框架,测试都非常重要.Hypothesis是 ...

最新文章

  1. HashMap和HashTable区别
  2. mysql在线模拟器_力荐一款在线SQL模拟器
  3. Linux Kernel TCP/IP Stack — L1 Layer — NIC bonding
  4. 45 Ansible Play-books模式
  5. 计算机网络实验(华为eNSP模拟器)——第十三章 VLAN注册协议(GVRP)
  6. 计算机网络标准体系,计算机网络标准体系结构实验报告.doc
  7. 如何在CentOS 7上安装和配置MySQL Cluster
  8. FFmpeg命令的几种应用
  9. python识别验证码ocr_Python3使用tesserocr识别字母数字验证码
  10. 计算机机械硬盘系统安装,笔记本如何安装机械硬盘?笔记本安装机械硬盘的操作步骤...
  11. 同济版《工程数学:线性代数》60条笔记全整理
  12. 复合高斯求积matlab代码,谁有复何求积公式和高斯求积公式在matlab中实现的代码...
  13. 微博 php7,PHP_迁移PHP版本到PHP7,今天看到微博上说phpng也就是ph - phpStudy
  14. mycncart 之中国银联在线支付方式
  15. rio 10.3 vcl应用更换皮肤
  16. java+svm多分类器_svm多分类的java源码
  17. JAVA正则表达式验证英文字母、汉字和数字!!!
  18. d盘格式化了能正常使用吗
  19. keras.metrics有五种accuracy
  20. 金蝶采购模块采购赠品业务处理逻辑

热门文章

  1. 《图解UE4渲染体系》Part 0 引擎基础
  2. Servlet与过滤器
  3. PHP中使用DES加密解密
  4. php使用mpdf把HTML转成pdf
  5. 最详尽的PyCharm 实用教程,值得一看!
  6. HDU 4950 Monster
  7. 扬州市计算机职业学校名称,扬州市职业学校2019对口高考班适应性考试计算机试卷.doc...
  8. 阿里OCR接入一个小注意事项
  9. Unity粒子系统(5.x)基础(二)
  10. 关闭java安全警告_总是弹出下面这个安全警告,请问在哪里可关掉?