• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python五子棋小游戏实例分享

    本文实例为大家分享了Python实现五子棋小游戏的具体代码,供大家参考,具体内容如下

    使用的库

    pygame、pyautogui

    流程简述

    1.画棋盘

    设置网格间隔40px ,留白 80 px ,与网格横竖线数量 ,初定19 × 19 。

    2.鼠标点击

    鼠标点击取得坐坐标(x0 , y0),再获得最近的网格上的点(x1 , y1),再将每次动作获得的(x1 , y1 )放入列表 chess_location 中。

    再通过:

    chess_location_b = chess_location[0::2]
    chess_location_w = chess_location[1::2]

    分别获得黑棋和白棋所走过的坐标。

    3.判断胜负

    这一块网上有很多不同的方法,我为了让大家读懂尽量写的详细了。
    首先 ,我们要知道连五有四个方向:竖直 ,水平 ,右上左下 , 右下左上 。
    每次将新落下的子分别进行4个方向的判断,判断是否出现连五及以上。
    我使用的方法是:

    def result(x): # x 为 chess_location_b 或者 chess_location_w
        # 竖直
        score = []
        for i in range(cell_num): #cell_num = 19
            if [x[-1][0], i ] in x:
                score.append([x[-1][0], i ])
                if score.__len__() >= 5:
                    return 1
            else:
                score =[]

    大概意思就是最新落下的(x1 , y1)中的竖直方向从上往下检查如果出现黑(白)棋 ,则将出现棋子的坐标加入列表 score 中 , 如果出现异色棋子或者没有棋子,则清空 score 中的元素 ,如果列表 score 中的元素数量大于等于5个 ,则分胜负 。
    如果棋子填满棋盘但是仍没有分出胜负 ,则平局 。

    代码及结果

    代码

    import pygame,pyautogui
    from pygame.locals import *
    # 初始参数
    cell_size = 40
    space = 80
    cell_num = 19
    grid_size = (cell_num - 1)*cell_size + space*2
    screen = pygame.display.set_mode([grid_size,grid_size],0,32)
    chess_location , chess_location_w , chess_location_b = [] , [] , []
    # 画棋盘
    def grid():
        screen.fill([208,173,108])
        font = pygame.font.SysFont("arial", 20)
        i = 0
        for x in range(0, cell_size * cell_num , cell_size):
            i += 1
            text_surface = font.render("{}".format(i), True, (0, 0, 0))
            screen.blit(text_surface,[(space - font.get_height()) - 10,(space - font.get_height()/2) + cell_size*(i -1 )])
            pygame.draw.line(screen, (0, 0, 0), (x + space, 0 + space), (x + space, cell_size * (cell_num - 1) + space), 2)
        i = 0
        for y in range(0, cell_size * cell_num, cell_size):
            i += 1
            text_surface = font.render("{}".format(chr(64 + i)), True, (0, 0, 0))
            screen.blit(text_surface,[(space + cell_size * (i - 1)) -5, (space - font.get_height() / 2) - 20])
            pygame.draw.line(screen, (0,0,0), (0 + space, y + space),(cell_size * (cell_num - 1) + space, y + space), 2)
    # 分胜负
    def result(x):
        # 竖直
        score = []
        for i in range(cell_num):
            if [x[-1][0], i ] in x:
                score.append([x[-1][0], i ])
                if score.__len__() >= 5:
                    return 1
            else:
                score =[]
        # 水平
        score = []
        for i in range(cell_num):
            if [i , x[-1][1]] in x:
                score.append([i , x[-1][1]])
                if score.__len__() >= 5:
                    return 1
            else:
                score = []
        # 右上左下
        score = []
        for i in range(cell_num):
            if [i,x[-1][0] + x[-1][1] - i] in x:
                score.append([i,x[-1][0] + x[-1][1] - i])
                if score.__len__() >= 5:
                    return 1
            else:
                score = []
        # 右下左上
        score = []
        for i in range(cell_num):
            if [x[-1][0] - x[-1][1] + i,i] in x:
                score.append([x[-1][0] - x[-1][1] + i,i])
                if score.__len__() >= 5:
                    return 1
            else:
                score = []
        # 平局
        if chess_location.__len__() == cell_num * cell_num :
            return 2
    # 主循环
    def running():
        global chess_location_w , chess_location_b
        while True:
            grid()
            for event in pygame.event.get():
                if event.type == QUIT:
                    exit()
                # 落子
                if event.type == MOUSEBUTTONDOWN:
                    x0 , y0 = pygame.mouse.get_pos()
                    if x0 > space and y0 > space and x0  space + cell_size*(cell_num - 1) and y0  space + cell_size * (cell_num - 1):
                        x1 = round((x0 - space) / cell_size)
                        y1 = round((y0 - space) / cell_size)
                        if [x1 , y1] not in chess_location:
                            chess_location.append([x1 , y1])
                # 悔棋
                elif event.type == KEYDOWN:
                    if event.key == K_LEFT:
                        chess_location.pop(-1)
            chess_location_b = chess_location[0::2]
            chess_location_w = chess_location[1::2]
            # 黑棋
            for i in chess_location_b:
                pygame.draw.circle(screen, [ 0 , 0 , 0 ], [i[0]* cell_size + space, i[1]* cell_size + space], 15, 0)
            # 白棋
            for i in chess_location_w:
                pygame.draw.circle(screen, [255,255,255], [i[0]* cell_size + space, i[1]* cell_size + space], 15, 0)
            # 判断胜负
            if chess_location_b and result(chess_location_b) == 1:
                pyautogui.alert(text='黑棋胜',title='游戏结束')
                exit()
            elif chess_location_w and result(chess_location_w) == 1:
                pyautogui.alert(text='白棋胜',title='游戏结束')
                exit()
            elif chess_location_b and chess_location_w:
                if result(chess_location_b) or result(chess_location_w) == 2:
                    pyautogui.alert(text='平局', title='游戏结束')
                    exit()
            pygame.display.update()
    
    
    if __name__ == '__main__':
        pygame.init()
        running()

    输出

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • python游戏实战项目之智能五子棋
    • python编写五子棋游戏
    • python实现网络五子棋
    • python实现双人五子棋(终端版)
    • Python tkinter制作单机五子棋游戏
    • python实现简单的五子棋游戏
    • python游戏实战项目之智能五子棋简易版
    上一篇:python 按照sheet合并多个Excel的示例代码(多个sheet)
    下一篇:Python摸鱼神器之利用树莓派opencv人脸识别自动控制电脑显示桌面
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python五子棋小游戏实例分享 Python,五子棋,小游戏,实例,