您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python五子棋小游戏实例分享

51自学网 2021-10-30 22:13:45
  python
这篇教程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,pyautoguifrom pygame.locals import *# 初始参数cell_size = 40space = 80cell_num = 19grid_size = (cell_num - 1)*cell_size + space*2screen = 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()

输出

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


python 按照sheet合并多个Excel的示例代码(多个sheet)
python入门课程第五讲之序列和字符串
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。