五子棋游戏

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

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((750,750))#设置游戏屏幕大小
running = True#建立一个事件
while running:#事件运行
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
    screen.fill([125,95,24])#给屏幕画上颜色

    for x in range(15):#画出15条竖线
         pygame.draw.line(screen, (255, 0, 0),[25+50*x,25],[25+50*x,725],2)
    for y in range(15):#画出15条横线
         pygame.draw.line(screen, (255, 0, 0),[25,25+50*y],[725,25+50*y],2)
    pygame.draw.circle(screen, (255, 0, 0),[25+50*7,25+50*7],8)#棋盘中间画出一个中心点

    pygame.display.update()#刷新,变色用的





pygame.quit()#退出游戏

一。画出棋盘x和y  横和竖个15条线,画出中央的小点

五子棋游戏,游戏

二,创建列表,计算出x和y的当前坐标的位置,且存储二维列表的值,画出圆形白色棋子

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((750,750))#设置游戏屏幕大小
map = [0]*15#创建一个列表
for i in range(15):#列表循环来存储数据
    map[i] = [0]*15#二维列表来存储数据
running = True#建立一个事件
while running:#事件运行
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            col = round((x - 25)/50)#计算出x的位置
            row = round((y - 25)/50)#计算出y的位置
            print(row+1,col+1)#打印出x与y的位置
            map[row][col] = 1#等于1表示把它的数值存储起来
    screen.fill([125,95,24])#给屏幕画上颜色

    for x in range(15):#画出15条竖线
         pygame.draw.line(screen, (255, 0, 0),[25+50*x,25],[25+50*x,725],2)
    for y in range(15):#画出15条横线
         pygame.draw.line(screen, (255, 0, 0),[25,25+50*y],[725,25+50*y],2)
    x,y = pygame.mouse.get_pos()#获取鼠标所在位置
    x = round((x - 25)/50)*50 + 25#找到x和y的交叉点
    y = round((y - 25)/50)*50 + 25#找到x和y的交叉点

    pygame.draw.rect(screen,(255, 0, 0),[x-25,y-25,50,50],2)#画一个正方形框框,表示可以落子

    pygame.draw.circle(screen, (255, 0, 0),[25+50*7,25+50*7],8)#棋盘中间画出一个中心点
    for row in range(15):#棋盘上画出白色棋子
        for col in range(15):#棋盘上画出白色棋
            if map[row][col] == 1:#点击后在棋盘上画出白色棋
                pygame.draw.circle(screen,(255, 255, 255),[col*50+25,row*50+25],25)#棋盘上画出白色棋的位置和大小半径
    pygame.display.update()#刷新,变色用的
pygame.quit()#退出游戏

五子棋游戏,游戏

三.黑白棋子交替出现

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((750,750))#设置游戏屏幕大小
map = [0]*15#创建一个列表
for i in range(15):#列表循环来存储数据
    map[i] = [0]*15#二维列表来存储数据
player = 1#创建玩家1
running = True#建立一个事件
while running:#事件运行
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            col = round((x - 25)/50)#计算出x的位置
            row = round((y - 25)/50)#计算出y的位置
            print(row+1,col+1)#打印出x与y的位置
           # map[row][col] = 1#等于1表示把它的数值存储起来
            map[row][col] = player#
            if player == 1:#当点击事件后
                player = 2 #2是黑子
            else:
                player = 1#下一次是白子
    screen.fill([125,95,24])#给屏幕画上颜色

    for x in range(15):#画出15条竖线
         pygame.draw.line(screen, (255, 0, 0),[25+50*x,25],[25+50*x,725],2)
    for y in range(15):#画出15条横线
         pygame.draw.line(screen, (255, 0, 0),[25,25+50*y],[725,25+50*y],2)
    x,y = pygame.mouse.get_pos()#获取鼠标所在位置
    x = round((x - 25)/50)*50 + 25#找到x和y的交叉点
    y = round((y - 25)/50)*50 + 25#找到x和y的交叉点
    pygame.draw.rect(screen,(255, 0, 0),[x-25,y-25,50,50],2)#画一个正方形框框,表示可以落子

    pygame.draw.circle(screen, (255, 0, 0),[25+50*7,25+50*7],8)#棋盘中间画出一个中心点
    for row in range(15):#棋盘上画出白色棋子
        for col in range(15):#棋盘上画出白色棋
            if map[row][col] == 1:#点击后在棋盘上画出白色棋
                pygame.draw.circle(screen,(255, 255, 255),[col*50+25,row*50+25],25)#棋盘上画出白色棋的位置和大小半径
            if map[row][col] == 2:  # 点击后在棋盘上画出白色棋
                pygame.draw.circle(screen, (000, 000, 000), [col * 50 + 25, row * 50 + 25], 25)  #当时玩家2时棋盘上画出黑色棋子
    pygame.display.update()#刷新,变色用的
pygame.quit()#退出游戏

五子棋游戏,游戏

四,提示已经被其他棋子占领了,不能重复占领

五子棋游戏,游戏

五。创建检测五子相连的函数  def  check

五子棋游戏,游戏

六.,实现水平向左和向右方向的五子连线的判断胜负

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((750,750))#设置游戏屏幕大小
map = [0]*15#创建一个列表
for i in range(15):#列表循环来存储数据
    map[i] = [0]*15#二维列表来存储数据
player = 1#创建玩家1
running = True
def check(row,col):#创建check函数检测五子连线
    #判断左右方向是否五子连线
    score = 1
    for i in range(4):
        if map[row][col+i] == map[row][col+i+1]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row][col-i] == map[row][col-i-1]:
            score = score + 1
        else:
            break
    if score == 5:
        return True
while running:#事件运行
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            col = round((x - 25)/50)#计算出x的位置
            row = round((y - 25)/50)#计算出y的位置
            if map[row][col]== 0:
                print(row+1,col+1)#打印出x与y的位置
               # map[row][col] = 1#等于1表示把它的数值存储起来
                map[row][col] = player#
                if(check(row,col)):#如果检测到五子连线了那么打印赢了
                    print("有人赢了")
                else:
                    if player == 1:#当点击事件后
                        player = 2 #2是黑子
                    else:
                        player = 1#下一次是白子
            else:
                print("当前位置已经被占领了")
    screen.fill([125,95,24])#给屏幕画上颜色

    for x in range(15):#画出15条竖线
         pygame.draw.line(screen, (255, 0, 0),[25+50*x,25],[25+50*x,725],2)
    for y in range(15):#画出15条横线
         pygame.draw.line(screen, (255, 0, 0),[25,25+50*y],[725,25+50*y],2)
    x,y = pygame.mouse.get_pos()#获取鼠标所在位置
    x = round((x - 25)/50)*50 + 25#找到x和y的交叉点
    y = round((y - 25)/50)*50 + 25#找到x和y的交叉点
    pygame.draw.rect(screen,(255, 0, 0),[x-25,y-25,50,50],2)#画一个正方形框框,表示可以落子

    pygame.draw.circle(screen, (255, 0, 0),[25+50*7,25+50*7],8)#棋盘中间画出一个中心点
    for row in range(15):#棋盘上画出白色棋子
        for col in range(15):#棋盘上画出白色棋
            if map[row][col] == 1:#点击后在棋盘上画出白色棋
                pygame.draw.circle(screen,(255, 255, 255),[col*50+25,row*50+25],25)#棋盘上画出白色棋的位置和大小半径
            if map[row][col] == 2:  # 点击后在棋盘上画出白色棋
                pygame.draw.circle(screen, (000, 000, 000), [col * 50 + 25, row * 50 + 25], 25)  #当时玩家2时棋盘上画出黑色棋子
    pygame.display.update()#刷新,变色用的
