还记得那个时候我们玩的Windows游戏吗?

说到Windows固有的游戏,相信80、90后的很多朋友不会陌生。

在很早的那个游戏贫瘠的年代,《纸牌》、《扫雷》等游戏帮助我们在微机课上带来了许多欢

乐的时光。但在这些游戏中,有一款游戏似乎玩得懂的人,甚至知道玩法的人并不多。这款游戏

就是《红心大战》。

最近小编心血来潮仔细钻研了一下之后,发现这款游戏玩起来确实比其他的几款游戏更带感

一些。因为这款游戏的玩法简单概括就是两个字:“坑人”,而且是明着坑的那种。

那大家猜到了哈——今天跟着木木子一起开启《红心大战》纸牌小游戏吧!

正文

一、 红心大战用户手册

1.打开游戏:双击 主程序运行即可!

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)环境安装

▲环境安装 本文用到的运行环境:Py、Pycharm社区版2020、tkinter模块、部分

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

哈!) 模块安装:pip install -i +模块名

2)背景选择

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

四、代码演示

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

from Tkinter import * from tkFont import * import winsound from tkMessageBox import * from inner import * from dialog import * #游戏主界面创建 class GameFrame: def __init__(self,game,bgimg):#game,Game类对象;bgimg,背景图片 = game.root #创建画布,绘制背景 = Canvas(,width = 1024,height = 640) .create_image(514,322,image=bgimg) .pack() #创建状态条 = Label(,text=" 欢迎参加红心大战!", bd=1,relief=SUNKEN,anchor=W) .pack(fill = X) #打开开始对话框 startdialog = StartDialog(,"红心大战") if : game.cancel() else: = ['向左传','向右传','交叉换牌'] = [;西','北','东'] = [[346.5,490,1,0],[20,135,0,1], [586.5,20,-1,0],[913,375,0,-1]] XY = [[-20,130,SE],[0,-20,SW],[91+20,0,NW],[91,130+20,NE]] = [[466.5,330],[411,255],[466.5,180],[522,255]] = 53 * [''] for i in range(52): [i] = PhotoImage(file = 'card\\%s.pgm' % (i)) [52] = PhotoImage(file = 'back.pgm') = [] ards = [] = 0 = 100 = = False = False #绘制名字 for i in range(4): .create_text([i][0]+XY[i][0], [i][1]+XY[i][1], fill = 'white',text = [i], anchor = XY[i][2], font = Font(size=15,weight="bold")) #创建手牌 = 52 * [''] for i in range(52): [i] = Label(,image=[52],bd = -1) for i in range(13): [i]['text'] = str(i) [i].bind("<Button-1>",ardEvent) #创建中央牌 = 4 * [''] for i in range(4): [i] = Label(,image=[52],bd = -1) = Button(,width=15,command=uttonEvent) #一轮游戏开始 () def oneGameStart(self): #创建Onegame对象,用来获取出牌信息 = OneGame() #获取玩家手牌,显示 hand = .getPlayerHand(0) for i in range(13): [i]['image'] = [hand[i].id] for i in range(4): for j in range(13): (i,j,0) #游戏模式为0,1,2时进入换牌阶段 if != 3: hangeHands() else: .changeCards([],3) = False eftCards = 13 #进入出牌阶段,玩家前的电脑出牌 () def changeHands(self): #换牌阶段相应初始化 = []#所选的牌 = True = False s = [1,3,2] ['text'] = ' 请选三张牌传给'+[s[]]+'。' #提示按钮显示 ['text'] = [] .place(x = 460,y = 400) ['state'] = DISABLED def cardEvent(self,event): #牌的事件 #获取牌的位置 i = in['text']) if not : #出牌阶段的牌事件 #等待中不出牌 if : return #出不了的牌不出 if not .available(i): ['text'] = .errorString return .playCard(i) #所出牌显示到中央 event.widget.place_forget() []['image'] = event.widget['image'] [].place(x = [0][0],y = [0][1]) += 1 eftCards -= 1 #玩家后的电脑出牌 = True () ['text'] = ' 正在等候……' += 500 + 5 * #等待一段时间后,中央牌清空,玩家前的电脑出牌 .after(,) = else: #换牌阶段的牌事件,弹起的落下,落下的弹起 if not : if i in : .remove(i) (0,i,0) ['state'] = DISABLED else: if len() < 3: .append(i) (0,i,1) if len() == 3: ['state'] = NORMAL def buttonEvent(self): #提示按钮事件 if not : #换牌前获取电脑换的牌进行交换 = .changeCards(,) hand = .getPlayerHand(0) for i in range(13): [i]['image'] = [hand[i].id] (0,i,0) for i in : (0,i,1) ['text'] = ' 请按"确定"接受传来的牌。' ['text'] = '确定' = True else: #换牌后进行确认,进入出牌阶段,玩家前的电脑出牌 for i in : (0,i,0) .place_forget() = False eftCards = 13 () def playpreCards(self): if eftCards == 0: #牌出完了进行统分,显示得分对话框 for i in range(4): hand = .p[i].scoreHand for j in range(len(hand)): [i*13+j]['image'] = [hand[j].id] (i,j,0) score = .getScore() .append(score) if len() != 1: for i in range(4): [-1][i] += [-2][i] ['text'] = ' 得分' scoredialog = () #得分确认后初始化,开始新一轮游戏 if : = [] = 0 else: = ( + 1) % 4 for i in range(52): [i].place_forget() [i]['image'] = [52] for i in range(4): [i].place_forget() () else: #获取玩家之前的电脑出牌,进行显示 for i in range(4): [i].place_forget() = 0 preCards = .preCard if len(preCards) == 0: () else: for i in range(len(preCards)): p,j = preCards[i][0],preCards[i][1] ards.append([,p,j]) .after(,howMiddleCard) if p == 3: .after(,) = else: += += 1 def playlaterCards(self): #获取玩家之后的电脑出牌,进行显示 laterCards = .laterCard for i in range(len(laterCards)): p,j = laterCards[i][0],laterCards[i][1] ards.append([,p,j]) .after(,howMiddleCard) += += 1 def moveCard(self,i,j,state):#i,玩家;j,第几张牌;state,弹起还是放下 #牌的移动 [i*13+j].place_forget() x0 = [i][0] + [i][2]*j*20 y0 = [i][1] + [i][3]*j*20 [i*13+j].place(x = x0,y = y0 - state * 20) def newGame(self): #新游戏 = [] = 0 for i in range(52): [i].place_forget() [i]['image'] = [52] for i in range(4): [i].place_forget() () def showScoreDialog(self): #显示分数对话框 scoredialog = ScoreDialog(,,) return scoredialog def showMiddleCard(self): #中央牌显示 i = ards[0][0] p = ards[0][1] j = ards[0][2] del ards[0] [p*13+j].place_forget() hand = .getPlayerHand(p) [i]['image'] = [hand[j].id] [i].place(x = [p][0], y = [p][1]) def end(self): #电脑出完牌至玩家出牌的切换 = False ['text'] = ' 请出一张牌。' #游戏窗口创建,并建立游戏菜单项 class Game: def __init__(self): #建立根窗口,设置 = Tk() .title("红心大战") .geometry('+150+10') .resizable(False, False) #播放背景音乐 = win('m1.wav', win) #建立菜单 m = Menu() ['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 = ) gamemenu.add_separator() gamemenu.add_command(label="得分... F4",command = ) gamemenu.add_command(label="选项... F5",command = ) = IntVar() .set(1) gamemenu.add_checkbutton(label="背景音乐",variable = , command = ) gamemenu.add_separator() gamemenu.add_command(label="退出",command = ancel) (label="规则介绍... F1",command = ) (label="名言...",command = ) .bind('<F2>',) .bind('<F4>',) .bind('<F5>',) .bind('<F1>',) .protocol("WM_DELETE_WINDOW",ancel) #导入背景图片 bgimg = PhotoImage(file = 'bg.gif') #创建主界面 = GameFrame(self,bgimg) #主循环 .mainloop() def gameEvent1(self,event=None): #游戏菜单项”新游戏“ flag = askokcancel('新游戏','你确定要放弃当前游戏开始新游戏么?') if flag: .newGame() def gameEvent2(self,event=None): #游戏菜单项”得分“ .showScoreDialog() def gameEvent3(self): #游戏菜单项”背景音乐“ if .get() == 0: win(,winsound.SND_PURGE) else: = win('m1.wav', win) def gameEvent4(self,event=None): #游戏菜单项”选项“ optionDialog = OptionDialog(,.speed / 100 - 1) if not o: .speed = 100 + o() * 100 def helpEvent1(self,event=None): #帮助菜单项”规则介绍“ HelpDialog() def helpEvent2(self): #帮助菜单项”名言“ SayDialog() def cancel(self): #关闭音乐,退出游戏 win(,winsound.SND_PURGE) .destroy() def main(): Game() if __name__ == '__main__': main()

​五、效果展示

1)游戏开始

2)游戏界面

​3)左上角帮助菜单

4)游戏结束排名

总结

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

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

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

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

文章汇总——

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

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