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

pygame实现井字棋之第三步逻辑优化

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

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

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

看不清楚,换张图片

免费获取短信验证码

pygame实现井字棋之第三步逻辑优化

一、前言

先说一下本期的目标。
首先我们在判断出输赢、平局的时候,只有一个控制台输出,很明显不符合我们游戏的排面(doge
另外,之前的逻辑有一个漏洞,就是玩家一定是先手(就是第一个下棋的人,这个也需要修改)。
还有,有一个短暂的弹窗显示到谁了,游戏的可玩性就会有提高。
最后一个就是,如果点击位置有问题,我们需要显示。

二、渲染问题

翻车了,之前的逻辑是将九宫格背景颜色写死,而且之前都是直接在之前的基础上渲染,但是我们的弹窗需要在结束后及时撤下来,所以需要我们不断的重新渲染界面。

得,改吧。

首先,我们就不需要使用draw.rect方法创建矩形了,而是使用另外一个pygame.Rect函数。
同时,为了省去九行基本相同的代码,我创建了一个元组来存储。
格子创建最新版:


# 表示九个格子
rect = [0]*9
rect_wh = [
    (1,1), (single+3,1), (single*2+5,1), 
    (1,single+3), (single+3,single+3), (single*2+5,single+3),
    (1,single*2+5), (single+3,single*2+5), (single*2+5,single*2+5)
    ]
for i in range(len(rect)):
    rect[i] = pygame.Rect(*rect_wh[i],single,single)
    rect[i] = Lattice(rect[i],screen)

Rect函数:
传入x、y坐标以及高度宽度,就能创建一个rect对象。
这里需要解释的是*rect_wh[i],后面的部分就是在元组列表中找到一个指定的元素,而星号的作用是将元组进行解封装。

三、封装和解封装

a, b = 1, 2
首先,我们将后面的两个变量封装成一个元组,从而赋值给等号前面的部分;
而前面为两个变量,所以我们还需要进行解封装,也就是将一个元组拆分成一个个的变量。

当时记录的笔记:

在这里插入图片描述

回到之前的格子问题,还有一个细节就是我们应该怎么显示格子周围的分割线,之前采用的是绘制矩形时自带的,现在因为刷新的问题,不能再使用了(不然每刷新一次创建9个矩形并绘制,这谁顶得住)。
我的办法是:减小了single的大小:


single = width/3 - 1

应该会注意到的,元组列表中我修改了(x,y)的值,这样我们就能绘制出这样的一个图形:

在这里插入图片描述

(原创不易,整这个眼睛都快要瞎了,还是没有很完美 -_-||)
bg_color = (0, 0, 0), 黑色。
我们还有个draw.rect方法,传入screen,(255, 255, 255),rect对象,我们就可以显示一个白色的矩形了。
因为宽高小了一点,所以我们就能看到很棒的边界(比我自己画的好多了)

在这里插入图片描述

(啊,为什么是黄色的啊,因为我把bg_color改了……,问题不大)

当前的update方法:


def update():
    screen.fill((255,228,181))
    for i in rect:
        pygame.draw.rect(screen,(255, 255, 255),i.rect)
        i.draw()

四、弹窗显示

添加的弹窗:
输赢、平局弹窗,3s后退出程序;
哪方下棋、下棋的位置有问题,0.3s后自己退出。

看过我大战外星人系列应该知道,有一个很大的遗憾就是给定的button类有一点专用,导致我后来只能自己添加按钮类。
这次,我自己写的弹窗类的适用性会更高一些。

popup.py


"""在游戏过程中,添加各种弹窗"""
import pygame
class Popup():
    def __init__(self, screen,msg):
        self.msg = msg
        self.screen = screen
        self.bg_color = (0, 0, 0)
        self.text_color = (230, 230, 230)
        self.font = pygame.font.SysFont(None,48)
        self.msg_image = self.font.render(msg,True,self.text_color,self.bg_color)
        self.msg_rect = self.msg_image.get_rect()
        self.screen_rect = self.screen.get_rect()
        self.msg_rect.center = self.screen_rect.center
        self.screen.blit(self.msg_image,self.msg_rect)

传入一个要显示的信息,然后就可以渲染到屏幕上了。
方法都是之前的,看这篇博客。
(所以适用性高是不是因为基本上没什么内容……)

第一种情况(以平局为例):


Popup(screen,"draw")
pygame.display.flip()
time.sleep(3)
exit()

调用类(调用一次就完了,不需要再使用实例)
显示屏幕
挂起三秒
退出程序

第二种情况下,我选择"computer choice”作为案例,也就是轮到电脑操作:


Popup(class="lazy" data-srceeen,"computer choice”)
pygame.display.filp()
time.sleep(0.3)

但这样,弹窗是不会自己消失的,所以我们还需要在后面跟一个update方法。

哦对了,还有一个没有讲怎么实现

五、实现判断点击是否有效


elif event.type == pygame.MOUSEBUTTONDOWN:
            mouse_x, mouse_y = pygame.mouse.get_pos()
            # 判断玩家是否点击成功
            success = 0
            for i in rect:
                if  not i.stats and i.rect.collidepoint(mouse_x,mouse_y):
                	# 如果点击有效,将变量置为1

            if not success:
                update(0.3,"you can't choose here!")

六、update优化

看了一下,基本上只有两种情况,一个是正常的update,另一个是需要跟弹窗和延时。


def update(time_sleep=0,msg=""):
    screen.fill((255,228,181))
    for i in rect:
        pygame.draw.rect(screen,(255, 255, 255),i.rect)
        i.draw()
    if msg:
        Popup(screen,msg)
    pygame.display.flip()
    if time_sleep:
        time.sleep(time_sleep)

对于正常的刷新,只需要调用update(),如果是需要弹窗和延时的,就自己加变量来处理。

主循环部分:


while not judge:
    update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            mouse_x, mouse_y = pygame.mouse.get_pos()
            # 判断玩家是否点击成功
            success = 0
            for i in rect:
                # 确定玩家下了一步
                if  not i.stats and i.rect.collidepoint(mouse_x,mouse_y):
                    success = 1
                    # 玩家下棋
                    i.stats = -1
                    update()
                    win_or_lose()
                    # 电脑下棋
                    update(0.3,"Computer choice!")
                    computer()
                    update()
                    win_or_lose()
                    update(0.3,"your choice!")

            if not success:
                update(0.3,"you can't choose here!")

computer函数部分:


def computer():
    """电脑的回合,随机生成一个位置"""
    global judge
    random_num = [i for i in range(len(rect)) if not rect[i].stats]
    # 没位子下了,平局
    if not random_num:
        update(3,"draw")
        exit()
    rect[random.choice(random_num)].stats = 1

判断输赢部分:


def win_or_lose():
    global judge
    stats1 = [i for i in range(len(rect)) if rect[i].stats == 1]
    stats2 = [i for i in range(len(rect)) if rect[i].stats == -1]
    win_list = [
        [0, 1, 2], [3, 4, 5], [6, 7, 8],
        [0, 3, 6], [1, 4, 7], [2, 5, 8],
        [0, 4, 8], [2, 4, 6]
    ]
    for i in win_list:
        if i == [j for j in i if j in stats1]:
            update(3,"Computer win!")
            exit()
        elif i == [j for j in i if j in stats2]:
            update(3,"You win!")
            exit()

七、先手问题

这个,还是交给随机数。
使用random.randint(0,1)产生一个0/1,来判断先手,
如果先手是电脑,使用(0,8)选择一个将其stats置为1
代码:


def first_hand():
    """判断先手,如果随机数为1,则电脑先手"""
    x = random.randint(0,1)
    if x:
        x = random.randint(0,8)
        rect[x].stats = 1

循环开始前调用一下就行了。

八、结语

整体的游戏就实现了,很简单的一个,却能加深对pygame模块的使用。

往期博客:
pygame实现井字棋——1.绘制九宫格
pygame实现井字棋——2.逻辑实现

到此这篇关于pygame实现井字棋之第三步逻辑优化的文章就介绍到这了,更多相关pygame井字棋游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

pygame实现井字棋之第三步逻辑优化

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

下载Word文档

猜你喜欢

pygame实现井字棋之第三步逻辑优化

一、前言 先说一下本期的目标。 首先我们在判断出输赢、平局的时候,只有一个控制台输出,很明显不符合我们游戏的排面(doge 另外,之前的逻辑有一个漏洞,就是玩家一定是先手(就是第一个下棋的人,这个也需要修改)。 还有,有一个短暂的弹窗显示到
2022-06-02

pygame实现井字棋之第二步逻辑实现

一、前言 我们在上一篇博客中实现了九宫格的绘制,为我们打下了基础。 这次我们来实现基本的逻辑,比如判断输赢、玩家和电脑分别下棋的逻辑。 二、下棋 2.1 玩家 我们之前在Lattice类中,有一个stats变量来表示格子的状态,# 0表示初
2022-06-02

pygame如何实现井字棋的逻辑优化

小编给大家分享一下pygame如何实现井字棋的逻辑优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!渲染问题翻车了,之前的逻辑是将九宫格和背景颜色写死,而且之前都
2023-06-14

pygame如何实现井字棋的逻辑思路

这篇文章主要介绍了pygame如何实现井字棋的逻辑思路,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言这次我们来实现基本的逻辑,比如判断输赢、玩家和电脑分别下棋的逻辑。
2023-06-14

pygame实现井字棋之第一步绘制九宫格

一、前言 这次,自己尝试使用pygame模块实现一个九宫格游戏。 目标:形成一个界面,将界面分割成9个,然后对于没有被占领的方框,我们可以用鼠标点击进行占领。 游戏规则就不用说了,至于套路,自己百度一下吧。 这里的人机采用随机数模式,因为实
2022-06-02

pygame如何实现井字棋之第一步绘制九宫格

小编给大家分享一下pygame如何实现井字棋之第一步绘制九宫格,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的五大特点是什么python的五大特点:1
2023-06-14

编程热搜

  • 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动态编译

目录