pygame.quit()#退出游戏

检查左右方向的水平方向五子棋连接的五个

五子棋游戏,游戏

五子棋游戏,游戏

检测上下方向五子相连

五子棋游戏,游戏

五子棋游戏,游戏

检测左下 右上方向五子相连

五子棋游戏,游戏

五子棋游戏,游戏

检测左上右下的五子相连

五子棋游戏,游戏

五子棋游戏,游戏

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((750,750))#设置游戏屏幕大小
map = [0]*15#创建一个列表
for i in range(15):#列表循环来存储数据
    map[i] = [0]*15#二维列表来存储数据
player = 1#创建玩家1

running = True
def check(row,col):#创建check函数检测五子连线
    #判断左右方向是否五子连线
    score = 1
    for i in range(4):
        if map[row][col+i] == map[row][col+i+1]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row][col-i] == map[row][col-i-1]:
            score = score + 1
        else:
            break
    if score == 5:
        return True

    # 判断上下方向是否五子连线
    score = 1
    for i in range(4):
        if map[row+i][col] == map[row+i+1][col]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row-i][col] == map[row-i-1][col]:
            score = score + 1
        else:
            break
    if score == 5:
        return True
    # 判断左下右上方向是否五子连线(左下行和列都减小,右上行和列都变大)
    score = 1
    for i in range(4):
        if map[row+i][col+i] == map[row+i+1][col+i+1]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row-i][col-i] == map[row-i-1][col-i-1]:
            score = score + 1
        else:
            break
    if score == 5:
        return True

     # 判断左上右下方向是否五子连线(左上行增加列减小,右下行变大,列变小)
    score = 1
    for i in range(4):
        if map[row - i][col + i] == map[row - i - 1][col + i + 1]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row + i][col - i] == map[row + i + 1][col - i - 1]:
            score = score + 1
        else:
            break
    if score == 5:
        return True
while running:#事件运行
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            col = round((x - 25)/50)#计算出x的位置
            row = round((y - 25)/50)#计算出y的位置
            if map[row][col]== 0:
                print(row+1,col+1)#打印出x与y的位置
               # map[row][col] = 1#等于1表示把它的数值存储起来
                map[row][col] = player#
                if(check(row,col)):#如果检测到五子连线了那么打印赢了
                    print("有人赢了")
                else:
                    if player == 1:#当点击事件后
                        player = 2 #2是黑子
                    else:
                        player = 1#下一次是白子
            else:
                print("当前位置已经被占领了")
    screen.fill([125,95,24])#给屏幕画上颜色

    for x in range(15):#画出15条竖线
         pygame.draw.line(screen, (255, 0, 0),[25+50*x,25],[25+50*x,725],2)
    for y in range(15):#画出15条横线
         pygame.draw.line(screen, (255, 0, 0),[25,25+50*y],[725,25+50*y],2)
    x,y = pygame.mouse.get_pos()#获取鼠标所在位置
    x = round((x - 25)/50)*50 + 25#找到x和y的交叉点
    y = round((y - 25)/50)*50 + 25#找到x和y的交叉点
    pygame.draw.rect(screen,(255, 0, 0),[x-25,y-25,50,50],2)#画一个正方形框框,表示可以落子

    pygame.draw.circle(screen, (255, 0, 0),[25+50*7,25+50*7],8)#棋盘中间画出一个中心点
    for row in range(15):#棋盘上画出白色棋子
        for col in range(15):#棋盘上画出白色棋
            if map[row][col] == 1:#点击后在棋盘上画出白色棋
                pygame.draw.circle(screen,(255, 255, 255),[col*50+25,row*50+25],25)#棋盘上画出白色棋的位置和大小半径
            if map[row][col] == 2:  # 点击后在棋盘上画出白色棋
                pygame.draw.circle(screen, (000, 000, 000), [col * 50 + 25, row * 50 + 25], 25)  #当时玩家2时棋盘上画出黑色棋子
    pygame.display.update()#刷新,变色用的
pygame.quit()#退出游戏

添加变量winner赋值给player,提示谁赢了,且提示3秒退出游戏

五子棋游戏,游戏

五子棋游戏,游戏

五子棋游戏,游戏

bug问题1,不是连续的五个放在一起棋子,不会判断赢输,

修改条件score 》=5

五子棋游戏,游戏

五子棋游戏,游戏

2.优化把所有的数值设置为变量,

pygame.display.set_caption("这是五子棋游戏")
border_left =25
border_right =725
border_top = 25
border_bottom = 725
width = 50
height = 50

3.ttf字体下载网站;https://www.hanyi.com.cn/

下载下来和五子棋放在同一个目录下面

4.把棋盘下面的按钮功能用class button来实现

class Button:#定义按钮的类
    def __init__(self,x,y,width,height,text,color,click_color,text_color):#初始化
        self.text = text#定义内容
        self.color = color#定义颜色
        self.click_color = click_color#定义点击后的颜色
        self.text_color = text_color#定义文本颜色
        self.rect = pygame.Rect(x,y,width,height)#定义按钮的大小
        self.clicked = False#不点击
    def draw(self,screen):#定义方法生成出按钮
        if self.clicked:
            pygame.draw.rect(screen,self.click_color,self.rect)#画出按钮
        else:
            pygame.draw.rect(screen,self.color,self.rect)
        text_surface = font.render(self.text,True,self.text_color)#双人对战按钮的颜色
        text_rect = text_surface.get_rect(center = self.rect.center)#双人对战按钮的位置坐标
        screen.blit(text_surface,text_rect)##双人对战按钮的颜色
button = Button(30,470,100,30,"双人模式",(153,51,250),(221,160,221),(255,255,255))#画一个双人模式按钮
    button.draw(screen)#画一个双人模式按钮
    button = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
    button.draw(screen)  # 画一个机器人式按钮

五子棋游戏,游戏

5.坐标出了棋盘范围

五子棋游戏,游戏

在以下两处添加限制x的左右和y轴的上下范围后正常

五子棋游戏,游戏

五子棋游戏,游戏

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((490,590))#设置游戏屏幕大小
#screen = pygame.display.set_mode((750,850))#设置游戏屏幕大小
pygame.display.set_caption("这是五子棋游戏")#游戏的名字
border_left =25#屏幕左边界
border_right =445#屏幕右边界
border_top = 25#屏幕上边界
border_bottom = 445#屏幕下边界
width = 30#棋盘小格子的宽
height = 30#棋盘小格子的高


