我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python如何实现红心大战游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python如何实现红心大战游戏

小编给大家分享一下Python如何实现红心大战游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Python如何实现红心大战游戏

一、 红心大战用户手册

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

开始游戏:键入玩家姓名,创建新ID,点确认进入游戏。

游戏流程:

1)换牌:选择三张手牌,点击上方按钮完成交换;

2)出牌:轮到玩家出牌时,选择手牌单击便可打出。(具体出牌规则详见附录)注:当此时机不能打出此牌时,下方提示栏会显示无法打出原因。

统分阶段:一轮游戏过后,会弹出得分表,显示玩家和三名电脑每轮积分和总积分,并显示玩家当前名次。

菜单栏:

1)游戏栏:新游戏(F2):单击开启新游戏。得分(F4):单击显示得分表。背景音乐:单击切换音乐开关。选项(F5):单击修改电脑出牌速度。退出:单击退出游戏。

2)帮助栏:规则介绍(F1):单击显示简要规则和获胜条件。名言:单击弹出一则名言。

背景音乐:更换:可用自己的wav格式音乐重命名为‘m1.wav’替换程序目录下的同名文件。

二、红心大战游戏规则

在玩游戏前,需要决定庄家。在电脑中,庄家坐南。

拿到一手牌(共计13张)后,庄家首先须选出三张牌传给其他对手。第一局把牌传给左手边的玩家;第二局把牌传给右手边的玩家;第三局把牌传给坐在对面的玩家;第四局不传牌,依此类推。接到庄家的传牌后,也需要任意传回给庄家三张牌。在电脑中,如要选牌,单击相应牌张即可。如要取消选定的牌,请再次单击。

抓有梅花2 的玩家必须首先出梅花2,谓首攻。

然后按顺时针方向出牌。每位玩家依次必须跟同花色牌。如果已经没有与发牌花色相同的牌,则可以出任何一张牌。唯一例外是不能在第一圈牌中出红桃或黑桃Q(通常称为“猪”)。注意:出的同一花色牌中最大的牌会赢取这一圈,赢牌的玩家在下一圈中先出牌。只有前面出过红桃以后,才可以拿红桃领出(除非手中只剩下红桃一种花色的牌张)。

每一轮游戏结束时,每张红心计1 分,“黑桃皇后(猪)”计13 分。游戏将持续到有人得100 分或更多分或者庄家退出游戏时结束。如果在一轮牌中赢得了所有的红心和“黑桃皇后”(称之为“全收”),则“全收”者得零分,其余玩家每人得26 分。该游戏的得分越低越好。

三、准备中

1)环境安装

环境安装 本文用到的运行环境:Python3.7、Pycharm社区版2020、tkinter模块、部分自带模块直接导入不需要安装。

模块安装:

pip install -i pypi.douban.com/simple/ +模块名 

2)背景选择最原始的绿色背景。(仅展示背景,其余图片比较多不展示)

Python如何实现红心大战游戏

四、代码演示

仅展示主程序源码。每行代码都有注释所以直接展示!

from Tkinter import *from tkFont import *import winsoundfrom 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)游戏开始

Python如何实现红心大战游戏

2)游戏界面

Python如何实现红心大战游戏

3)左上角帮助菜单

Python如何实现红心大战游戏

4)游戏结束排名

Python如何实现红心大战游戏

以上是“Python如何实现红心大战游戏”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python如何实现红心大战游戏

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

下载Word文档

猜你喜欢

Python如何实现红心大战游戏

小编给大家分享一下Python如何实现红心大战游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、 红心大战用户手册1.打开游戏:双击hongxindazhan
2023-06-29

如何利用Python实现星空大战游戏

小编给大家分享一下如何利用Python实现星空大战游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一.游戏画面二.游戏结束画面三.游戏素材四.游戏代码星空飞碟大
2023-06-29

如何实现Pygame坦克大战游戏

这篇文章将为大家详细讲解有关如何实现Pygame坦克大战游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。正文1)游戏规则:游戏过程是这样的,玩家操作坦克消灭电脑控制的坦克,并保护自己基地。基地图标是一只
2023-06-29

python如何实现双人版坦克大战游戏

本篇内容主要讲解“python如何实现双人版坦克大战游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python如何实现双人版坦克大战游戏”吧!游戏介绍:双人版的《坦克大战》的基本规则是玩家消
2023-06-22

Win8.1系统怎么玩扫雷、纸牌、红心大战等游戏?

不少的朋友开始使用Windows8/8.1时却发现自己以前经常在win7/XP中自带的休闲小游戏却不见了。很想玩怎么办,跟着我一起来吧! 1、打开系统自带的应用商店2、在应用商店搜索中输入Microsoft Minesweeper(扫雷)3
2022-06-04

Java如何实现年兽大作战游戏

这期内容当中小编将会给大家带来有关Java如何实现年兽大作战游戏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言春节要到了,看惯了前端各种小游戏,确实做得很好,很精致。但是我也要为后端程序员稍微做一点贡
2023-06-26

基于Python+Pygame如何实现变异狗大战游戏

这篇文章主要介绍了基于Python+Pygame如何实现变异狗大战游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Python+Pygame如何实现变异狗大战游戏文章都会有所收获,下面我们一起来看看吧。一
2023-07-05

java如何实现飞机大战小游戏

本篇内容介绍了“java如何实现飞机大战小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MyPanel类package P;impor
2023-07-01

基于JS如何实现飞机大战游戏

今天小编给大家分享一下基于JS如何实现飞机大战游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。演示技术栈(function
2023-07-02

怎么用Python实现小游戏飞机大战

本篇内容介绍了“怎么用Python实现小游戏飞机大战”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、环境安装本文是写的游戏代码,基于Pyg
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录