草庐IT

【Python】Pygame学习制作五子棋笔记

-李华同学- 2023-06-07 原文

前几天突发奇想做一个五子棋,但是技术储备不足,于是就在C站找资料,于是我就借鉴大佬做的五子棋,根据其思路,我做的一些笔记。

目录

一,棋盘的绘制

1.窗口

 2.网格

3.星位

二,游戏功能介绍

1.下棋

2.胜利的判断

三,胜利提示

1.棋子上的显示

2.胜利提示窗口


大佬的代码写的已经很详细了,我就不全拿出来,点击下方链接查看全部代码。 

Python Pygame制作简单五子棋游戏(详细代码+解释)_Guapifang的博客-CSDN博客_简单python五子棋代码https://blog.csdn.net/weixin_43918046/article/details/119521845?spm=1001.2014.3001.5506

一,棋盘的绘制

1.窗口

这是用代码写出来的UI 

# 创建窗体
screen = pygame.display.set_mode((670, 670))
# 背景板颜色
Checkerboard_Color = (0xE3, 0x92, 0x65)

 

 2.网格

棋盘上的线条是通过循环和if条件语句绘制而成

for循环绘制网格线,if条件语句则是让边缘线加粗。

# 画边缘线
    for i in range(27, 670, 44):
        # 先画竖线
        if i == 27 or i == 670 - 27:
            # 边缘线稍微粗一些
            pygame.draw.line(screen, line_color, [i, 27], [i, 670 - 27], 4)
        else:
            pygame.draw.line(screen, line_color, [i, 27], [i, 670 - 27], 2)
        # 再画横线
        # 边缘线稍微粗一些
        if i == 27 or i == 670 - 27:
            # 边缘线
            pygame.draw.line(screen, line_color, [27, i], [670 - 27, i], 4)
        else:
            pygame.draw.line(screen, line_color, [27, i], [670 - 27, i], 2)
    # 边框内线      起点、终点、步长
    for i in range(32, 670, 605):
        pygame.draw.line(screen, line_color, [i, 27], [i, 670 - 27], 2)
        pygame.draw.line(screen, line_color, [27, i], [670 - 27, i], 2)

3.星位

 之前不懂这是什么意思,后来C站学习Pygame的基础,知道这句话的意思是画圆。

    # 在棋盘中心画个小圆表示正中心位置                 位置              半径、线厚度
    pygame.draw.circle(screen, line_color, [27 + 44 * 7, 27 + 44 * 7], 8, 10)
    # 设置四个角落的标点
    # 左上
    pygame.draw.circle(screen, line_color, [27 + 44 * 3, 27 + 44 * 3], 6, 10)
    # 右上
    pygame.draw.circle(screen, line_color, [27 + 44 * 11, 27 + 44 * 11], 6, 10)
    # 左下
    pygame.draw.circle(screen, line_color, [27 + 44 * 3, 27 + 44 * 11], 6, 10)
    # 右下
    pygame.draw.circle(screen, line_color, [27 + 44 * 11, 27 + 44 * 3], 6, 10)

二,游戏功能介绍

1.下棋

把鼠标设置为一个圆圈,让下棋的人看起来跟直观,不容易下错地方。

# 获取鼠标坐标信息
x, y = pygame.mouse.get_pos()
x, y = find_pos(x, y)
   

 棋盘上没有棋子的时候圆圈是黑色,有棋子的时候变成了白色。

# 把鼠标设置成圆圈
if check_over_pos(x, y, over_pos):
        #                       颜色         确定位置   长度、宽度、线厚度、圆角度
    pygame.draw.rect(screen, [0, 0, 30], [x - 22, y - 22, 44, 44], 3, 20)
    # 有棋子后颜色变白
else:
    pygame.draw.rect(screen, [224, 224, 223], [x - 22, y - 22, 44, 44], 3, 20)

 定义棋子的颜色

# 白棋颜色
white_color = [244, 244, 244]
# 黑棋颜色
black_color = [10, 10, 10]

2.胜利的判断

胜利的判断是通过设置四个方向的条件,来判定输赢。下面是我拿出一方向来解释。


    # zeros(shape, dtype=float)
    #                   数据类型对象为整数
    mp = np.zeros([15, 15], dtype=int)
    # 确定落棋位置
    for val in over_pos:
        x = int((val[0][0] - 27) / 44)
        y = int((val[0][1] - 27) / 44)
        # 让黑白棋交替
        if val[1] == white_color:
            mp[x][y] = 2  # 表示白子
        else:
            mp[x][y] = 1  # 表示黑子
# 向右倾斜连线
    # i代表竖直,j代表竖直方向
    #用循环嵌套来同时判定水平和竖直方向棋子的位置。
    for i in range(15):
        for j in range(15):
            pos1 = []
            pos2 = []
            for k in range(15):
                # 竖直方向+1,竖直方向向左+1
                if i + k >= 15 or j - k < 0:
                    # 如果达到条件,停止下面的操作
                    break
                if mp[i + k][j - k] == 1:
                    pos1.append([i + k, j - k])
                else:
                    pos1 = []
                if mp[i + k][j - k] == 2:
                    pos2.append([i + k, j - k])
                else:
                    pos2 = []
                if len(pos1) >= 5:
                    return [1, pos1]
                if len(pos2) >= 5:
                    return [2, pos2]

三,胜利提示

1.棋子上的显示

如图所示,连起来的五个棋子周围会显示方框提示。

# 获胜后显示                   颜色           确定位置                               长度、宽度、厚度、圆角
pygame.draw.rect(screen, [0, 0, 153], [pos[0] * 44 + 27 - 22, pos[1] * 44 + 27 - 22, 44, 44], 2, 5)

2.胜利提示窗口

这个代码我在C站找了很久都没有找到,最后是我的老师告诉我这串代码。

# 首先在代码最前面导入tkiner
from tkinter import *
from tkinter import messagebox        
        

        #代表白色棋子
        if val[1] == white_color:
            Tk().wm_withdraw()
            messagebox.showinfo('白棋获胜', '恭喜白棋一方获胜')
        else:
            Tk().wm_withdraw()
            messagebox.showinfo('黑棋获胜', '恭喜黑棋一方获胜')

 喜欢的话,请留下你的赞美。

有关【Python】Pygame学习制作五子棋笔记的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  3. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  4. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  5. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  10. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

随机推荐