返回顶部
首页 > 资讯 > 精选 >pygame如何实现井字棋的逻辑优化
  • 212
分享到

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

2023-06-14 23:06:38 212人浏览 八月长安
摘要

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

小编给大家分享一下pygame如何实现井字棋的逻辑优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

渲染问题

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

得,改吧。

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

# 表示九个格子rect = [0]*9rect_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
首先,我们将后面的两个变量封装成一个元组,从而赋值给等号前面的部分;
而前面为两个变量,所以我们还需要进行解封装,也就是将一个元组拆分成一个个的变量。

当时记录的笔记

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

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

single = width/3 - 1

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

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

bg_color = (0, 0, 0), 黑色。
我们还有个draw.rect方法,传入screen,(255, 255, 255),rect对象,我们就可以显示一个白色的矩形了。
因为宽高小了一点,所以我们就能看到很棒的边界(比我自己画的好多了)

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

当前的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 pygameclass 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(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如何实现井字棋的逻辑优化”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: pygame如何实现井字棋的逻辑优化

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

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

猜你喜欢
  • pygame如何实现井字棋的逻辑优化
    小编给大家分享一下pygame如何实现井字棋的逻辑优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!渲染问题翻车了,之前的逻辑是将九宫格和背景颜色写死,而且之前都...
    99+
    2023-06-14
  • pygame实现井字棋之第三步逻辑优化
    一、前言 先说一下本期的目标。 首先我们在判断出输赢、平局的时候,只有一个控制台输出,很明显不符合我们游戏的排面(doge 另外,之前的逻辑有一个漏洞,就是玩家一定是先手(就是第一个下棋的人,这个也需要修改)。 还有...
    99+
    2022-06-02
    pygame井字棋游戏 python pygame python小游戏
  • pygame如何实现井字棋的逻辑思路
    这篇文章主要介绍了pygame如何实现井字棋的逻辑思路,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言这次我们来实现基本的逻辑,比如判断输赢、玩家和电脑分别下棋的逻辑。...
    99+
    2023-06-14
  • pygame实现井字棋之第二步逻辑实现
    一、前言 我们在上一篇博客中实现了九宫格的绘制,为我们打下了基础。 这次我们来实现基本的逻辑,比如判断输赢、玩家和电脑分别下棋的逻辑。 二、下棋 2.1 玩家 我们之前在Lattice类中,有一个stats变量来表示...
    99+
    2022-06-02
    pygame井字棋游戏 python小游戏 python pygame
  • pygame如何实现井字棋之第一步绘制九宫格
    小编给大家分享一下pygame如何实现井字棋之第一步绘制九宫格,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的五大特点是什么python的五大特点:1...
    99+
    2023-06-14
  • pygame实现井字棋之第一步绘制九宫格
    一、前言 这次,自己尝试使用pygame模块实现一个九宫格游戏。 目标:形成一个界面,将界面分割成9个,然后对于没有被占领的方框,我们可以用鼠标点击进行占领。 游戏规则就不用说了,至于套路,自己百度一下吧。 这里的人...
    99+
    2022-06-02
    pygame井字棋游戏 python pygame python小游戏
  • python实现简单的井字棋
    本文实例为大家分享了python实现简单的井字棋的具体代码,供大家参考,具体内容如下 使用python实现井字棋游戏,没有具体算法,只是用随机下棋简单实现: import random board = [['+'...
    99+
    2022-06-02
    python 井字棋
  • Typescript井字棋的项目实现
    目录单元格点击切换玩家使用枚举游戏判赢封装判赢函数判断平局展示获胜信息重新开始游戏单元格点击 效果:点击棋盘的任意单元格,单元格显示×(默认)思路:1.获取到所有的单元格...
    99+
    2022-11-13
    Typescript 井字棋
  • C语言如何实现井字棋游戏
    这篇文章主要介绍了C语言如何实现井字棋游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用...
    99+
    2023-06-14
  • C语言如何开发实现井字棋
    这篇文章主要为大家展示了“C语言如何开发实现井字棋”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何开发实现井字棋”这篇文章吧。总体思路井字棋棋盘我们总体可以当成一个二维数组来操作,我们分...
    99+
    2023-06-25
  • 如何通过C语言实现井字棋游戏
    今天就跟大家聊聊有关如何通过C语言实现井字棋游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏...
    99+
    2023-06-22
  • 微信小程序如何实现井字棋游戏
    这篇文章主要介绍了微信小程序如何实现井字棋游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序如何实现井字棋游戏文章都会有所收获,下面我们一起来看看吧。效果图.wxml<view cla...
    99+
    2023-06-30
  • python实现简单的井字棋小游戏
    Python做三子棋游戏,这个是我刚开始了解做Python小游戏的时候第一个项目,因为简单好入手,实现它的过程是我开始摸索Python的GUI界面的入门之路。这个设计也都是按照自己对...
    99+
    2024-04-02
  • React中井字棋游戏的实现示例
    目录需求分析实现分析涉及的组件涉及的状态编码实现项目初始化定义各个组件的props/stateSquare组件propsBoard组件propsGame组件state各组件代码Squ...
    99+
    2022-11-13
    React 井字棋游戏
  • 纯CSS3实现井字棋游戏的示例
    这篇文章给大家分享的是有关纯CSS3实现井字棋游戏的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。运行效果:html<div class="tic-tac-toe">...
    99+
    2023-06-08
  • C语言实现简单的井字棋游戏
    本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下 1.什么是井字棋 井字棋相信大部分人都玩过 规则:双方轮流放子,当某一方的三个子连成一线(行,列,对...
    99+
    2024-04-02
  • python实现带界面的井字棋小游戏
    目录1、首先安装tkinter2、初始化窗口3、定义按钮4、检查获胜的条件今天我们用python+tkinter安装带界面的井字棋,效果如图所示。 Tkinter 是 Python...
    99+
    2024-04-02
  • python实现人机对战的井字棋游戏
    本文实例为大家分享了python实现人机对战井字棋的具体代码,供大家参考,具体内容如下 游戏简介:在九宫格内进行,如果一方抢先于另一方向(横、竖、斜)连成3子,则获得胜利。游戏中输入...
    99+
    2024-04-02
  • 基于JS实现经典的井字棋游戏
    目录先看成品游戏初始化界面:玩家获胜AI电脑获胜思路生成棋盘重新开始玩家落子电脑落子代码HTMLCSSjs井字棋作为我们在上学时代必玩的一款连珠游戏,你知道如何做到先手必然不会输吗?...
    99+
    2024-04-02
  • C语言开发实现井字棋及电脑落子优化示例详解
    目录总体思路项目的创建测试结果电脑获胜玩家获胜平局各函数代码的实现初始化二维数组打印棋盘玩家下棋电脑下棋判断电脑是否有位置可以获胜判断玩家是否有位置获胜判断输赢判断和棋声明代码测试代...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作