map = [0]*15#创建一个列表
for i in range(15):#列表循环来存储数据
    map[i] = [0]*15#二维列表来存储数据
player = 1#创建玩家1
winner = 0#创建一个变量,看看是谁赢了
running = True
#font = pygame.font.Font(None,30)#使用默认字体英文字体
font = pygame.font.Font("font.ttf", 24)#使用汉语字体大小24
class Button:#定义棋盘上胡按钮的类
    def __init__(self,x,y,width,height,text,color,click_color,text_color):#初始化定义类的属性
        self.text = text#定义按钮文本内容
        self.color = color#定义按钮胡颜色
        self.click_color = click_color#定义点击后的颜色
        self.text_color = text_color#定义文本颜色
        self.rect = pygame.Rect(x,y,width,height)#定义画矩形按钮的大小
        self.clicked = False#不点击
    def draw(self,screen):#定义方法生成出按钮
        if self.clicked:
            pygame.draw.rect(screen,self.click_color,self.rect)#画出按钮
        else:
            pygame.draw.rect(screen,self.color,self.rect)
        text_surface = font.render(self.text,True,self.text_color)#双人对战按钮的颜色和文本
        text_rect = text_surface.get_rect(center = self.rect.center)#双人对战按钮的位置坐标居中
        screen.blit(text_surface,text_rect)##绘画双人对战按钮
def check(row,col):#创建check函数检测五子连线

    #判断左右方向是否五子连线
    score = 1
    for i in range(4):
        if map[row][col+i] == map[row][col+i+1]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row][col-i] == map[row][col-i-1]:
            score = score + 1
        else:
            break
    if score == 5:
        return True

    # 判断上下方向是否五子连线
    score = 1
    for i in range(4):
        if map[row+i][col] == map[row+i+1][col]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row-i][col] == map[row-i-1][col]:
            score = score + 1
        else:
            break
    if score == 5:
        return True
    # 判断左下右上方向是否五子连线(左下行和列都减小,右上行和列都变大)
    score = 1
    for i in range(4):
        if map[row+i][col+i] == map[row+i+1][col+i+1]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row-i][col-i] == map[row-i-1][col-i-1]:
            score = score + 1
        else:
            break
    if score == 5:
        return True

     # 判断左上右下方向是否五子连线(左上行增加列减小,右下行变大,列变小)
    score = 1
    for i in range(4):
        if map[row - i][col + i] == map[row - i - 1][col + i + 1]:
            score = score + 1
        else:
            break
    for i in range(4):
        if map[row + i][col - i] == map[row + i + 1][col - i - 1]:
            score = score + 1
        else:
            break
    if score == 5:
        return True
while running:#事件运行
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            if x >= border_left and x <= border_right and y >= border_top and y <= border_bottom:  # 限制x的左右边
                col = round((x - 15)/30)#计算出x的位置
                row = round((y - 15)/30)#计算出y的位置
                if map[row][col]== 0:
                    print(row+1,col+1)#打印出x与y的位置
                   # map[row][col] = 1#等于1表示把它的数值存储起来
                    map[row][col] = player#
                    if(check(row,col)):#如果检测到五子连线了那么打印赢了
                        #print("有人赢了")
                        winner = player#把赢赋值给winner
                    else:
                        if player == 1:#当点击事件后
                            player = 2 #2是黑子
                        else:
                            player = 1#下一次是白子
                else:
                    print("当前位置已经被占领了")
    screen.fill([125,95,24])#给屏幕画上颜色

    for x in range(15):#画出15条竖线
         pygame.draw.line(screen, (255, 0, 0),[border_left+width*x,border_top],[border_left+width*x,border_bottom],2)
    for y in range(15):#画出15条横线
         pygame.draw.line(screen, (255, 0, 0),[border_left,border_top+height*y],[border_right,border_top+height*y],2)
    x,y = pygame.mouse.get_pos()#获取鼠标所在位置
    if x >=border_left and x<=border_right and y>=border_top and y<=border_bottom:#限制x的左右边缘和y的上下边缘
        x = round((x - border_left)/width)*width + border_left#找到x和y的交叉点
        y = round((y - border_top)/width)*width + border_top#找到x和y的交叉点
        pygame.draw.rect(screen,(255, 0, 0),[x-15,y-15,30,30],2)#画一个正方形框框,表示可以落子

    #pygame.draw.rect(screen,(153, 51, 250),[50,750,100,50],2)#画一个正方形框框,表示按钮
    #text_surface = font.render("双人对战",True,(200,200,200))#双人对战按钮的颜色
    #text_position = (50,750)#双人对战按钮的位置坐标
    #screen.blit(text_surface,text_position)##双人对战按钮的颜色
    pygame.draw.circle(screen, (255, 0, 0),[25+30*7,25+30*7],8)#棋盘中间画出一个中心点
    button = Button(30,470,100,30,"双人模式",(153,51,250),(221,160,221),(255,255,255))#画一个双人模式按钮,调用类Button实例化对象button(x坐标,Y坐标,文本内容,文本颜色)
    button.draw(screen)#画一个双人模式按钮,调用方法draw
    button = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
    button.draw(screen)  # 画一个机器人式按钮

    for row in range(15):#棋盘上画出白色棋子
        for col in range(15):#棋盘上画出白色棋
            if map[row][col] == 1:#点击后在棋盘上画出白色棋
                pygame.draw.circle(screen,(255, 255, 255),[col*width+border_left,row*height+border_top],15)#棋盘上画出白色棋的位置和大小半径
            if map[row][col] == 2:  # 点击后在棋盘上画出白色棋
                pygame.draw.circle(screen, (000, 000, 000), [col * width + border_left, row * height +border_top ], 15)  #当时玩家2时棋盘上画出黑色棋子
    pygame.display.update()  # 刷新,变色用的
    if(winner !=0):
        if winner ==1:
            text ="白子赢了,倒计时3秒退出"
            color = (255,255,255,255,)
        else:
            text = '黑子赢了,倒计时3秒退出'
            #text = 'black won,countdown to 3 seconds更改'
            color = (0,0,0,0)
        #font = pygame.font.Font(None,30)#使用默认字体英文字体
        font = pygame.font.Font("font.ttf", 20)#使用汉语字体提示
        text_surface = font.render(text,True,color)#字体的表面颜色
        text_position = (60,60)#字体的坐标
        screen.blit(text_surface,text_position)#开始绘画字体文本
        pygame.display.update()  # 刷新,变色用的
        pygame.time.wait(3000)#显示字体等待3秒
        running = False#程序关闭
pygame.quit()#退出游戏

5,当在第15格也就是边界时会报错

五子棋游戏,游戏

添加try  except     break后就可以,比对坐标超过16行了,也不报错了,程序继续运行

五子棋游戏,游戏

到这里这个游戏基本完成了

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((490,590))#设置游戏屏幕大小
#screen = pygame.display.set_mode((750,850))#设置游戏屏幕大小
pygame.display.set_caption("这是五子棋游戏")
border_left =25
border_right =445
border_top = 25
border_bottom = 445
width = 30
height = 30


