Pygame 五子棋编程

这篇具有很好参考价值的文章主要介绍了Pygame 五子棋编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编程说明: pygame编程五子棋程序。

设计流程:新建棋盘,落子画圆,校验五子相连,赢家信息显示,自动重启下一局,程序打包成exe。

关键点

    新建棋盘:考虑线的间隔,需提前计算好。

    落子画圆:考虑黑白交替,已落子坐标位不可重复落子。

    校验五子相连:分成横、竖、左斜、右斜四个方向的相连,其中如果第一个为白子,第二个不为同色的白子,则列表清零重新计算,当列表出现五子相连即列表长度出现5个值,则跳出循环,提示赢家信息。

    赢家信息显示:先提前获取系统字体简称,设定正确的字体,否则中文显示为方框设定函数为pygame.font.SysFont("simhei",25)。

    程序打包成exe:准备.ico图标,使用指令在cmd框下执行Pyinstaller -F -w -i wzq.ico wzq.py 指定icon图标进行打包,在cmd黑框查看生成文件路径,找到生成的exe文件即可,坑为Pyinstaller确认为最新版本,版本过旧会报错导致打包失败,pip升级或者卸载重装即可。

参考链接:

1.pygame基础教程

https://blog.csdn.net/qq_40801987/article/details/121506910

2.Python Pygame制作简单五子棋游戏(详细代码+解释)

https://blog.csdn.net/weixin_43918046/article/details/119521845?spm=1001.2014.3001.5506

3.python中的tkinter库弹窗messagebox详解

https://www.jb51.net/article/216076.htm

4.pygame在屏幕上显示中文的方法

https://www.jianshu.com/p/eeea79aaf4b8

5.pygame基础语法

https://www.cnblogs.com/liuzhongkun/p/16165288.html

效果展示

Pygame 五子棋编程

Pygame 五子棋编程

程序详情

# encoding:utf-8

#调用pygame库

import pygame

import sys

#调用常用关键字常量,例当产生 KEYDOWN 或 KEYUP 事件时,key 属性描述具体哪个按键被按下

from pygame.locals import QUIT,KEYDOWN

import numpy as np

# from tkinter import *

# from tkinter import messagebox  #一方获胜后弹出面板,第二种显示样式

#判断鼠标的落点

def find_pos(x,y):

    for i in range(27,670,44):

        for j in range(27,670,44):

            L1=i-22

            L2=i+22

            R1=j-22

            R2=j+22

            if x>=L1 and x<=L2 and y>=R1 and y<=R2:

                return i,j

    return x,y

#已落子不可以重复落子

def check_over_pos(x,y,over_pos):

    for val in over_pos:

        if val[0][0]==x and val[0][1]==y:

            return False  #表示已落子

    return True #表示没有落子

#判断五子连心

def check_win(over_pos):

    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#表示黑子

    for i in range(15): #查看有没竖型五子相连。例横坐标为0,查看纵坐标是否有五子相连的白子或者黑子

        pos1=[]

        pos2=[]

        for j in range(15):

            if mp[i][j]==1:  #把黑子保存到列表post1

                pos1.append([i,j])

            else:

                pos1=[] #关键点,如果下次循环不为白色,则列表情空,重新计算,保证只有五子相连才保存列表,下面横竖左斜右斜计算同理。

            if mp[i][j]==2: #把白子保存到列表post2

                pos2.append([i,j]) #关键点,如果下次循环不为黑色,则列表情空,重新计算,保证只有五子相连才保存列表下面横竖左斜右斜计算同理。

            else:

                pos2=[]

            if len(pos1)>=5: #五子连心

                return(1,pos1)

            if len(pos2)>=5:

                return [2,pos2]

    for j in range(15): #查看有没横型五子相连。例竖坐标为0,查看横坐标是否有五子相连的白子或者黑子

        pos1=[]

        pos2=[]

        for i in range(15):

            if mp[i][j]==1:

                pos1.append([i,j])

            else:

                pos1=[]

            if mp[i][j]==2:

                pos2.append([i,j])

            else:

                pos2=[]

            if len(pos1)>=5:

                return(1,pos1)

            if len(pos2)>=5:

                return [2,pos2]

    for i in range(15): #查看有没左斜型五子相连。

        for j in range(15):

            pos1=[]

            pos2=[]

            for k in range(15):

                if i+k>=15 or j+k>=15:

                    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]

    for i in range(15): #查看有没右斜型五子相连。

        for j in range(15):

            pos1=[]

            pos2=[]

            for k in range(15):

                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]

    return [0,[]]

