台式电脑

电脑上的红心大战怎么样(曾经风靡全国的游戏,终于复活了,你玩过嘛?(红心纸牌大战))

导语

还记得那些年,我们玩过的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模块、部分

自带模块直接导入不需要安装。(如果需要安装软件、激活码或者遇到问题的话可以私信我

哈!)模块安装:pipinstall-ihttps://pypi.douban.com/simple/+模块名

2)背景选择

最原始的绿色背景。(仅展示背景,其余图片比较多不展示)参考为最上面第二个图片

曾经风靡全国的游戏,终于复活了,你玩过嘛?(红心纸牌大战)

?

四、代码演示

?仅展示主程序源码。每行代码都有注释所以直接展示!全部的源码见文末!

fromTkinterimport*fromtkFontimport*importwinsoundfromtkMessageBoximport*frominnerimport*fromdialogimport*#游戏主界面创建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*['']foriinrange(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.speedself.isChanging=Falseself.iswait=False#绘制名字foriinrange(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*['']foriinrange(52):self.l[i]=Label(self.master,image=self.img[52],bd=-1)foriinrange(13):self.l[i]['text']=str(i)self.l[i].bind("",self.cardEvent)#创建中央牌self.ml=4*['']foriinrange(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)foriinrange(13):self.l[i]['image']=self.img[hand[i].id]foriinrange(4):forjinrange(13):self.moveCard(i,j,0)#游戏模式为0,1,2时进入换牌阶段ifself.gamemode!=3:self.changeHands()else:self.onegame.changeCards([],3)self.isChanging=Falseself.leftCards=13#进入出牌阶段,玩家前的电脑出牌self.playpreCards()defchangeHands(self):#换牌阶段相应初始化self.select=[]#所选的牌self.isChanging=Trueself.isOK=Falses=[1,3,2]self.status['text']='请选三张牌传给'+self.name[s[self.gamemode]]+'。'#提示按钮显示self.b['text']=self.gamemodetext[self.gamemode]self.b.place(x=460,y=400)self.b['state']=DISABLEDdefcardEvent(self,event):#牌的事件#获取牌的位置i=int(event.widget['text'])ifnotself.isChanging:#出牌阶段的牌事件#等待中不出牌ifself.iswait:return#出不了的牌不出ifnotself.onegame.available(i):self.status['text']=self.onegame.errorStringreturnself.onegame.playCard(i)#所出牌显示到中央event.widget.place_forget()self.ml[self.turn]['image']=event.widget['image']self.ml[self.turn].place(x=self.middleXY[0][0],y=self.middleXY[0][1])self.turn+=1self.leftCards-=1#玩家后的电脑出牌self.iswait=Trueself.playlaterCards()self.status['text']='正在等候……'self.wait+=500+5*self.speed#等待一段时间后,中央牌清空,玩家前的电脑出牌self.master.after(self.wait,self.playpreCards)self.wait=self.speedelse:#换牌阶段的牌事件,弹起的落下,落下的弹起ifnotself.isOK:ifiinself.select:self.select.remove(i)self.moveCard(0,i,0)self.b['state']=DISABLEDelse:iflen(self.select)< 3: self.select.append(i) self.moveCard(0,i,1) if len(self.select) == 3: self.b['state'] = NORMAL def buttonEvent(self): #提示按钮事件 if not self.isOK: #换牌前获取电脑换的牌进行交换 self.select = self.onegame.changeCards(self.select,self.gamemode) hand = self.onegame.getPlayerHand(0) for i in range(13): self.l[i]['image'] = self.img[hand[i].id] self.moveCard(0,i,0) for i in self.select: self.moveCard(0,i,1) self.status['text'] = ' 请按"确定"接受传来的牌。' self.b['text'] = '确定' self.isOK = True else: #换牌后进行确认,进入出牌阶段,玩家前的电脑出牌 for i in self.select: self.moveCard(0,i,0) self.b.place_forget() self.isChanging = False self.leftCards = 13 self.playpreCards() def playpreCards(self): if self.leftCards == 0: #牌出完了进行统分,显示得分对话框 for i in range(4): hand = self.onegame.p[i].scoreHand for j in range(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) if len(self.scorelist) != 1: for i in range(4): self.scorelist[-1][i] += self.scorelist[-2][i] self.status['text'] = ' 得分' scoredialog = self.showScoreDialog() #得分确认后初始化,开始新一轮游戏 if scoredialog.isover: self.scorelist = [] self.gamemode = 0 else: self.gamemode = (self.gamemode + 1) % 4 for i in range(52): self.l[i].place_forget() self.l[i]['image'] = self.img[52] for i in range(4): self.ml[i].place_forget() self.oneGameStart() else: #获取玩家之前的电脑出牌,进行显示 for i in range(4): self.ml[i].place_forget() self.turn = 0 preCards = self.onegame.preCard if len(preCards) == 0: self.end() else: for i in range(len(preCards)): p,j = preCards[i][0],preCards[i][1] self.cards.append([self.turn,p,j]) self.master.after(self.wait,self.showMiddleCard) if p == 3: self.master.after(self.wait,self.end) self.wait = self.speed else: self.wait += self.speed self.turn += 1 def playlaterCards(self): #获取玩家之后的电脑出牌,进行显示 laterCards = self.onegame.laterCard for i in range(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 += 1 def moveCard(self,i,j,state):#i,玩家;j,第几张牌;state,弹起还是放下 #牌的移动 self.l[i*13+j].place_forget() x0 = self.handXY[i][0] + self.handXY[i][2]*j*20 y0 = self.handXY[i][1] + self.handXY[i][3]*j*20 self.l[i*13+j].place(x = x0,y = y0 - state * 20) def newGame(self): #新游戏 self.scorelist = [] self.gamemode = 0 for i in range(52): self.l[i].place_forget() self.l[i]['image'] = self.img[52] for i in range(4): self.ml[i].place_forget() self.oneGameStart() def showScoreDialog(self): #显示分数对话框 scoredialog = ScoreDialog(self.master,self.scorelist,self.name) return scoredialog def showMiddleCard(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]) def end(self): #电脑出完牌至玩家出牌的切换 self.iswait = False self.status['text'] = ' 请出一张牌。'#游戏窗口创建,并建立游戏菜单项class Game: 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('',self.gameEvent1)self.root.bind('',self.gameEvent2)self.root.bind('',self.gameEvent4)self.root.bind('',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()

?五、效果展示

1)游戏开始

曾经风靡全国的游戏,终于复活了,你玩过嘛?(红心纸牌大战)

?

2)游戏界面

曾经风靡全国的游戏,终于复活了,你玩过嘛?(红心纸牌大战)

?

?3)左上角帮助菜单

曾经风靡全国的游戏,终于复活了,你玩过嘛?(红心纸牌大战)

?

4)游戏结束排名

曾经风靡全国的游戏,终于复活了,你玩过嘛?(红心纸牌大战)

?

总结

科技日新月异,台式“大砖头”转眼变成便携平板,当年偷偷“摸鱼”玩这些内置游戏的人

或成为职场新人,或为人父母,都开始了各自的新阶段,这些游戏也完成自己的使命!

少年时期的游戏你最喜欢哪一款?话说之前写过多期游戏了,需要源码的记得找我拿!

完整的素材、安装环境、源码等私信小编06即可免费啦~

文章汇总——

项目1.0Python—2021|已有文章汇总|持续更新,直接看这篇就够了

(更多内容+源码都在文章汇总哦!!欢迎阅读~)

曾经风靡全国的游戏,终于复活了,你玩过嘛?(红心纸牌大战)

?

?

相关新闻

返回顶部