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

随后,我们同样使用列表解析,将所有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 = -1
win_or_lose()
# 电脑下棋
computer()
win_or_lose()

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

五、显示问题

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

渲染文字的步骤:

  • self.font = pygame.font.SysFont设置字体
  • self.font.render函数,生成一个含有文本信息的图像
  • 将图像使用get_rect方法处理成矩形,进行对齐
  • 使用blit方法渲染

lattice.py文件:

import pygame
class 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 = -1
update()
win_or_lose()
# 电脑下棋
computer()
update()
win_or_lose()

六、结语

这样,我们这个井字棋基本上就可以玩了,但是我们还是需要进行一些修改。
下一篇博客,我将对细节进行整改。

下一篇:pygame实现井字棋——3.逻辑优化
上一篇:pygame实现井字棋——1.绘制九宫格

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

(0)

相关推荐

  • 详解pygame捕获键盘事件的两种方式

    方式1:在pygame中使用pygame.event.get()方法捕获键盘事件,使用这个方式捕获的键盘事件必须要是按下再弹起才算一次. 示例示例: for event in pygame.event.get(): # 捕获键盘事件 if event.type == pygame.QUIT: # 判断按键类型 print("按下了退出按键") 方式2:在pygame中可以使用pygame.key.get_pressed()来返回所有按键元组,通过判断键盘常量,可以在元组中判断出那个键被

  • python+pygame实现代码雨(黑客帝国既视感)

    本文主要介绍了python+pygame实现代码雨,分享给大家,具体如下: 效果: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/12/29 12:34 # @Author : huni # @File : 代码雨.py # @Software: PyCharm import random import pygame PANEL_width = 1600 PANEL_highly = 1000 FONT_PX = 15

  • Pygame做一期吃豆子游戏的示例代码

    Pygame的历史 Pygame是一个利用SDL库的写就的游戏库,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛写的,据说他为了让Loki(致力于向Linux上移植Windows的游戏的一家大好人公司,可惜已经倒闭,唉好人不长命啊--)更有效的工作,创造了这个东东. SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库.Pygame已经存在很多时间了,许多优秀的程序员加入其

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

    一.前言 先说一下本期的目标. 首先我们在判断出输赢.平局的时候,只有一个控制台输出,很明显不符合我们游戏的排面(doge 另外,之前的逻辑有一个漏洞,就是玩家一定是先手(就是第一个下棋的人,这个也需要修改). 还有,有一个短暂的弹窗显示到谁了,游戏的可玩性就会有提高. 最后一个就是,如果点击位置有问题,我们需要显示. 二.渲染问题 翻车了,之前的逻辑是将九宫格和背景颜色写死,而且之前都是直接在之前的基础上渲染,但是我们的弹窗需要在结束后及时撤下来,所以需要我们不断的重新渲染界面. 得,改吧.

  • pygame可视化幸运大转盘实现

    继续分享pygame有趣的技术知识,欢迎往下看. 一.先搭个架子 (一)黏贴背景图: 实现代码如下: import pygame pygame.init() # 初始化pygame类 screen = pygame.display.set_mode((600, 600)) # 设置窗口大小 pygame.display.set_caption('幸运大转盘') # 设置窗口标题 tick = pygame.time.Clock() fps = 10 # 设置刷新率,数字越大刷新率越高 # 方法一

  • Python3+Pygame实现射击游戏完整代码

    之前看到过很多人写的飞机大战,当然了之前我也写过多个版本,总体来说功能是实现了,但总感觉不够"炫" 今天浏览Python资料的时候,意外发现了这个很好的"射击"类游戏,看上去类似飞机大战,但更好玩 一.游戏特点 1. 运行非常流畅 2. 默认有3条命,每条命的HP可以增加(吃补品)也可以减少(被击中) 3. 有碰撞时的音效 4. 有碰撞时的爆炸效果 二.运行效果展示 三.完整代码 from __future__ import division import pyga

  • pygame多种方式实现屏保操作(自动切换、鼠标切换、键盘切换)

    pygame多种方式实现屏保操作(自动切换.鼠标切换.键盘切换),欢迎往下观看. 一.图片处理 (一)图片采集 我认为有三种方法: 其一:使用爬虫技术从网上下载图片,可以开一个子线程负责采集网上图片,然后加载到list列表中: 其二:可以直接对电脑中所有的盘进行自动检索,然后加载到list列表中: 其三:指定目录,然后加载到list列表中: 我这里偷个懒,选择第三种方法实现.具体代码如下: path = './image/' files = [] dirs = os.listdir(path)

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

    一.前言 这次,自己尝试使用pygame模块实现一个九宫格游戏. 目标:形成一个界面,将界面分割成9个,然后对于没有被占领的方框,我们可以用鼠标点击进行占领. 游戏规则就不用说了,至于套路,自己百度一下吧. 这里的人机采用随机数模式,因为实在是没什么套路. 二.显示界面 import pygame import sys # 初始化模块,加一下稳一些 pygame.init() # 创建屏幕对象 screen = pygame.display.set_mode((width,height)) #

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

    一.前言 我们在上一篇博客中实现了九宫格的绘制,为我们打下了基础. 这次我们来实现基本的逻辑,比如判断输赢.玩家和电脑分别下棋的逻辑. 二.下棋 2.1 玩家 我们之前在Lattice类中,有一个stats变量来表示格子的状态, # 0表示初始,1表示个人-1表示电脑 self.stats = 0 所以下棋本质上就是修改这个变量. 首先,我们是用鼠标点击的方式来实现下棋的,所以应当修改事件响应部分: for event in pygame.event.get(): # 退出 if event.t

  • Java实现简单井字棋小游戏代码实例

    Java第一次实验,老师让做一个井字棋,电脑随机下棋. 然后就想能不能聪明一点,可以判断出走哪一步棋:然后只能做到不会输,还是不够聪明,只能呆板地堵住用户,smartRobot的第三个判断逻辑找不到最佳位置,赢得概率比较小:而且我没事干时,想玩玩这个小游戏找找成就感,但每次都会赢了机器人,所以删删改改了四五次,最后才成. 可以选择谁先开始,但startGame里的代码更加冗余了.看着就很乱,但没想到好的办法. smartRobot里的代码全部重写了,比原来更聪明一点了:下在四个角的位置时,能优先

  • C语言实现简单的井字棋游戏

    本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下 1.什么是井字棋 井字棋相信大部分人都玩过 规则:双方轮流放子,当某一方的三个子连成一线(行,列,对角)时,该方获胜. 2.游戏前的准备 1. 菜单 游戏正式开始前我们可以为用户提供一个选择菜单,笔者做了一个最简单的游戏开始菜单: 代码: /*菜单*/ int menu() { printf("###########################\n"); printf("## 1.Play

  • C语言实现井字棋(三子棋)

    本文实例为大家分享了C语言实现井字棋的具体代码,供大家参考,具体内容如下 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用'O'代表电脑下的子,'X'代表玩家下的子.未下子的时候初始化 ' '(space).则二维数组为"char"类型,大小为char board[3][3]. 2.打印棋盘 打印出井字的棋盘,同时为了将数据显示在每格的中间,用空格隔开(" %c |")的格式设置棋盘"|"用来形成竖,接着打印&quo

  • C语言实现井字棋小游戏

    C语言实现简单的"井字棋游戏",供大家参考,具体内容如下 总体构造: 1.游戏菜单的逻辑实现 2.游戏本体的代码实现 part 1:游戏菜单的整体逻辑 ①简单的通过一个输入0和1的switch函数实现判断是玩游戏还是退出游戏的逻辑 输入1则进入游戏,而且打完game()即游戏本体之后因为do-while函数输入1会继续循环询问是否玩游戏 输入0则break退出游戏,且退出do-while循环,程序结束. int main() { int input = 0; srand((unsign

  • C语言实现井字棋(三子棋)

    本文实例为大家分享了C语言实现井字棋的具体代码,供大家参考,具体内容如下 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用'O'代表电脑下的子,'X'代表玩家下的子.未下子的时候初始化 ' '(space).则二维数组为"char"类型,大小为char board[3][3]. 2.打印棋盘 打印出井字的棋盘,同时为了将数据显示在每格的中间,用空格隔开(" %c |")的格式设置棋盘"|"用来形成竖,接着打印&quo

  • React中井字棋游戏的实现示例

    目录 需求分析 实现分析 涉及的组件 涉及的状态 编码实现 项目初始化 定义各个组件的props/state Square组件props Board组件props Game组件state 各组件代码 Square Board Game 最近开始接触React,我认为读官方文档是最快上手一门技术的途径了,恰好React的官方文档中有这样一个井字棋游戏的demo,学习完后能够快速上手React,这是我学习该demo的总结 需求分析 首先看看这个游戏都有哪些需求吧 游戏玩家:X和O,每次落棋后需要切换

  • python实现井字棋游戏

    本文实例介绍了python实现井字棋游戏的方法,分享给大家,具体内容如下 windows7下python3.4.0编译运行通过.由于采用了cmd调用,所以与Linux不兼容,无法在Linux下运行. 游戏就是井字棋,小键盘上的数字位置对应棋盘位置. #本游戏python3.4.0下编写调试,只能在windows下运行. import random import subprocess import time #定义函数 def draw_board(the_board): subprocess.c

随机推荐