map = [0]*15#创建一个列表
for i in range(15):#列表循环来存储数据
    map[i] = [0]*15#二维列表来存储数据
player = 1#创建玩家1
winner = 0#创建一个变量,看看是谁赢了
running = True
#font = pygame.font.Font(None,30)#使用默认字体英文字体
font = pygame.font.Font("font.ttf", 24)#使用汉语字体大小24
#font = pygame.font.Font("font.ttf",70)
class Button:#定义按钮的类
    def __init__(self,x,y,width,height,text,color,click_color,text_color):#初始化
        self.text = text#定义内容
        self.color = color#定义颜色
        self.click_color = click_color#定义点击后的颜色
        self.text_color = text_color#定义文本颜色
        self.rect = pygame.Rect(x,y,width,height)#定义按钮的大小
        self.clicked = False#不点击
    def draw(self,screen):#定义方法生成出按钮
        if self.clicked:
            pygame.draw.rect(screen,self.click_color,self.rect)#画出按钮
        else:
            pygame.draw.rect(screen,self.color,self.rect)
        text_surface = font.render(self.text,True,self.text_color)#双人对战按钮的颜色
        text_rect = text_surface.get_rect(center = self.rect.center)#双人对战按钮的位置坐标
        screen.blit(text_surface,text_rect)##双人对战按钮的颜色
def check(row,col):#创建check函数检测五子连线

    #判断左右方向是否五子连线
    score = 1
    for i in range(4):
        try:
            if map[row][col+i] == map[row][col+i+1]:
                score = score + 1
            else:
                break
        except:
            break
    for i in range(4):
        try:
            if map[row][col-i] == map[row][col-i-1]:
                score = score + 1
            else:
                break
        except:
            break
    if score == 5:
        return True

    # 判断上下方向是否五子连线
    score = 1
    for i in range(4):
        try:
            if map[row+i][col] == map[row+i+1][col]:
                score = score + 1
            else:
                break
        except:
            break
    for i in range(4):
        try:
            if map[row-i][col] == map[row-i-1][col]:
                score = score + 1
            else:
                break
        except:
            break
    if score == 5:
        return True
    # 判断左下右上方向是否五子连线(左下行和列都减小,右上行和列都变大)
    score = 1
    for i in range(4):
        try:
            if map[row+i][col+i] == map[row+i+1][col+i+1]:
                score = score + 1
            else:
                break
        except:
            break
    for i in range(4):
        try:
            if map[row-i][col-i] == map[row-i-1][col-i-1]:
                score = score + 1
            else:
                break
        except:
            break
    if score == 5:
        return True

     # 判断左上右下方向是否五子连线(左上行增加列减小,右下行变大,列变小)
    score = 1
    for i in range(4):
        try:
            if map[row - i][col + i] == map[row - i - 1][col + i + 1]:
                score = score + 1
            else:
                break
        except:
            break
    for i in range(4):
        try:
            if map[row + i][col - i] == map[row + i + 1][col - i - 1]:
                score = score + 1
            else:
                break
        except:
            break
    if score == 5:
        return True
while running:#事件运行
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            if x >= border_left and x <= border_right and y >= border_top and y <= border_bottom:  # 限制x的左右边
                col = round((x - 15)/30)#计算出x的位置
                row = round((y - 15)/30)#计算出y的位置
                if map[row][col]== 0:
                    print(row+1,col+1)#打印出x与y的位置
                   # map[row][col] = 1#等于1表示把它的数值存储起来
                    map[row][col] = player#
                    if(check(row,col)):#如果检测到五子连线了那么打印赢了
                        #print("有人赢了")
                        winner = player#把赢赋值给winner
                    else:
                        if player == 1:#当点击事件后
                            player = 2 #2是黑子
                        else:
                            player = 1#下一次是白子
                else:
                    print("当前位置已经被占领了")
    screen.fill([125,95,24])#给屏幕画上颜色

    for x in range(15):#画出15条竖线
         pygame.draw.line(screen, (255, 0, 0),[border_left+width*x,border_top],[border_left+width*x,border_bottom],2)
    for y in range(15):#画出15条横线
         pygame.draw.line(screen, (255, 0, 0),[border_left,border_top+height*y],[border_right,border_top+height*y],2)
    x,y = pygame.mouse.get_pos()#获取鼠标所在位置
    if x >=border_left and x<=border_right and y>=border_top and y<=border_bottom:#限制x的左右边缘和y的上下边缘
        x = round((x - border_left)/width)*width + border_left#找到x和y的交叉点
        y = round((y - border_top)/width)*width + border_top#找到x和y的交叉点
        pygame.draw.rect(screen,(255, 0, 0),[x-15,y-15,30,30],2)#画一个正方形框框,表示可以落子

    #pygame.draw.rect(screen,(153, 51, 250),[50,750,100,50],2)#画一个正方形框框,表示按钮
    #text_surface = font.render("双人对战",True,(200,200,200))#双人对战按钮的颜色
    #text_position = (50,750)#双人对战按钮的位置坐标
    #screen.blit(text_surface,text_position)##双人对战按钮的颜色
    pygame.draw.circle(screen, (255, 0, 0),[25+30*7,25+30*7],8)#棋盘中间画出一个中心点
    button = Button(30,470,100,30,"双人模式",(153,51,250),(221,160,221),(255,255,255))#画一个双人模式按钮
    button.draw(screen)#画一个双人模式按钮
    button = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
    button.draw(screen)  # 画一个机器人式按钮

    for row in range(15):#棋盘上画出白色棋子
        for col in range(15):#棋盘上画出白色棋
            if map[row][col] == 1:#点击后在棋盘上画出白色棋
                pygame.draw.circle(screen,(255, 255, 255),[col*width+border_left,row*height+border_top],15)#棋盘上画出白色棋的位置和大小半径
            if map[row][col] == 2:  # 点击后在棋盘上画出白色棋
                pygame.draw.circle(screen, (000, 000, 000), [col * width + border_left, row * height +border_top ], 15)  #当时玩家2时棋盘上画出黑色棋子
    pygame.display.update()  # 刷新,变色用的
    if(winner !=0):
        if winner ==1:
            text ="白子赢了,倒计时3秒后退出"
            color = (255,255,255,255,)
        else:
            text = '黑子赢了,倒计时3秒后退出'
            #text = 'black won,countdown to 3 seconds更改'
            color = (0,0,0,0)
        #font = pygame.font.Font(None,30)#使用默认字体英文字体
        font = pygame.font.Font("font.ttf", 20)#使用汉语字体提示
        text_surface = font.render(text,True,color)#字体的颜色
        text_position = (60,60)#字体的坐标
        screen.blit(text_surface,text_position)
        pygame.display.update()  # 刷新,变色用的
        pygame.time.wait(3000)#显示字体等待3秒
        running = False#程序关闭
pygame.quit()#退出游戏

创建类把游戏分成2大块,创建2个类分别是按钮类和游戏类,游戏类里面定义三个方法1,开始方法,2检查方法。3是鼠标点击方法