#获胜信息 一方获胜后在(250,0)坐标显示获胜信息

def message_rt(message_text):

    # fonts=pygame.font.get_fonts()

    # print(fonts) #查看系统字体

    text=pygame.font.SysFont("simhei",25) #坑,中文显示都是方框

    print(message_text)

    print(message_text.encode("utf-8"))

    text_fmt=text.render(message_text,1,(255,0,0))

    screen.blit(text_fmt,(250,0))

while True:  #一局结束重新开始下一局

    #初始化pygame

    pygame.init()

    #窗口创建

    #获取对显示系统的访问,并创建一个窗口screen

    #窗口大小为670x670

    screen=pygame.display.set_mode((670,670))

    screen_color=[255,165,79] #背景颜色,[255,165,79]对应为棕色

    line_color=[0,0,0] #线条颜色,[0,0,0]对应黑色

    flag=False

    tm=0

    over_pos=[]

    white_color=[255,255,255]

    black_color=[0,0,0]

    while True: #不断训练刷新画布

        for event in pygame.event.get(): #获取事件,如果鼠标点击右上角关闭按钮,关闭

            if event.type in (QUIT,KEYDOWN):

                pygame.quit()

                sys.exit()

        screen.fill(screen_color)  #清屏,重新开始

        #画棋盘

        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)

        #在棋盘中心画个小圆表示正中心位置

        pygame.draw.circle(screen,line_color,[27+44*7,27+44*7],8,0)

        for val in over_pos: #显示所有落下的棋子

            pygame.draw.circle(screen,val[1],val[0],20,0)

        #判断是否存在五子连心

        res=check_win(over_pos)

        if res[0]!=0:

            for pos in res[1]:

                pygame.draw.rect(screen,[238,48,167],[pos[0]*44+27-22,pos[1]*44+27-22,44,44],2,5)

            pygame.display.update()  #刷新显示,需要刷新后在界面显示变化

        if res[0]==2:

            # Tk().wm_withdraw()

            # messagebox.showinfo("白棋获胜","恭喜白棋一方获胜")

            message_rt(u"恭喜白棋一方获胜")  #赢家信息显示

            pygame.display.update()

            pygame.time.wait(1000)

            break  #游戏结束,停止下面的操作

        elif res[0]==1:

            # Tk().wm_withdraw()

            # messagebox.showinfo("黑棋获胜","恭喜黑棋一方获胜")

            message_rt(u"恭喜黑棋一方获胜") #赢家信息显示

            pygame.display.update()

            pygame.time.wait(1000)

            break  #游戏结束,停止下面的操作

        #获取鼠标的坐标,调用函数find_pos,判断是否可以落子

        x,y=pygame.mouse.get_pos()

        x,y=find_pos(x,y)

        pygame.draw.rect(screen,[0,229,238],[x-22,y-22,44,44],2,1)

        #鼠标左键表示落子,tm用来延时的,因为每次循环时间间隔很断,容易导致明明只按了一次左键,却被多次获取,认为我按了多次

        keys_pressed=pygame.mouse.get_pressed() #获取鼠标按键信息

        if keys_pressed[0] and tm ==0:

            flag=True

            if check_over_pos(x,y,over_pos):

                if len(over_pos)%2==0:

                    over_pos.append([[x,y],black_color])

                else:

                    over_pos.append([[x,y],white_color])

        #鼠标左键的延时作用

        if flag:

            tm +=1

        if tm%20==0:  #延迟时间设定20ms

            flag=False

            tm=0

        for val in over_pos:

            pygame.draw.circle(screen,val[1],val[0],20,0)

        pygame.display.update()

     程序打包为exe

准备.ico图标和上面py文件,cmd输入指令,然后执行完成后找到对应exe保存路径即可。

