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

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

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

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

这篇文章主要介绍了pygame如何实现井字棋的逻辑思路,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、前言

这次我们来实现基本的逻辑,比如判断输赢、玩家和电脑分别下棋的逻辑。

二、下棋

2.1 玩家

我们之前在Lattice类中,有一个stats变量来表示格子的状态,

# 0表示初始,1表示个人-1表示电脑self.stats = 0

所以下棋本质上就是修改这个变量。
首先,我们是用鼠标点击的方式来实现下棋的,所以应当修改事件响应部分:

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()            for i in rect:                # 确定玩家下了一步                if  not i.stats and i.rect.collidepoint(mouse_x,mouse_y):                i.stats = -1

pygame.event模块主要是负责游戏中的事件。
第一个事件表示点击界面的右上角关闭键,退出程序;
第二个事件是鼠标点击,可以使用pygame.mouse.get_pos得到点击位置。
因为之前的格子(Lattice类)中有一个rect类的实例,我们可以使用collidepoint函数,传入坐标判断是在哪个格子中。
随后我们需要判断格子有没有被占用,没被占用,那么我们就可以修改stats。

2.2 电脑

对于电脑来说,实际情况差不多,不过我们选择了随机生成的方式:

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

我们先给出了所有没有被占用的格子,使用列表解析形成列表。
如果列表为空,没位子下了,就说明平局(在每一次落子之后,都会有输赢的判断,后面再说);
反之,我们就用random.choice函数,在列表中选择一个元素(这个元素为Lattice类的实例),将其stats修改为1。

judge这个,是判断是否结束游戏的标志,初始为0。

三、输赢判断

这个可能会麻烦一点。
这里,我的想法是每一个格子都有一个下标,将所有可能赢的格子组合的下标都写出来。

 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]    ]

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

随后,我们同样使用列表解析,将所有stats为1和-1的组成两个列表:

 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]

那么问题来了,stats1、2中,可能只有部分元素在win_list中,瞬间找到了被leecode支配的恐惧。

 for i in win_list:    # 取出每一个可能获胜的条件        if i == [j for j in i if j in stats1]:            judge = 1            print("Computer win!")            exit()        elif i == [j for j in i if j in stats2]:            judge = 1            print("You win!")            exit()

我们的逻辑是对每一个获胜可能组合,分别取出每一个元素,并在stats列表中查找,如果都能找到,列表解析式的结果就一定和原先的获胜组合相同,此时我们就可以判断一方获胜。

四、一人一子