五子棋游戏,游戏

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((490,590))#设置游戏屏幕大小
#screen = pygame.display.set_mode((750,850))#设置游戏屏幕大小
pygame.display.set_caption("这是五子棋游戏")
border_left =25
border_right =445
border_top = 25
border_bottom = 445
width = 30
height = 30
running = True
#font = pygame.font.Font(None,30)#使用默认字体英文字体
font = pygame.font.Font("font.ttf", 24)#使用汉语字体大小24
#font = pygame.font.Font("font.ttf",70)
class Button:#定义按钮的类
    def __init__(self,x,y,width,height,text,color,click_color,text_color):#初始化
        self.text = text#定义内容
        self.color = color#定义颜色
        self.click_color = click_color#定义点击后的颜色
        self.text_color = text_color#定义文本颜色
        self.rect = pygame.Rect(x,y,width,height)#定义按钮的大小
        self.clicked = False#不点击
    def draw(self,screen):#定义方法生成出按钮
        if self.clicked:
            pygame.draw.rect(screen,self.click_color,self.rect)#画出按钮
        else:
            pygame.draw.rect(screen,self.color,self.rect)
        text_surface = font.render(self.text,True,self.text_color)#双人对战按钮的颜色
        text_rect = text_surface.get_rect(center = self.rect.center)#双人对战按钮的位置坐标
        screen.blit(text_surface,text_rect)##双人对战按钮的颜色cla