Pygame 五子棋编程

Pygame 五子棋编程

Pygame 五子棋编程

Pygame 五子棋编程

1人点赞

技术文章来源地址https://www.toymoban.com/news/detail-477644.html

到了这里,关于Pygame 五子棋编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python五子棋代码最简单的,python五子棋代码能复制

    本篇文章给大家谈谈python五子棋代码红方蓝方,以及python五子棋代码最简单的,希望对各位有所帮助,不要忘了收藏本站喔。 开端 画棋盘 首先肯定是要画出棋盘来,用  pygame  画出一个 19 × 19 或 15 × 15 的棋盘并不是什么难事,这在之前的文章中已经多次用到,就不赘述了

    2024年03月13日
    浏览(34)
  • python五子棋代码最简单的,python五子棋代码手机版

    大家好,本文将围绕python五子棋代码最简单的展开说明,python五子棋代码手机版是一个很多人都想弄明白的事情,想搞清楚python五子棋代码画棋盘需要先了解以下几个事情。 【实例简介】 【实例截图】 【核心代码】 \\\"\\\"\\\"五子棋之人机对战\\\"\\\"\\\" import sys import random import pygame from

    2024年01月19日
    浏览(31)
  • 中秋时节赏明月,五子棋戏月饼趣 — Flutter中秋限定版五子棋

    前言 当中秋时节来临,我们都期待着与亲人朋友共度这个美好的节日。这个时候,除了传统的赏月和品尝美味的月饼,我还有一个特别的建议——尝试一款有趣的Flutter五子棋游戏!这款五子棋游戏以中秋为主题,游戏的棋子也可爱地模仿了月饼和玉兔的形状,让我们在这个

    2024年02月06日
    浏览(42)
  • 五子棋游戏

    一。画出棋盘x和y  横和竖个15条线,画出中央的小点 二,创建列表,计算出x和y的当前坐标的位置,且存储二维列表的值,画出圆形白色棋子 三.黑白棋子交替出现 四,提示已经被其他棋子占领了,不能重复占领 五。创建检测五子相连的函数  def  check 六.,实现水平向左和

    2024年02月05日
    浏览(29)
  • 鸿蒙小案例-五子棋

    刚开始以为挺简单的,越写越…emo 因为代码有点多,所以这里就简单讲下逻辑,文末贴上代码 逻辑只是我个人想的,不代表只有这一种实现方式,有其他想法可以在下面留言 另外功能做的比较简单,有一些没实现,但是基本功能都有,大家可以自行优化 组件就比较简单,采

    2024年02月21日
    浏览(28)
  • 五子棋(Python实现)

    2024年02月11日
    浏览(30)
  • C++制作五子棋

    正文 01 思路 我没有选择专业的五子棋棋型,用我自己的逻辑(初高中玩五子棋的方法),去实现简单的人机对战。 首先因为要计算五子棋每一步的分数,那么你就要分析每一步形成的棋盘,以下图为例: 当你即将在红色方框区域内落子时,通过数据处理获取四个方向的棋子

    2024年02月11日
    浏览(24)
  • 在线五子棋对战

    目录   数据管理模块(数据库设计) 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据库中有可能存在很多张表,每张表中管理的数据⼜有不同,要进⾏的数据操作也各不相同,因此我们可以为每⼀

    2024年02月14日
    浏览(33)
  • Python实现五子棋

    我认为这个五子棋核心还是在于二维数组,将实际当中鼠标点击的物理位置转换到棋盘中的逻辑地址,之后便用数组的方法进行操作,例如检测是否获胜,电脑下棋策略等。 是否可落子 是否有输赢 每次标记最新下棋的位置即可 电脑下棋 策略:主要根据一个网上的经验评分

    2024年02月06日
    浏览(33)
  • python实现《五子棋》

            今天突然心血来潮,想全程自己写一个小游戏(毕竟对于一个才接触python不到一个月的小白来说,还是比较为难,虽然不算是完全成功,因为棋盘大小和布局还是借鉴了其它博主的,但这都是小问题,重要是其它的都是自己写的嘛!!!(咦,这小编真能扯,还不上

    2024年02月12日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包