iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python Pygame实战之红心大战游戏的实现
  • 722
分享到

Python Pygame实战之红心大战游戏的实现

2024-04-02 19:04:59 722人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录导语一、 红心大战用户手册二、红心大战游戏规则三、准备中四、代码演示五、效果展示导语 还记得那些年,我们玩过的windows小游戏吗? 说起Windows自带的游戏,相信许多8

导语

还记得那些年,我们玩过的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 pypi.douban.com/simple/ +模块名 

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,背景图片
        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,"红心大战")
        if startdialog.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 * ['']
            for i in range(52):
                self.img[i] = PhotoImage(file = 'card\\%s.pgm' % (i))
            self.img[52] = PhotoImage(file = 'back.pgm')
            
            self.scorelist = []
            self.cards = []
            self.gamemode = 0
            self.speed = 100
            self.wait = self.speed
            self.isChanging = False
            self.iswait = False
            #绘制名字
            for i in range(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 * ['']
            for i in range(52):
                self.l[i] = Label(self.master,image=self.img[52],bd = -1)
            for i in range(13):
                self.l[i]['text'] = str(i)
                self.l[i].bind("<Button-1>",self.cardEvent)
            #创建中央牌
            self.ml = 4 * ['']
            for i in range(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()
    def oneGameStart(self):
        #创建Onegame对象,用来获取出牌信息
        self.onegame = OneGame()
        #获取玩家手牌,显示
        hand = self.onegame.getPlayerHand(0)
        for i in range(13):
            self.l[i]['image'] = self.img[hand[i].id]
        for i in range(4):
            for j in range(13):
                self.moveCard(i,j,0)
        #游戏模式为0,1,2时进入换牌阶段        
        if self.gamemode != 3:
            self.changeHands()
        else:
            self.onegame.changeCards([],3)
            self.isChanging = False
            self.leftCards = 13
            #进入出牌阶段,玩家前的电脑出牌
            self.playpreCards()
    def changeHands(self):
        #换牌阶段相应初始化
        self.select = []#所选的牌
        self.isChanging = True
        self.isOK = False
        s = [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'] = DISABLED
    def cardEvent(self,event):
        #牌的事件
        #获取牌的位置
        i = int(event.widget['text'])
        if not self.isChanging:
            #出牌阶段的牌事件
            #等待中不出牌
            if self.iswait:
                return
            #出不了的牌不出
            if not self.onegame.available(i):
                self.status['text'] = self.onegame.errorString
                return
            self.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 += 1
            self.leftCards -= 1
            #玩家后的电脑出牌
            self.iswait = True
            self.playlaterCards()
            self.status['text'] = ' 正在等候……'
            self.wait += 500 + 5 * self.speed
            #等待一段时间后,中央牌清空,玩家前的电脑出牌
            self.master.after(self.wait,self.playpreCards)
            self.wait = self.speed
        else:
            #换牌阶段的牌事件,弹起的落下,落下的弹起
            if not self.isOK:
                if i in self.select:
                    self.select.remove(i)
                    self.moveCard(0,i,0)
                    self.b['state'] = DISABLED
                else:
                    if len(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('<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()
    def gameEvent1(self,event=None):
        #游戏菜单项”新游戏“
        flag = askokcancel('新游戏','你确定要放弃当前游戏开始新游戏么?')
        if flag:
            self.frame.newGame()
    def gameEvent2(self,event=None):
        #游戏菜单项”得分“
        self.frame.showScoreDialog()
    def gameEvent3(self):
        #游戏菜单项”背景音乐“
        if self.v.get() == 0:
            winsound.PlaySound(self.s,winsound.SND_PURGE)
        else:
            self.s = winsound.PlaySound('m1.wav',
                                    winsound.SND_ASYNC+winsound.SND_LOOP)
    def gameEvent4(self,event=None):
        #游戏菜单项”选项“
        optionDialog = OptionDialog(self.root,self.frame.speed / 100 - 1)
        if not optionDialog.isCancel:
            self.frame.speed = 100 + optionDialog.v.get() * 100
    def helpEvent1(self,event=None):
        #帮助菜单项”规则介绍“
        HelpDialog(self.root)
    def helpEvent2(self):
        #帮助菜单项”名言“
        SayDialog(self.root)
    def cancel(self):
        #关闭音乐,退出游戏
        winsound.PlaySound(self.s,winsound.SND_PURGE)
        self.root.destroy()

       
def main():
    Game()

    
if __name__ == '__main__': 
    main()

五、效果展示

1)游戏开始

2)游戏界面

​3)左上角帮助菜单

4)游戏结束排名

到此这篇关于python Pygame实战之红心大战游戏的实现的文章就介绍到这了,更多相关Python Pygame 红心大战内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python Pygame实战之红心大战游戏的实现

本文链接: https://www.lsjlt.com/news/138596.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python Pygame实战之红心大战游戏的实现
    目录导语一、 红心大战用户手册二、红心大战游戏规则三、准备中四、代码演示五、效果展示导语 还记得那些年,我们玩过的Windows小游戏吗? 说起Windows自带的游戏,相信许多8...
    99+
    2024-04-02
  • Python如何实现红心大战游戏
    小编给大家分享一下Python如何实现红心大战游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、 红心大战用户手册打开游戏:双击hongxindazhan.p...
    99+
    2023-06-29
  • Pygame实战练习之飞机大战游戏
    导语 承载童年的纸飞机你还会叠嘛? 如果你是个80后或者90后,那你应该记得小时候玩的纸飞机。 叠好后,哈口仙气,飞出去,感觉棒棒哒。 ​ 虽然是一个极其简单的玩具,但那...
    99+
    2024-04-02
  • Python+Pygame实战之泡泡游戏的实现
    目录导语一、环境安装二、代码展示三、效果展示导语 泡泡王国 欢乐多多 咕噜噜,吹泡泡,七彩泡泡满天飘。大的好像彩气球,小的就像紫葡萄。 ​当泡泡漫天飞舞时,大朋友、小朋友都会情不自禁...
    99+
    2024-04-02
  • Python+Pygame实战之24点游戏的实现
    目录导语游戏介绍实现代码游戏效果展示导语 我第一次玩24点是初中的时候,那时候和堂弟表哥在堂妹家玩,堂妹提出玩24点游戏,堂妹比我们小三岁,可能正在上小学吧。 拿出一副扑克牌去掉大小...
    99+
    2024-04-02
  • Python+Pygame实战之吃豆豆游戏的实现
    目录导语​一、首先​二、正式开始三、效果展示导语​ ​昨晚玩起了小时候玩的游戏“吃豆豆”,但是我发现,一局游戏三条命,我根本不能吃完所有的豆豆,总是被敌人吃掉...
    99+
    2024-04-02
  • Pygame实战之迷宫游戏的实现
    目录导语正文1)效果展示2)主程序导语 哈喽!哈喽我是栗子,每日更新来啦—— “玩迷宫游戏长大的我们,欣慰地看到,下一代仍热爱着这个经典游戏。 如...
    99+
    2024-04-02
  • Python Pygame实战之打砖块游戏的实现
    目录导语开发工具环境搭建效果展示原理简介导语 想起来好久没更这个系列的文章了,周末过来补一波好了。本期我们将利用python制作一个打砖块小游戏,废话不多说,让我们愉快地开始吧~ 开...
    99+
    2024-04-02
  • Pygame实战之实现扎气球游戏
    目录导语正文一、准备中二、代码演示三、效果展示导语 ​前几天,有人私信小编: 说陪女朋友在小广场上面逛街玩儿扎气球:结果一个都没扎破,扎心了老铁。 女朋友都要离家出走了~让我给想想办...
    99+
    2024-04-02
  • Python+Pygame实战之文字剧情游戏的实现
    目录前言一、《巨龙之洞》1)小故事2)环境配置3)代码展示4)效果展示二、《太空矿工》1)小故事2)环境配置3)代码展示4)效果展示前言 哈喽!我是你们的栗子同学—&md...
    99+
    2022-12-08
    Python Pygame文字剧情游戏 Python 文字剧情游戏 Python Pygame 游戏
  • Python+Pygame实战之俄罗斯方块游戏的实现
    目录导语一、运行环境二、代码展示三、效果展示导语 俄罗斯方块,作为是一款家喻户晓的游戏,陪伴70、80甚至90后,度过无忧的儿时岁月 它上手简单能自由组合、拼接技巧也很多。 你知道么...
    99+
    2022-12-28
    Python Pygame俄罗斯方块游戏 Python 俄罗斯方块 Python Pygame 游戏
  • Python+Pygame实战之疯狂吃水果游戏的实现
    目录导语一、准备中 1)游戏玩法2)环境安装3)素材准备二、代码展示三、效果展示导语 嘿嘿!木木子今日闪现——已经给大家写了很多内容啦~ 涉及的人工...
    99+
    2024-04-02
  • 如何实现Pygame坦克大战游戏
    这篇文章将为大家详细讲解有关如何实现Pygame坦克大战游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。正文1)游戏规则:游戏过程是这样的,玩家操作坦克消灭电脑控制的坦克,并保护自己基地。基地图标是一只...
    99+
    2023-06-29
  • 基于Python+Pygame实现变异狗大战游戏
    目录前言一、准备环境 二、代码展示三、效果展示前言 只有你想不到,没有我找不到写不了的好游戏! 哈喽。我是你们的栗子同学啦~ 今天小编去了我朋友家里玩儿,看到了一个敲可爱的...
    99+
    2023-03-03
    Python Pygame变异狗游戏 Python Pygame变异狗 Python Pygame 游戏
  • Python Pygame实战之打砖块小游戏
    目录导语一、准备中1)游戏规则:2)环境安装二、开始敲代码1)配置文件2)定义一些类3)定义开始、结束界面4)定义游戏5)主函数与运行界面三、效果展示导语 嘿!前不久刚刚给大家过一款...
    99+
    2024-04-02
  • Python+Pygame实战之英文版猜字游戏的实现
    目录导语一、运行环境二、素材(图片等)三、代码展示四、效果展示导语 当下的孩子们多少会被电子产品“侵袭”,那么既然都要玩游戏,为什么不选既能玩又能收获知识的呢...
    99+
    2024-04-02
  • python实战之利用pygame实现贪吃蛇游戏(二)
    目录一、前言二、创建蛇三、创建食物四、蛇的移动五、按键感应六、整合部分七、结语一、前言 在上一篇博客中,我们实现了基本的界面搭建,这次实现一下逻辑部分。 二、创建蛇 首先,先分析一下...
    99+
    2024-04-02
  • Python Pygame实战之欢乐打地鼠游戏
    目录导语​​​一、准备中二、环境安装​三、开始敲代码1)导入模块2)不同的图片设置3)界面头标、标题等。4)音乐设置5)右侧窗口控件不同的按钮设置四、效果展示导语 闲来无事: 铲屎...
    99+
    2024-04-02
  • Python+Pygame实战之实现小蜜蜂历险记游戏
    目录导语一、运行环境二、素材(图片等)三、代码展示四、效果展示导语 亲爱的小可爱们,大家好! 欢迎来到木子的游戏编程空间 经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大...
    99+
    2024-04-02
  • Pygame实战之实现经典外星人游戏
    目录前言正文安装环境主要代码前言 说说外星人那些事儿.... 你以为的外星人......他们都是乘坐UFO来地球的,长的嗯哼可能比较有特色。也许长这样 害!其实可能也或许不长这样。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作