导语
还记得那些年,我们玩过的Windows小游戏吗?
说起Windows自带的游戏,相信许多80、90后的朋友都不陌生。
在很早的那个游戏贫瘠的年代,《纸牌》、《扫雷》等游戏帮助我们在微机课上带来了许多欢
乐的时光。但在这些游戏中,有一款游戏似乎玩得懂的人,甚至知道玩法的人并不多。这款游戏
就是《红心大战》。
最近小编心血来潮仔细钻研了一下之后,发现这款游戏玩起来确实比其他的几款游戏更带感
一些。因为这款游戏的玩法简单概括就是两个字:“坑人”,而且是明着坑的那种。
那大家猜到了哈——今天跟着木木子一起开启《红心大战》纸牌小游戏吧!
正文
一、 红心大战用户手册
1.打开游戏:双击hongxindazhan.py 主程序运行即可!
2.开始游戏:键入玩家姓名,创建新ID,点确认进入游戏。
3.游戏流程:
1)换牌:选择三张手牌,点击上方按钮完成交换;2)出牌:轮到玩家出牌时,选择手牌单击便可打出。(具体出牌规则详见附录)注:当此时机不能打出此牌时,下方提示栏会显示无法打出原因。
4.统分阶段:一轮游戏过后,会弹出得分表,显示玩家和三名电脑每轮积分和总积分,并显示
玩家当前名次。(具体胜负判定规则详见附录)
5.菜单栏:
1)游戏栏: 新游戏(F2):单击开启新游戏。 得分(F4):单击显示得分表。 背景音乐:单击切换音乐开关。 选项(F5):单击修改电脑出牌速度。 退出:单击退出游戏。 2)帮助栏: 规则介绍(F1):单击显示简要规则和获胜条件。 名言:单击弹出一则名言。
6.背景音乐:更换:可用自己的wav格式音乐重命名为‘m1.wav’替换程序目录下的同名文件。
二、红心大战游戏规则:
1、在玩游戏前,需要决定庄家。在电脑中,庄家坐南。2、拿到一手牌(共计13张)后,庄家首先须选出三张牌传给其他对手。第一局把牌传给左手边的玩家;第二局把牌传给右手边的玩家;第三局把牌传给坐在对面的玩家;第四局不传牌,依此类推。接到庄家的传牌后,也需要任意传回给庄家三张牌。在电脑中,如要选牌,单击相应牌张即可。如要取消选定的牌,请再次单击。3、抓有梅花2的玩家必须首先出梅花2,谓首攻。4、然后按顺时针方向出牌。每位玩家依次必须跟同花色牌。如果已经没有与发牌花色相同的牌,则可以出任何一张牌。唯一例外是不能在第一圈牌中出红桃或黑桃Q(通常称为“猪”)。注意:出的同一花色牌中最大的牌会赢取这一圈,赢牌的玩家在下一圈中先出牌。只有前面出过红桃以后,才可以拿红桃领出(除非手中只剩下红桃一种花色的牌张)。5,、每一轮游戏结束时,每张红心计1分,“黑桃皇后(猪)”计13分。游戏将持续到有人得100分或更多分或者庄家退出游戏时结束。如果在一轮牌中赢得了所有的红心和“黑桃皇后”(称之为“全收”),则“全收”者得零分,其余玩家每人得26分。该游戏的得分越低越好。
三、准备中
1)环境安装
▲环境安装 本文用到的运行环境:Python3.7、Pycharm社区版2020、tkinter模块、部分
自带模块直接导入不需要安装。(如果需要安装软件、激活码或者遇到问题的话可以私信我
哈!) 模块安装:pip install -i
https://pypi.douban.com/simple/ +模块名
2)背景选择
最原始的绿色背景。(仅展示背景,其余图片比较多不展示)参考为最上面第二个图片
四、代码演示
仅展示主程序源码。每行代码都有注释所以直接展示!全部的源码见文末!
from Tkinter import * from tkFont import * import winsound from tkMessageBox import * from inner import * from dialog import * #游戏主界面创建classGameFrame:def__init__(self,game,bgimg):#game,Game类对象;bgimg,背景图片self.master = game.root #创建画布,绘制背景self.c = Canvas(self.master,width = 1024,height = 640) self.c.create_image(514,322,image=bgimg) self.c.pack() #创建状态条self.status = Label(self.master,text=" 欢迎参加红心大战!", bd=1,relief=SUNKEN,anchor=W) self.status.pack(fill = X) #打开开始对话框startdialog = StartDialog(self.master,"红心大战") ifstartdialog.isCancel:game.cancel() else:self.gamemodetext = ['向左传','向右传','交叉换牌'] self.name = [startdialog.name,'西','北','东'] self.handXY = [[346.5,490,1,0],[20,135,0,1], [586.5,20,-1,0],[913,375,0,-1]] self.nameXY = [[-20,130,SE],[0,-20,SW],[91+20,0,NW],[91,130+20,NE]] self.middleXY = [[466.5,330],[411,255],[466.5,180],[522,255]] self.img = 53* [''] fori inrange(52): self.img[i] = PhotoImage(file = 'card%s.pgm'% (i)) self.img[52] = PhotoImage(file = 'back.pgm') self.scorelist = [] self.cards = [] self.gamemode = 0self.speed = 100self.wait = self.speed self.isChanging = False self.iswait = False #绘制名字fori inrange(4): self.c.create_text(self.handXY[i][0]+self.nameXY[i][0], self.handXY[i][1]+self.nameXY[i][1], fill = 'white',text = self.name[i], anchor = self.nameXY[i][2], font = Font(size=15,weight="bold")) #创建手牌self.l = 52* [''] fori inrange(52): self.l[i] = Label(self.master,image=self.img[52],bd = -1) fori inrange(13): self.l[i]['text'] = str(i) self.l[i].bind("<Button-1>",self.cardEvent) #创建中央牌self.ml = 4* [''] fori inrange(4): self.ml[i] = Label(self.master,image=self.img[52],bd = -1) self.b = Button(self.master,width=15,command=self.buttonEvent) #一轮游戏开始self.oneGameStart() defoneGameStart(self): #创建Onegame对象,用来获取出牌信息self.onegame = OneGame() #获取玩家手牌,显示hand = self.onegame.getPlayerHand(0) fori inrange(13): self.l[i]['image'] = self.img[hand[i].id] fori inrange(4): forj inrange(13): self.moveCard(i,j,0) #游戏模式为0,1,2时进入换牌阶段 ifself.gamemode "确定"接受传来的牌。'self.b['text'] = '确定'self.isOK = True else:#换牌后进行确认,进入出牌阶段,玩家前的电脑出牌fori inself.select:self.moveCard(0,i,0) self.b.place_forget() self.isChanging = False self.leftCards = 13self.playpreCards() defplaypreCards(self): ifself.leftCards == 0: #牌出完了进行统分,显示得分对话框fori inrange(4): hand = self.onegame.p[i].scoreHand forj inrange(len(hand)): self.l[i*13+j]['image'] = self.img[hand[j].id] self.moveCard(i,j,0) score = self.onegame.getScore() self.scorelist.append(score) iflen(self.scorelist) != 1: fori inrange(4): self.scorelist[-1][i] += self.scorelist[-2][i] self.status['text'] = ' 得分'scoredialog = self.showScoreDialog() #得分确认后初始化,开始新一轮游戏ifscoredialog.isover:self.scorelist = [] self.gamemode = 0else:self.gamemode = (self.gamemode + 1) % 4fori inrange(52): self.l[i].place_forget() self.l[i]['image'] = self.img[52] fori inrange(4): self.ml[i].place_forget() self.oneGameStart() else:#获取玩家之前的电脑出牌,进行显示fori inrange(4): self.ml[i].place_forget() self.turn = 0preCards = self.onegame.preCard iflen(preCards) == 0: self.end() else:fori inrange(len(preCards)): p,j = preCards[i][0],preCards[i][1] self.cards.append([self.turn,p,j]) self.master.after(self.wait,self.showMiddleCard) ifp == 3: self.master.after(self.wait,self.end) self.wait = self.speed else:self.wait += self.speed self.turn += 1defplaylaterCards(self): #获取玩家之后的电脑出牌,进行显示laterCards = self.onegame.laterCard fori inrange(len(laterCards)): p,j = laterCards[i][0],laterCards[i][1] self.cards.append([self.turn,p,j]) self.master.after(self.wait,self.showMiddleCard) self.wait += self.speed self.turn += 1defmoveCard(self,i,j,state):#i,玩家;j,第几张牌;state,弹起还是放下#牌的移动self.l[i*13+j].place_forget() x0= self.handXY[i][0] + self.handXY[i][2]*j*20y0= self.handXY[i][1] + self.handXY[i][3]*j*20self.l[i*13+j].place(x = x0,y = y0- state * 20) defnewGame(self): #新游戏self.scorelist = [] self.gamemode = 0fori inrange(52): self.l[i].place_forget() self.l[i]['image'] = self.img[52] fori inrange(4): self.ml[i].place_forget() self.oneGameStart() defshowScoreDialog(self): #显示分数对话框scoredialog = ScoreDialog(self.master,self.scorelist,self.name) returnscoredialog defshowMiddleCard(self): #中央牌显示i = self.cards[0][0] p = self.cards[0][1] j = self.cards[0][2] del self.cards[0] self.l[p*13+j].place_forget() hand = self.onegame.getPlayerHand(p) self.ml[i]['image'] = self.img[hand[j].id] self.ml[i].place(x = self.middleXY[p][0], y = self.middleXY[p][1]) defend(self): #电脑出完牌至玩家出牌的切换self.iswait = False self.status['text'] = ' 请出一张牌。'#游戏窗口创建,并建立游戏菜单项classGame:def__init__(self): #建立根窗口,设置self.root = Tk() self.root.title("红心大战") self.root.geometry('+150+10') self.root.resizable(False, False) #播放背景音乐self.s = winsound.PlaySound('m1.wav', winsound.SND_ASYNC+winsound.SND_LOOP) #建立菜单m = Menu(self.root) self.root['menu'] = m gamemenu = Menu(m) helpmenu = Menu(m) m.add_cascade(label = '游戏',menu = gamemenu) m.add_cascade(label = '帮助',menu = helpmenu) gamemenu.add_command(label="新游戏 F2",command = self.gameEvent1) gamemenu.add_separator() gamemenu.add_command(label="得分... F4",command = self.gameEvent2) gamemenu.add_command(label="选项... F5",command = self.gameEvent4) self.v = IntVar() self.v.set(1) gamemenu.add_checkbutton(label="背景音乐",variable = self.v, command = self.gameEvent3) gamemenu.add_separator() gamemenu.add_command(label="退出",command = self.cancel) helpmenu.add_command(label="规则介绍... F1",command = self.helpEvent1) helpmenu.add_command(label="名言...",command = self.helpEvent2) self.root.bind('<F2>',self.gameEvent1) self.root.bind('<F4>',self.gameEvent2) self.root.bind('<F5>',self.gameEvent4) self.root.bind('<F1>',self.helpEvent1) self.root.protocol("WM_DELETE_WINDOW",self.cancel) #导入背景图片bgimg = PhotoImage(file = 'bg.gif') #创建主界面self.frame = GameFrame(self,bgimg) #主循环self.root.mainloop() defgameEvent1(self,event=None): #游戏菜单项”新游戏“flag = askokcancel('新游戏','你确定要放弃当前游戏开始新游戏么?') ifflag:self.frame.newGame() defgameEvent2(self,event=None): #游戏菜单项”得分“self.frame.showScoreDialog() defgameEvent3(self): #游戏菜单项”背景音乐“ifself.v.get() == 0: winsound.PlaySound(self.s,winsound.SND_PURGE) else:self.s = winsound.PlaySound('m1.wav', winsound.SND_ASYNC+winsound.SND_LOOP) defgameEvent4(self,event=None): #游戏菜单项”选项“optionDialog = OptionDialog(self.root,self.frame.speed / 100- 1) ifnotoptionDialog.isCancel:self.frame.speed = 100+ optionDialog.v.get() * 100defhelpEvent1(self,event=None): #帮助菜单项”规则介绍“HelpDialog(self.root) defhelpEvent2(self): #帮助菜单项”名言“SayDialog(self.root) defcancel(self): #关闭音乐,退出游戏winsound.PlaySound(self.s,winsound.SND_PURGE) self.root.destroy() defmain(): Game() if__name__== '__main__': main()
总结
科技日新月异,台式“大砖头”转眼变成便携平板,当年偷偷“摸鱼”玩这些内置游戏的人
或成为职场新人,或为人父母,都开始了各自的新阶段,这些游戏也完成自己的使命!
近期一部《19层》正风靡全网,播出后就获得了极佳的反响。网友们对它的热衷度也在不断攀升,各大论坛上也都是关于它内容,网友们纷纷展开热烈的讨论,不少人都想了解其中的具体内容和剧情细节。今天小编将详细介绍一下关于《19层》第2集分集剧情等方面的内容,以让您更好地了详情>>
许多观众都期待已久的《今天也很可爱的狗》于近日才刚刚播出,但在宣传阶段就已经引起了广泛的关注和热度。现在剧集已经正式播出,观众们对它的评价也一直不减,特别是关于《今天也很可爱的狗》第1-14全集剧情(含结局)是最近大家讨论的重点。《今天也很可爱的狗》改编自同名详情>>
随着《前男友成了我上司》的播出热度不断攀升,相信它将会成为近期最值得一看的佳作,也将成为大众话题的重要中心。《前男友成了我上司》第21集分集剧情介绍就是最近讨论的最多的。以下就是小编为大家整理的一些内容。童念带廖云丞回来,发现董秋芬。躲在沙发后面,非常惊讶,问详情>>
最近一部备受期待的影视作品出现在观众们的视线里,叫做《前男友成了我上司》它在宣传阶段就受到了许多关注和好评,让人们充满期待,而在开播后也一直没有让观众失望。尤其是近期,人们对《前男友成了我上司》第20集分集剧情介绍一直非常感兴趣,想要了解更多相关情报。廖云丞过详情>>
正在热播的《花青歌》剧情中的反转与曲折让人永远无法预测后续的情节发展,这也成为了该剧最吸引观众的特点之一。无论是从颜值、演技还是剧情方面,该剧都能快速、准确地吸引人们的眼球。今天我们特别为观众们对于《花青歌》第12集分集剧情故事产生的疑惑做一些个人的解答。柳湘详情>>
最近热播的一部名为《前男友成了我上司》的影视剧成为了观众瞩目的焦点,不少剧迷在剧集宣发阶段就开始热议。随着剧集播出,它的热度不断攀升,充分满足了观众们的期待。尤其是关于《前男友成了我上司》第19集分集剧情介绍,一直以来都备受关注和讨论,想要深入了解更多的细节。详情>>
由于最近《19层》热播,顿时之间就成为了广大网友们讨论的话题,不少网友就对《19层》播出的剧情在各大社交媒体中发表自己的看法,特别是关于《19层》第1集分集剧情,今天小编也为大家整理了一些。春雨这个从小就和父亲有隔阂的孩子意外地与其他人一起进入了一个名为“19详情>>
最近上映的《流光引》可谓引起轰动,一经播出就吸引了大量观众们的关注,看过这部剧的人,也是根本停不下来,一直沉浸在剧情当中。今天小编就《流光引》演员表和大家一起来讨论讨论。《流光引》演员表张翰 饰 君北月祝绪丹 饰 韩紫晴李晓颖 饰 -姚弛 饰 轩辕离歌海铃 饰详情>>
在中国的传统节日中,腊八节是一个具有特殊意义的节日。然而,关于腊八节有一种说法,那就是腊八不能回娘家。这种说法究竟源于何处?又有什么深层的文化内涵呢?本文将为您揭示这一传统习俗背后的故事。 一、腊八不能回娘家的起源 关于腊八不能回娘详情>>
清朝的和珅可是大大的有名,那就是世界第一贪。可惜当年也曾是个孤儿,三岁丧母,九岁丧父,小时候就和弟弟何琳寄人篱下,整天看继母和别人的脸色行事,而且早期仕途不顺,曾经参加科举考试名落孙山。后来因为机缘凑巧,才与皇帝结缘,不想一步登天,从此在皇帝身边效力,后来呢,详情>>
1、将、相这两个官职最大的区别就是它们一个是文官,一个是武官。其中丞相在很多朝代都是皇帝之下的最高行政官,是名副其实的“百官之长”。2、而将军则通常是指等级非常高的武官,他们是“一军之长”,通常都要率兵打仗、守土护疆。将、相这两个职位虽然在不同的朝代都有细微的详情>>
中国作为四大文明古国唯一没有中断过的国家,历史是非常悠久的,这其中的历史事件、故事、人物和文化也是非常多,那么今天小编就为大家讲讲关于钟无艳是如何得到国王垂青的这一内容。钟无艳是如何得到国王垂青的根据《列女传》的记载,齐国宣王的妻子钟无艳(也叫钟离春或钟无盐)详情>>
背景: 中央红军从湘江战役突围后,8.6万红军仅剩不足3万人。与湘西红二六军团会合的原计划被敌人识破,在去湘西的路上布下天罗地网,正等着红军去钻口袋。红军进入湖南后截获敌人电报,知道敌人在靖县,会同,绥宁北部等地布下三、四十万重兵,情况万分详情>>