井字棋和五子棋的玩法差不多,所以必须做到在玩家下子后,电脑能下子。
(正常电脑的反应,可是比玩家快多了。

当然可以设置一个变量,0、1分别表示谁该下子了,但是我有更好的选择——在玩家下子后进行输出。

if  not i.stats and i.rect.collidepoint(mouse_x,mouse_y):# 玩家下棋i.stats = -1win_or_lose()# 电脑下棋computer()win_or_lose()

还有一个问题,就是不管哪方下子了,我们都需要对输赢进行判断。

五、显示问题

当你完成了上述操作,会发现,其实屏幕上什么都看不到。
因为我们还没有显示格子的图标。
这里我选择使用经典的'x'、‘o',用渲染文字的方式实现。(这部分也可以自己找图贴上去)

渲染文字的步骤:

  • self.font = pygame.font.SysFont设置字体

  • self.font.render函数,生成一个含有文本信息的图像

  • 将图像使用get_rect方法处理成矩形,进行对齐

  • 使用blit方法渲染

lattice.py文件:

import pygameclass Lattice():    def __init__(self,rect,screen):        self.rect = rect        self.screen = screen        # 0表示初始,1表示个人-1表示电脑        self.stats = 0        # 文本颜色        self.text_color = (30, 30, 30)        # 背景颜色,也就是我们screen渲染的颜色        self.bg_color = (255, 255, 255)        # 设置字体        self.font = pygame.font.SysFont(None,48)    def draw(self):        # 按照状态赋值文本信息        msg = ""        if self.stats == -1:            msg = "x"        elif self.stats == 1:            msg = "o"                if msg:            self.msg_image = self.font.render(msg,True,self.text_color,self.bg_color)            self.msg_rect = self.msg_image.get_rect()            self.msg_rect.center = self.rect.center            self.screen.blit(self.msg_image,self.msg_rect)

render函数:
传入参数:文本信息,Boolean(控制曲线是否光滑,没试过),文本颜色,背景颜色(也就是我们screen渲染的颜色)
返回一个图片类型。

get_rect()方法:
将图片处理成矩形,pygame有一点很好,就是不管什么样的图形都能当成矩形处理

rect对象,有centerx、centery、x、y等一系列属性,方便我们进行对齐操作,在这里不展开说了。

blit方法:
输入图片和矩形(这里的矩形实质上是给方法指明显示的坐标),
在screen上显示。

在主模块中:

def update():    for i in rect:        i.draw()    # 将界面显示    pygame.display.flip()

如果只是在while循环的开始写一个update,会发现实际上我们是不能及时看到结果的,这样很明显有影响,所以在每一次落子之后,我们都会进行一次刷新,然后再判断输赢。

if  not i.stats and i.rect.collidepoint(mouse_x,mouse_y):# 玩家下棋i.stats = -1update()win_or_lose()# 电脑下棋computer()update()win_or_lose()

感谢你能够认真阅读完这篇文章,希望小编分享的“pygame如何实现井字棋的逻辑思路”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

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

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

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

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

下载Word文档

猜你喜欢

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

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

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

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

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

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

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

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

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

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

C语言如何开发实现井字棋

这篇文章主要为大家展示了“C语言如何开发实现井字棋”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何开发实现井字棋”这篇文章吧。总体思路井字棋棋盘我们总体可以当成一个二维数组来操作,我们分
2023-06-25

C语言如何实现井字棋游戏

这篇文章主要介绍了C语言如何实现井字棋游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用
2023-06-14

如何通过C语言实现井字棋游戏

今天就跟大家聊聊有关如何通过C语言实现井字棋游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏
2023-06-22

微信小程序如何实现井字棋游戏

这篇文章主要介绍了微信小程序如何实现井字棋游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序如何实现井字棋游戏文章都会有所收获,下面我们一起来看看吧。效果图.wxml2023-06-30

JavaScript如何通过极大极小值算法实现AI井字棋游戏

JavaScript如何通过极大极小值算法实现AI井字棋游戏,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。话不多说直接上运行截图:黑棋是玩家的位置,红色方是电脑。电脑会根据
2023-06-22

Golang如何实现单元测试中的逻辑层

本篇内容介绍了“Golang如何实现单元测试中的逻辑层”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!准备工作安装 go install gi
2023-07-05

在R语言中如何实现Logistic逻辑回归的操作

这篇文章主要介绍了在R语言中如何实现Logistic逻辑回归的操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于G
2023-06-14

如何利用PHP7的匿名函数和闭包实现更加灵活的代码逻辑?

如何利用PHP7的匿名函数和闭包实现更加灵活的代码逻辑?随着PHP7的发布,匿名函数和闭包成为了PHP开发中的重要特性。匿名函数允许我们在代码中直接定义并使用函数,而闭包则可以将函数作为变量进行传递和存储。通过灵活地使用匿名函数和闭包,我们
2023-10-22

如何使用PHP7的闭包实现更加灵活的逻辑封装和代码隔离?

如何使用PHP7的闭包实现更加灵活的逻辑封装和代码隔离?摘要:使用闭包(Closure)是PHP开发中非常重要的概念。在PHP 7之前,闭包的使用相对较为繁琐,并且存在一些限制。而PHP 7引入了匿名类和Closure::call()等新特
2023-10-26

如何利用PHP7的匿名函数和闭包实现更加灵活的逻辑封装?

如何利用PHP7的匿名函数和闭包实现更加灵活的逻辑封装?在PHP7中,匿名函数和闭包是非常强大的特性,它们可以帮助我们实现更加灵活和复用性高的代码封装。本文将介绍如何使用PHP7的匿名函数和闭包来实现这些功能,并提供具体的代码示例。闭包是一
2023-10-22

如何利用PHP7的匿名函数和闭包实现更加灵活的代码逻辑处理?

如何利用PHP7的匿名函数和闭包实现更加灵活的代码逻辑处理?在PHP7之前,我们经常使用函数来封装一段特定的逻辑,然后在代码中调用这些函数来实现特定的功能。然而,有时候我们可能需要在代码中定义一些临时的逻辑块,这些逻辑块没有必要创建一个独立
2023-10-22

编程热搜

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

目录