You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
5.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# -*- coding: utf-8 -*-
"""
Created on Wed Jun 1 20:59:24 2022
@author: Alsea
"""
import pygame
# 初始化pygame
pygame.init()
screen = pygame.display.set_mode((600, 600)) # 设置窗口长宽
pygame.display.set_caption('五子棋') # 设置 pygame 窗口名
space = 20 # 四周留下的边距
cell_size = 40 # 每个格子大小
cell_num = 15 #设置线条数
chess_arr = [] #创建列表记录落子位置
def get_one_dire_num(lx, ly, dx, dy, m):
#将最后的x坐标赋值给tx
tx = lx
#将最后的y坐标赋值给tx
ty = ly
#判断连子
s = 0
while True:
#判断上下左右斜方向是否有连子
tx += dx
ty += dy
#如果没有的连子的话返回当前连子数量
if tx < 0 or tx >= cell_num or ty < 0 or ty >= cell_num or m[ty][tx] == 0: return s
#连子累加 1
s+=1
def check_win(chess_arr, flag):
m = [[0] * cell_num for i in range(cell_num)] # 先定义一个15*15的全0的数组,不能用[[0]*cell_num]*cell_num的方式去定义因为一位数组会被重复引用
for x, y, c in chess_arr:
if c == flag:
m[y][x] = 1 # 上面有棋则标1
lx = chess_arr[-1][0] # 最后一个子的x
ly = chess_arr[-1][1] # 最后一个子的y
dire_arr = [[(-1, 0), (1, 0)], [(0, -1), (0, 1)], [(-1, -1), (1, 1)],
[(-1, 1), (1, -1)]] # 4个方向数组,往左往右、往上往下、往左上往右下、往左下往右上4组判断方向
for dire1, dire2 in dire_arr:
# 往左,往上,往左上,往左下判断是否有连子
dx, dy = dire1
num1 = get_one_dire_num(lx, ly, dx, dy, m)
# 往右,往下,往右下、往右上判断是否有连子
dx, dy = dire2
num2 = get_one_dire_num(lx, ly, dx, dy, m)
# 不同方向加起来的连子数为5的则获胜返回True
if num1 + num2 + 1 >= 5: return True
return False
flag = 1 # 1=》金 2=》橙
game_state = 1 # 游戏状态1.表示正常进行 2.表示白胜 3.表示黑胜
while True: # 死循环确保窗口一直显示
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
pygame.quit() #关闭 pygame 程序
exit() #结束程序
if game_state == 1 and event.type == pygame.MOUSEBUTTONUP: # 鼠标弹起
x, y = pygame.mouse.get_pos() # 获取鼠标位置
xi = int(round((x - space) * 1.0 / cell_size)) # 获取到x方向上取整的序号
yi = int(round((y - space) * 1.0 / cell_size)) # 获取到y方向上取整的序号
if xi >= 0 and xi < cell_num and yi >= 0 and yi < cell_num and (xi, yi,1) not in chess_arr and (xi, yi,2) not in chess_arr:
chess_arr.append((xi, yi,flag))
#调用函数判断下的该子是否获胜
if check_win(chess_arr, flag):
#若状态值为 1 则表示3否则表示2
game_state = 2 if flag == 1 else 3
else:
#若状态值为 1 则表示 2 否则为 1代表转换棋子
flag = 2 if flag == 1 else 1
screen.fill((135,206,235)) # 将界面设置天蓝色
#遍历横位置点步长为40
#pygame.draw.line(窗口, 线条颜色, 开始坐标, 结束坐标, 线条大小 )
for x in range(0, cell_size * cell_num, cell_size):
pygame.draw.line(screen, (0, 0, 0), (x + space, 0 + space),
(x + space, cell_size * (cell_num - 1) + space), 1)
# 遍历竖位置点步长为40
# pygame.draw.line(窗口, 线条颜色, 开始坐标, 结束坐标, 线条大小 )
for y in range(0, cell_size * cell_num, cell_size):
pygame.draw.line(screen, (0, 0, 0), (0 + space, y + space),
(cell_size * (cell_num - 1) + space, y + space), 1)
#绘制棋子
for x, y,c in chess_arr:
chess_color = (255,69,0) if c == 1 else (255,215,0)
pygame.draw.circle(screen, chess_color, [x * cell_size + space, y * cell_size + space], 16, 16)
# 绘制五个点
# pygame.draw.circle(窗口,颜色,坐标,圆半径,线条大小)
if (4, 4,1) not in chess_arr and (4, 4,2) not in chess_arr:
pygame.draw.circle(screen, (255, 0, 0), (cell_size * 4 + space, cell_size * 4 + space), 2, 1)
if (10, 10, 1) not in chess_arr and (10, 10, 2) not in chess_arr:
pygame.draw.circle(screen, (255, 0, 0), (cell_size * 10 + space, cell_size * 10 + space), 2, 1)
if (10, 4, 1) not in chess_arr and (10, 4, 2) not in chess_arr:
pygame.draw.circle(screen, (255, 0, 0), (cell_size * 10 + space, cell_size * 4 + space), 2, 1)
if (4, 10, 1) not in chess_arr and (4 ,10, 2) not in chess_arr:
pygame.draw.circle(screen, (255, 0, 0), (cell_size * 4 + space, cell_size * 10 + space), 2, 1)
if (7, 7, 1) not in chess_arr and (7, 7, 2) not in chess_arr:
pygame.draw.circle(screen, (255, 0, 0), (cell_size * 7 + space, cell_size * 7 + space), 2, 1)
if game_state != 1:
myfont = pygame.font.Font(None, 60)
white = 210, 210, 0
win_text = "%s win" % ('orange' if game_state == 2 else 'gold')
textImage = myfont.render(win_text, True, white)
screen.blit(textImage, (260, 320))
pygame.display.update() # 必须调用update才能看到绘图显示