Python五子棋游戏源代码源程序

标签: python  pygame

五子棋游戏,我们将游戏分为两个方面:一个是棋盘,另一个是棋子,利用横线和纵线将棋盘分成一个个小方格,当黑子或者白子形成5个棋子连线时,显示胜利者,游戏结束。本程序难点在于确定胜利条件。
在这里插入图片描述


import pygame as pg
class Chessboard:  # 设置棋盘
    def __init__(s):
        s.grid_lenght = 26                               #棋盘格子的边长
        s.grid_count = 20                                #格子的数量
        s.start_x = 150                                  #棋盘初始点坐标,左上角的坐标
        s.start_y = 50
        s.edge_lenght = s.grid_lenght / 2                #棋盘周围边缘的长度13


        s.piece = "black"
        s.winner = None
        s.gameover = False
        s.grid = []
        for i in range(s.grid_count):                      #棋盘大小为20*20个格子
            s.grid.append(list("." * s.grid_count))




    def handle_event(s, e):
        origin_x = s.start_x - s.edge_lenght
        origin_y = s.start_y - s.edge_lenght
        chessboard_lenght = (s.grid_count - 1) * s.grid_lenght + s.edge_lenght * 2
        mouse_pos = e.pos                                  #鼠标位置在棋盘坐标内
        if (mouse_pos[0] > origin_x and mouse_pos[0] <= origin_x + chessboard_lenght) and (
                mouse_pos[1] >= origin_y and mouse_pos[1] <= origin_y + chessboard_lenght):
            if not s.gameover:
                x = mouse_pos[0] - origin_x                 #X轴方向距离
                c = int(x / s.grid_lenght)                  #换算出X轴第几格
                y = mouse_pos[1] - origin_y
                r = int(y / s.grid_lenght)                  #换算出Y轴第几格
                if s.set_piece(r, c):
                    s.check_win(r, c)


    def set_piece(s, r, c):
        if s.grid[r][c] == ".":                             #该位置没有棋子
            s.grid[r][c] = s.piece
            if s.piece == "black":                          #交替使用棋子
                s.piece = "white"
            else:
                s.piece = "black"
            return True
        return False


    def check_win(s, r, c):
        n_count = s.get_continuous_count(r, c, -1, 0)            #上方向相周颜色棋子数量
        s_count = s.get_continuous_count(r, c, 1, 0)             #下方相同颜色棋子数量
        w_count = s.get_continuous_count(r, c, 0, -1)            #左方
        e_count = s.get_continuous_count(r, c, 0, 1)             #右方
        nw_count = s.get_continuous_count(r, c, -1, -1)          #左上方
        ne_count = s.get_continuous_count(r, c, -1, 1)           #右上方
        sw_count = s.get_continuous_count(r, c, 1, -1)           #左下方
        se_count = s.get_continuous_count(r, c, 1, 1)            #右下方
        if (n_count + s_count + 1 >= 5) or (e_count + w_count + 1 >= 5) or (se_count + nw_count + 1 >= 5) or (
                ne_count + sw_count + 1 >= 5):
            s.winner = s.grid[r][c]
            s.gameover = True


    def get_continuous_count(s, r, c, dr, dc):            #统计一个方向的同颜色棋子数量
        piece = s.grid[r][c]
        result = 0
        i = 1
        while True:
            new_r = r + dr * i
            new_c = c + dc * i
            if 0 <= new_r < s.grid_count and 0 <= new_c < s.grid_count:
                if s.grid[new_r][new_c] == piece:              #该方向颜色相同则加上
                    result += 1
                else:
                    break
            else:
                break
            i += 1
        return result


    def draw(s, screen):
        pg.draw.rect(screen, (185, 122, 87), [s.start_x - s.edge_lenght, s.start_y - s.edge_lenght,              #画棋盘
                                              (s.grid_count - 1) * s.grid_lenght + s.edge_lenght * 2,
                                              (s.grid_count - 1) * s.grid_lenght + s.edge_lenght * 2], 0)
        for r in range(s.grid_count):                                                                           #画棋盘横线
            y=s.start_y+r*s.grid_lenght
            pg.draw.line(screen,(0,0,0),[s.start_x,y],[s.start_x+s.grid_lenght*(s.grid_count-1),y],2)
        for c in range(s.grid_count):                                                                           #画棋盘竖线
            x = s.start_x+c*s.grid_lenght
            pg.draw.line(screen, (0, 0, 0), [x,s.start_y], [x,s.start_y + s.grid_lenght * (s.grid_count - 1)], 2)
        for r in range(s.grid_count):
            for c in range(s.grid_count):
                piece=s.grid[r][c]
                if piece!=".":
                    if piece=="black":                                           #设置棋子颜色
                        color=(0,0,0)
                    else:
                        color=(255,255,255)
                    x=s.start_x+c*s.grid_lenght
                    y=s.start_y+r*s.grid_lenght
                    pg.draw.circle(screen,color,[x,y],s.grid_lenght//2)             #在棋盘上画棋子
class Gomoku:
    def __init__(s):
        pg.init()
        s.screen=pg.display.set_mode((800,600))
        pg.display.set_caption("五子棋对战")
        s.clock=pg.time.Clock()
        s.font=pg.font.Font(u"C:\Windows\Fonts\Candarab.ttf", 24)
        s.going=True
        s.chessboard=Chessboard()
    def loop(s):                               #主循环
        while s.going:
            s.update()
            s.draw()
            s.clock.tick(50)
        pg.quit()
    def update(s):                            #更新画面
        for e in pg.event.get():
            if e.type==pg.QUIT:
                s.going=False
            elif e.type==pg.MOUSEBUTTONDOWN:
                s.chessboard.handle_event(e)
    def draw(s):
        s.screen.fill((255,255,255))                          #窗口底色为白色
        s.screen.blit(s.font.render("FPS:{0:.2F}".format(s.clock.get_fps()),True,(0,0,0)),(10,10))
        s.chessboard.draw(s.screen)                          #画棋盘窗口
        if s.chessboard.gameover:
            s.screen.blit(s.font.render("{0}Win".format("black"if s.chessboard.winner=="black"else"white"),True,(0,0,0)),(500,10))
        pg.display.update()                                 #更新界面
if __name__=="__main__":
    game=Gomoku()
    game.loop()

更多Python源代码,请关注公众号:Python代码大全
在这里插入图片描述

版权声明:本文为weixin_42756970原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42756970/article/details/106493570

智能推荐

linux服务器部署jenkins笔记

安装jenkins参考文档:https://blog.csdn.net/tomatocc/article/details/83930714 1. 打开jenkins官网:https://jenkins.io/download/ 将war包下载到本地 **ps:**这里要注意的是要下载左边下方的war包,不要下载右边下面的war包。左边是稳定版本,右边是最新版本,建议大家使用稳定版本(我刚开始下载的...

k8s部署elasticsearch集群

百度营销大学     环境准备 我们使用的k8s和ceph环境见: https://blog.51cto.com/leejia/2495558 https://blog.51cto.com/leejia/2499684 ECK简介 Elastic Cloud on Kubernetes,这是一款基于 Kubernetes Operator 模式的新型编排产品,用户可使用该产品在...

saas-export项目-AdminLTE介绍与入门

AdminLTE介绍 (1)AdminLTE是什么? AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具 (2)AdminLTE有什么特点? 提供一系列响应的、可重复使用的组件, 并内置了多个模板页面 自适应多种屏幕分辨率,兼容PC和移动端 快速的创建一个响应式的Html5网站 AdminLTE 不但美观, 而且可以免去写很大CSS与JS的工作量 AdminLTE...

MyBatis中ResultMap结果集映射

用于解决属性名和字段名不一致的情况: resultMap 元素是 MyBatis 中最重要最强大的元素。...

编写一个shell

编写shell的过程: 1.从标准输入中读入一个字符串。 2.解析字符串 3.创建一个子进程的执行程序。 4.子进程程序替换。 5.父进程等待子进程退出。...

猜你喜欢

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...

力扣困难难度 第4题 寻找两个正序数组的中位数

先看一眼题 我的思路: 设置下标i,j分别用于遍历两个数组,初始值均为0,直到找到两个数组中从小到大的第第length/2个数为止结束循环,length为两个数组长度之和。 ·每次比较nums[i]nums[j],如果前者小则i++,否则j++ ·循环结束时,如果count已经达到length/2,则说明已经找到了中位数,[注意:此时有可能正好其中一个数组遍历完了!所以...

[国家集训队]小Z的袜子(莫队)

[国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这NN只袜子从1到NN编号,然后从编号LL到RR(LL 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同...

服务器配置(五) 服务器使用tomcat配置https全过程

一.了解服务器配置https协议 HTTPS,是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 配置HTTPS就需要证书,证书通过权威的CA机构付费获得的证书才能被互联网承认,我们将其放在服务器上面,配置好后,就可以进行https通信了。 通过https访问的网站,在地址前可以看到安全两个字,点击可以查...

SQL语言——基本概念、操作数据库、表、表记录、数据库备份与恢复、外键约束

SQL语言 1.基本概念 1.1 SQL SQL–Structured Query Language, 结构化查询语言,是关系型数据库通用的操作语言。 是一种非过程性语言。 由美国国家标准局(ANSI)与国际标准化组织(ISO)制定SQL标准。各大数据库厂商都对其做了实现。所以我们只要学会了SQL语言,就可以操作各大关系型数据库了。 为加强SQL的语言能力,各厂商增强了过程性语言的特征...