class Game:
    def __init__(self):
        self.player = 1  # 创建玩家1
        self.winner = 0  # 创建一个变量,看看是谁赢了
        self.map = [0] * 15  # 创建一个列表
        for i in range(15):  # 列表循环来存储数据
            self.map[i] = [0] * 15  # 二维列表来存储数据
    def start(self):
        screen.fill([125, 95, 24])  # 给屏幕画上颜色
        for x in range(15):  # 画出15条竖线
            pygame.draw.line(screen, (255, 0, 0), [border_left + width * x, border_top],
                             [border_left + width * x, border_bottom], 2)
        for y in range(15):  # 画出15条横线
            pygame.draw.line(screen, (255, 0, 0), [border_left, border_top + height * y],
                             [border_right, border_top + height * y], 2)
        x, y = pygame.mouse.get_pos()  # 获取鼠标所在位置
        if x >= border_left and x <= border_right and y >= border_top and y <= border_bottom:  # 限制x的左右边缘和y的上下边缘
            x = round((x - border_left) / width) * width + border_left  # 找到x和y的交叉点
            y = round((y - border_top) / width) * width + border_top  # 找到x和y的交叉点
            pygame.draw.rect(screen, (255, 0, 0), [x - 15, y - 15, 30, 30], 2)  # 画一个正方形框框,表示可以落子

        # pygame.draw.rect(screen,(153, 51, 250),[50,750,100,50],2)#画一个正方形框框,表示按钮
        # text_surface = font.render("双人对战",True,(200,200,200))#双人对战按钮的颜色
        # text_position = (50,750)#双人对战按钮的位置坐标
        # screen.blit(text_surface,text_position)##双人对战按钮的颜色
        pygame.draw.circle(screen, (255, 0, 0), [25 + 30 * 7, 25 + 30 * 7], 8)  # 棋盘中间画出一个中心点
        #button = Button(30, 470, 100, 30, "双人模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个双人模式按钮
        button.draw(screen)  # 画一个双人模式按钮
        #button_ai = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
        button_ai.draw(screen)  # 画一个机器人式按钮

        for row in range(15):  # 棋盘上画出白色棋子
            for col in range(15):  # 棋盘上画出白色棋
                if self.map[row][col] == 1:  # 点击后在棋盘上画出白色棋
                    pygame.draw.circle(screen, (255, 255, 255), [col * width + border_left, row * height + border_top],
                                       15)  # 棋盘上画出白色棋的位置和大小半径
                if self.map[row][col] == 2:  # 点击后在棋盘上画出白色棋
                    pygame.draw.circle(screen, (000, 000, 000), [col * width + border_left, row * height + border_top],
                                       15)  # 当时玩家2时棋盘上画出黑色棋子

        if (self.winner != 0):
            if self.winner == 1:
                text = "白子赢了,倒计时3秒后退出"
                color = (255, 255, 255, 255,)
            else:
                text = '黑子赢了,倒计时3秒后退出'
                # text = 'black won,countdown to 3 seconds更改'
                color = (0, 0, 0, 0)
            # font = pygame.font.Font(None,30)#使用默认字体英文字体
            font = pygame.font.Font("font.ttf", 20)  # 使用汉语字体提示
            text_surface = font.render(text, True, color)  # 字体的颜色
            text_position = (60, 60)  # 字体的坐标
            screen.blit(text_surface, text_position)
            pygame.display.update()  # 刷新,变色用的
            pygame.time.wait(3000)  # 显示字体等待3秒
            running = False  # 程序关闭
    def check(self,row, col):  # 创建check函数检测五子连线
            # 判断左右方向是否五子连线
            score = 1
            for i in range(4):
                try:
                    if self.map[row][col + i] == self.map[row][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row][col - i] == self.map[row][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True

            # 判断上下方向是否五子连线
            score = 1
            for i in range(4):
                try:
                    if self.map[row + i][col] == self.map[row + i + 1][col]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row - i][col] == self.map[row - i - 1][col]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True
            # 判断左下右上方向是否五子连线(左下行和列都减小,右上行和列都变大)
            score = 1
            for i in range(4):
                try:
                    if self.map[row + i][col + i] == self.map[row + i + 1][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row - i][col - i] == self.map[row - i - 1][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True

            # 判断左上右下方向是否五子连线(左上行增加列减小,右下行变大,列变小)
            score = 1
            for i in range(4):
                try:
                    if self.map[row - i][col + i] == self.map[row - i - 1][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row + i][col - i] == self.map[row + i + 1][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True
    def mouseClick(self,x,y):
        if x >= border_left and x <= border_right and y >= border_top and y <= border_bottom:  # 限制x的左右边
            col = round((x - 15) / 30)  # 计算出x的位置
            row = round((y - 15) / 30)  # 计算出y的位置
            if self.map[row][col] == 0:
                print(row + 1, col + 1)  # 打印出x与y的位置
                # self.map[row][col] = 1#等于1表示把它的数值存储起来
                self.map[row][col] = self.player  #
                if (self.check(row, col)):  # 如果检测到五子连线了那么打印赢了
                    # print("有人赢了")
                    self.winner = self.player  # 把赢赋值给winner
                else:
                    if self.player == 1:  # 当点击事件后
                        self.player = 2  # 2是黑子
                    else:
                        self.player = 1  # 下一次是白子
            else:
                print("当前位置已经被占领了")
button = Button(30, 470, 100, 30, "双人模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个双人模式按钮
button_ai = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
game = Game()
while running:#事件运行
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            game.mouseClick(x,y)

    game.start()
    pygame.display.update()  # 刷新,变色用的

pygame.quit()#退出游戏

实现了点“ 双人模式”开始玩游戏,没有点击双人“双人模式前”不能在棋盘上落子看到棋子

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((490,590))#设置游戏屏幕大小
#screen = pygame.display.set_mode((750,850))#设置游戏屏幕大小
pygame.display.set_caption("这是五子棋游戏")
border_left =25
border_right =445
border_top = 25
border_bottom = 445
width = 30
height = 30
#running = True
#font = pygame.font.Font(None,30)#使用默认字体英文字体
font = pygame.font.Font("font.ttf", 24)#使用汉语字体大小24
#font = pygame.font.Font("font.ttf",70)
class Button:#定义按钮的类
    def __init__(self,x,y,width,height,text,color,click_color,text_color):#初始化
        self.text = text#定义内容
        self.color = color#定义颜色
        self.click_color = click_color#定义点击后的颜色
        self.text_color = text_color#定义文本颜色
        self.rect = pygame.Rect(x,y,width,height)#定义按钮的大小
        self.clicked = False#不点击
    def draw(self,screen):#定义方法生成出按钮
        if self.clicked:
            pygame.draw.rect(screen,self.click_color,self.rect)#画出按钮
        else:
            pygame.draw.rect(screen,self.color,self.rect)
        text_surface = font.render(self.text,True,self.text_color)#双人对战按钮的颜色
        text_rect = text_surface.get_rect(center = self.rect.center)#双人对战按钮的位置坐标
        screen.blit(text_surface,text_rect)##双人对战按钮的颜色cla
    def handle_event(self,event,game):
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            if self.rect.collidepoint(event.pos):
                if(self.clicked):
                    self.clicked = False
                    print("游戏开始了,别点了")
                else:
                    self.clicked = True
                    game.started = True
                    print("点击,已经开始")


class Game:
    def __init__(self):
        self.started = False#游戏默认是不能玩的
        self.player = 1  # 创建玩家1
        self.winner = 0  # 创建一个变量,看看是谁赢了
        self.map = [0] * 15  # 创建一个列表
        for i in range(15):  # 列表循环来存储数据
            self.map[i] = [0] * 15  # 二维列表来存储数据
    def start(self):
        screen.fill([125, 95, 24])  # 给屏幕画上颜色
        for x in range(15):  # 画出15条竖线
            pygame.draw.line(screen, (255, 0, 0), [border_left + width * x, border_top],
                             [border_left + width * x, border_bottom], 2)
        for y in range(15):  # 画出15条横线
            pygame.draw.line(screen, (255, 0, 0), [border_left, border_top + height * y],
                             [border_right, border_top + height * y], 2)
        x, y = pygame.mouse.get_pos()  # 获取鼠标所在位置
        if x >= border_left and x <= border_right and y >= border_top and y <= border_bottom:  # 限制x的左右边缘和y的上下边缘
            x = round((x - border_left) / width) * width + border_left  # 找到x和y的交叉点
            y = round((y - border_top) / width) * width + border_top  # 找到x和y的交叉点
            pygame.draw.rect(screen, (255, 0, 0), [x - 15, y - 15, 30, 30], 2)  # 画一个正方形框框,表示可以落子

        # pygame.draw.rect(screen,(153, 51, 250),[50,750,100,50],2)#画一个正方形框框,表示按钮
        # text_surface = font.render("双人对战",True,(200,200,200))#双人对战按钮的颜色
        # text_position = (50,750)#双人对战按钮的位置坐标
        # screen.blit(text_surface,text_position)##双人对战按钮的颜色
        pygame.draw.circle(screen, (255, 0, 0), [25 + 30 * 7, 25 + 30 * 7], 8)  # 棋盘中间画出一个中心点
        #button = Button(30, 470, 100, 30, "双人模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个双人模式按钮
        button.draw(screen)  # 画一个双人模式按钮
        #button_ai = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
        button_ai.draw(screen)  # 画一个机器人式按钮

        for row in range(15):  # 棋盘上画出白色棋子
            for col in range(15):  # 棋盘上画出白色棋
                if self.map[row][col] == 1:  # 点击后在棋盘上画出白色棋
                    pygame.draw.circle(screen, (255, 255, 255), [col * width + border_left, row * height + border_top],
                                       15)  # 棋盘上画出白色棋的位置和大小半径
                if self.map[row][col] == 2:  # 点击后在棋盘上画出白色棋
                    pygame.draw.circle(screen, (000, 000, 000), [col * width + border_left, row * height + border_top],
                                       15)  # 当时玩家2时棋盘上画出黑色棋子

        if (self.winner != 0):
            if self.winner == 1:
                text = "白子赢了,倒计时3秒后退出"
                color = (255, 255, 255, 255,)
            else:
                text = '黑子赢了,倒计时3秒后退出'
                # text = 'black won,countdown to 3 seconds更改'
                color = (0, 0, 0, 0)
            # font = pygame.font.Font(None,30)#使用默认字体英文字体
            font = pygame.font.Font("font.ttf", 20)  # 使用汉语字体提示
            text_surface = font.render(text, True, color)  # 字体的颜色
            text_position = (60, 60)  # 字体的坐标
            screen.blit(text_surface, text_position)
            pygame.display.update()  # 刷新,变色用的
            pygame.time.wait(3000)  # 显示字体等待3秒
            #running = False  # 程序关闭
            button.clicked = False#赢了后点击“双人模式”继续游戏
    def check(self,row, col):  # 创建check函数检测五子连线
            # 判断左右方向是否五子连线
            score = 1
            for i in range(4):
                try:
                    if self.map[row][col + i] == self.map[row][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row][col - i] == self.map[row][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True

            # 判断上下方向是否五子连线
            score = 1
            for i in range(4):
                try:
                    if self.map[row + i][col] == self.map[row + i + 1][col]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row - i][col] == self.map[row - i - 1][col]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True
            # 判断左下右上方向是否五子连线(左下行和列都减小,右上行和列都变大)
            score = 1
            for i in range(4):
                try:
                    if self.map[row + i][col + i] == self.map[row + i + 1][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row - i][col - i] == self.map[row - i - 1][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True

            # 判断左上右下方向是否五子连线(左上行增加列减小,右下行变大,列变小)
            score = 1
            for i in range(4):
                try:
                    if self.map[row - i][col + i] == self.map[row - i - 1][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row + i][col - i] == self.map[row + i + 1][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True
    def mouse_Click(self,x,y):
        if x >= border_left and x <= border_right and y >= border_top and y <= border_bottom:  # 限制x的左右边
            if self.started:#点击“双人模式”后可以玩游戏
                col = round((x - 15) / 30)  # 计算出x的位置
                row = round((y - 15) / 30)  # 计算出y的位置
                if self.map[row][col] == 0:
                    print(row + 1, col + 1)  # 打印出x与y的位置
                    # self.map[row][col] = 1#等于1表示把它的数值存储起来
                    self.map[row][col] = self.player  #
                    if (self.check(row, col)):  # 如果检测到五子连线了那么打印赢了
                        # print("有人赢了")
                        self.winner = self.player  # 把赢赋值给winner
                    else:
                        if self.player == 1:  # 当点击事件后
                            self.player = 2  # 2是黑子
                        else:
                            self.player = 1  # 下一次是白子
                else:
                    print("当前位置已经被占领了")
            else:
                print("请点击了双人模式 后才能玩游戏了")
button = Button(30, 470, 100, 30, "双人模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个双人模式按钮
button_ai = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
game = Game()
while True:#事件运行
    for event in pygame.event.get():
        button.handle_event(event,game)
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
            pygame.quit()  # 退出游戏
            exit()#系统级别的退出
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            game.mouse_Click(x,y)

    game.start()
    pygame.display.update()  # 刷新,变色用的

实现下完棋后,棋盘清空,等待三秒可以点击“双人模式”再次打开游戏

完整代码如下:在pycharm当中运行,python3,7文章来源地址https://www.toymoban.com/news/detail-752824.html

import pygame #导入pygame模块
pygame.init()#初始化
screen = pygame.display.set_mode((490,590))#设置游戏屏幕大小
#screen = pygame.display.set_mode((750,850))#设置游戏屏幕大小
pygame.display.set_caption("这是五子棋游戏")
border_left =25
border_right =445
border_top = 25
border_bottom = 445
width = 30
height = 30
#running = True
#font = pygame.font.Font(None,30)#使用默认字体英文字体
font = pygame.font.Font("font.ttf", 24)#使用汉语字体大小24
#font = pygame.font.Font("font.ttf",70)
class Button:#定义按钮的类
    def __init__(self,x,y,width,height,text,color,click_color,text_color):#初始化
        self.text = text#定义内容
        self.color = color#定义颜色
        self.click_color = click_color#定义点击后的颜色
        self.text_color = text_color#定义文本颜色
        self.rect = pygame.Rect(x,y,width,height)#定义按钮的大小
        self.clicked = False#不点击
    def draw(self,screen):#定义方法生成出按钮
        if self.clicked:
            pygame.draw.rect(screen,self.click_color,self.rect)#画出按钮
        else:
            pygame.draw.rect(screen,self.color,self.rect)
        text_surface = font.render(self.text,True,self.text_color)#双人对战按钮的颜色
        text_rect = text_surface.get_rect(center = self.rect.center)#双人对战按钮的位置坐标
        screen.blit(text_surface,text_rect)##双人对战按钮的颜色cla
    def handle_event(self,event,game):
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            if self.rect.collidepoint(event.pos):
                if(self.clicked):
                    self.clicked = False
                    print("游戏开始了,别点了")
                else:
                    if game.winner == 0:#游戏开始没有人玩的状态
                        self.clicked = True
                        game.started = True

                        print("点击,已经开始")
                    else:
                        self.clicked = True
                        #game.started = False  # 游戏默认是不能玩的
                        game.started = True # 游戏默认是不能玩的
                        game.player = 1  # 玩家1
                        game.winner = 0  # 创建一个变量,看看是谁赢了
                        game.map = [0] * 15  # 创建一个列表
                        for i in range(15):  # 列表循环来存储数据
                            game.map[i] = [0] * 15  # 二维列表来存储数据
                        print("点 双人模式 重新开始游戏")


class Game:
    def __init__(self):
        self.started = False#游戏默认是不能玩的
        self.player = 1  # 创建玩家1
        self.winner = 0  # 创建一个变量,看看是谁赢了
        self.map = [0] * 15  # 创建一个列表
        for i in range(15):  # 列表循环来存储数据
            self.map[i] = [0] * 15  # 二维列表来存储数据
    def start(self):
        screen.fill([125, 95, 24])  # 给屏幕画上颜色
        for x in range(15):  # 画出15条竖线
            pygame.draw.line(screen, (255, 0, 0), [border_left + width * x, border_top],
                             [border_left + width * x, border_bottom], 2)
        for y in range(15):  # 画出15条横线
            pygame.draw.line(screen, (255, 0, 0), [border_left, border_top + height * y],
                             [border_right, border_top + height * y], 2)
        x, y = pygame.mouse.get_pos()  # 获取鼠标所在位置
        if x >= border_left and x <= border_right and y >= border_top and y <= border_bottom:  # 限制x的左右边缘和y的上下边缘
            x = round((x - border_left) / width) * width + border_left  # 找到x和y的交叉点
            y = round((y - border_top) / width) * width + border_top  # 找到x和y的交叉点
            pygame.draw.rect(screen, (255, 0, 0), [x - 15, y - 15, 30, 30], 2)  # 画一个正方形框框,表示可以落子

        # pygame.draw.rect(screen,(153, 51, 250),[50,750,100,50],2)#画一个正方形框框,表示按钮
        # text_surface = font.render("双人对战",True,(200,200,200))#双人对战按钮的颜色
        # text_position = (50,750)#双人对战按钮的位置坐标
        # screen.blit(text_surface,text_position)##双人对战按钮的颜色
        pygame.draw.circle(screen, (255, 0, 0), [25 + 30 * 7, 25 + 30 * 7], 8)  # 棋盘中间画出一个中心点
        #button = Button(30, 470, 100, 30, "双人模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个双人模式按钮
        button.draw(screen)  # 画一个双人模式按钮
        #button_ai = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
        button_ai.draw(screen)  # 画一个机器人式按钮

        for row in range(15):  # 棋盘上画出白色棋子
            for col in range(15):  # 棋盘上画出白色棋
                if self.map[row][col] == 1:  # 点击后在棋盘上画出白色棋
                    pygame.draw.circle(screen, (255, 255, 255), [col * width + border_left, row * height + border_top],
                                       15)  # 棋盘上画出白色棋的位置和大小半径
                if self.map[row][col] == 2:  # 点击后在棋盘上画出白色棋
                    pygame.draw.circle(screen, (000, 000, 000), [col * width + border_left, row * height + border_top],
                                       15)  # 当时玩家2时棋盘上画出黑色棋子

        if (self.winner != 0):
            if self.winner == 1:
                text = "白子赢了,倒计时3秒后退出"
                color = (255, 255, 255, 255,)
            else:
                text = '黑子赢了,倒计时3秒后退出'
                # text = 'black won,countdown to 3 seconds更改'
                color = (0, 0, 0, 0)
            # font = pygame.font.Font(None,30)#使用默认字体英文字体
            font = pygame.font.Font("font.ttf", 20)  # 使用汉语字体提示
            text_surface = font.render(text, True, color)  # 字体的颜色
            text_position = (60, 60)  # 字体的坐标
            screen.blit(text_surface, text_position)
            pygame.display.update()  # 刷新,变色用的
            pygame.time.wait(3000)  # 显示字体等待3秒
            #running = False  # 程序关闭
            button.clicked = False#赢了后点击“双人模式”继续游戏
    def check(self,row, col):  # 创建check函数检测五子连线
            # 判断左右方向是否五子连线
            score = 1
            for i in range(4):
                try:
                    if self.map[row][col + i] == self.map[row][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row][col - i] == self.map[row][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True

            # 判断上下方向是否五子连线
            score = 1
            for i in range(4):
                try:
                    if self.map[row + i][col] == self.map[row + i + 1][col]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row - i][col] == self.map[row - i - 1][col]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True
            # 判断左下右上方向是否五子连线(左下行和列都减小,右上行和列都变大)
            score = 1
            for i in range(4):
                try:
                    if self.map[row + i][col + i] == self.map[row + i + 1][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row - i][col - i] == self.map[row - i - 1][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True

            # 判断左上右下方向是否五子连线(左上行增加列减小,右下行变大,列变小)
            score = 1
            for i in range(4):
                try:
                    if self.map[row - i][col + i] == self.map[row - i - 1][col + i + 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            for i in range(4):
                try:
                    if self.map[row + i][col - i] == self.map[row + i + 1][col - i - 1]:
                        score = score + 1
                    else:
                        break
                except:
                    break
            if score == 5:
                return True
    def mouse_Click(self,x,y):
        if x >= border_left and x <= border_right and y >= border_top and y <= border_bottom:  # 限制x的左右边
            if self.started:#点击“双人模式”后可以玩游戏
                col = round((x - 15) / 30)  # 计算出x的位置
                row = round((y - 15) / 30)  # 计算出y的位置
                if self.map[row][col] == 0:
                    print(row + 1, col + 1)  # 打印出x与y的位置
                    # self.map[row][col] = 1#等于1表示把它的数值存储起来
                    self.map[row][col] = self.player  #
                    if (self.check(row, col)):  # 如果检测到五子连线了那么打印赢了
                        # print("有人赢了")
                        self.winner = self.player  # 把赢赋值给winner
                    else:
                        if self.player == 1:  # 当点击事件后
                            self.player = 2  # 2是黑子
                        else:
                            self.player = 1  # 下一次是白子
                else:
                    print("当前位置已经被占领了")
            else:
                print("请点击了双人模式 后才能玩游戏了")
button = Button(30, 470, 100, 30, "双人模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个双人模式按钮
button_ai = Button(200, 470, 100, 30, "AI模式", (153, 51, 250), (221, 160, 221), (255, 255, 255))  # 画一个机器人模式按钮
game = Game()
while True:#事件运行
    for event in pygame.event.get():
        button.handle_event(event,game)
        if event.type == pygame.QUIT:#当点击事件后退出
            running = False  #事件关闭
            pygame.quit()  # 退出游戏
            exit()#系统级别的退出
        elif event.type == pygame.MOUSEBUTTONDOWN:#鼠标相应点击事件
            x,y = pygame.mouse.get_pos()#获取x,y的位置
            game.mouse_Click(x,y)

    game.start()
    pygame.display.update()  # 刷新,变色用的

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

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

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

相关文章

  • 基于C#的五子棋游戏设计

    目 录 一、 毕业设计内容 3 二、 毕业设计目的 3 三、 工具/准备工作 3 四、 设计步骤和方法 3 (一) 总体设计 3 1. 总体设计思路及设计图 3 2. 界面设计 4 3. 全局变量设计 4 (二) 详细设计 5 1. 刷新棋盘 5 2. 绘制棋盘 5 3. 分步计时 5 4. 显示光标 6 5. 判断胜负 8 6.

    2024年02月04日
    浏览(55)
  • 前端技术搭建五子棋游戏(内含源码)

    上周我们实通过前端基础实现了拼图游戏,今天还是继续按照我们原定的节奏来带领大家完成一个五子棋游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 在前面的文章当中我们也提及到我们在本系列的专栏是

    2024年02月12日
    浏览(60)
  • 五子棋游戏AI智能算法设计

    五子棋游戏C语言AI智能算法设计  近来发现编制五子棋游戏很有趣,尤其是AI智能算法很烧脑。网上介绍有什么贪心算法,剪枝算法,博弈树算法等等,不一而足。 对于人机对战的电脑智能应子算法,参阅很多五子棋书籍棋谱和五子棋竞赛的对抗棋谱。我感到白棋的后手防御

    2024年02月06日
    浏览(48)
  • 用Java写一个简易五子棋游戏

     一. 程序基本思路: 1.写窗口、棋盘面板、控制面板; 2.绘制棋盘; 3.绘制棋子; 4.添加组件功能; 5.判断输赢; 6.悔棋; 7.复盘。 二.实际操作 1.创建窗口、添加面板 效果图:  2.绘制棋盘   为了棋盘线在窗体刷新后仍能保存,我们直接重写chesspanel的paint方法,将棋盘绘

    2024年02月06日
    浏览(41)
  • 用c++实现五子棋小游戏

    五子棋是一款经典小游戏,今天我们就用c++实现简单的五子棋小游戏 目录 用到的算法: 思路分析 定义变量  开始写代码   完整代码  结果图: 合法移动的判断: isValidMove 函数通过检查指定位置是否在棋盘范围内,并且该位置是否为空位来确定是否为合法的移动。 获胜条

    2024年02月07日
    浏览(53)
  • C++课程设计报告——简易五子棋游戏

    五子棋是是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子在棋盘交替下棋,先形成五子连线者获胜。此次课程设计主要目的是实现五子棋的双人对弈,对战双方通过鼠标点击进行对弈。 游戏通过鼠标点击实现下棋,黑白子交替下棋。 程序通过使用e

    2024年02月13日
    浏览(38)
  • 五子棋游戏禁手算法的改进

    五子棋游戏禁手算法的改进 五子棋最新的禁手规则: 1.黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”(包括“四三三”)、“四四”(包括“四四三”)和“长连”。黑棋只能以“四三”取胜。 2.黑方五连与禁手同时形成,判黑方胜。 3.黑方禁手形成时,白方应立即

    2024年02月10日
    浏览(33)
  • Java实现五子棋小游戏(附源码)

      铜9铁10已经结束了,但还是有很多Java程序员没有找到工作或者成功跳槽,跳槽成功的也只是从一个坑中,跳入另一个坑中…… ​ 在LZ看来,真正有意义的就业与跳槽,是要进入到一个有绝对潜力的行业或者薪资能实现爆炸式增长的。这件事不容易,但也没有想象的遥不可

    2024年02月08日
    浏览(55)
  • Android Studio实现五子棋小游戏

    五子棋是一种两人对弈的策略型棋类游戏,本次五子棋小游戏具有人机对战和人人对战两种玩法。人机对战可以单人挑战AI,实时记录比赛得分,AI是根据棋盘上每个点的得分进行决策,人人对战采用轮流下棋方式进行对决,下棋过程中会记录当前棋子的颜色。可以在下棋过程

    2024年02月08日
    浏览(44)
  • Unity 简单联网游戏(双人五子棋)开发(二)

    前言:之前我们尝试开发了一个两个比拼分数的不像游戏的超简单的弱数据联网游戏,主要是想让一些没开发过联网游戏的人了解一下最基础的流程;不过有人仍然有人私信我表示看不懂,所以这次我们再开发一个类似的游戏,为了这个项目更像是一个游戏,而不是不像游戏

    2024年02月08日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包