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.

79 lines
3.2 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.

import pygame as pg
#设置棋盘上的棋子
def set_chess(x, y, color):
if board[x][y] != ' ':
print('该位置已有棋子') #有了
return False
else:#没有棋子
board[x][y] = color
return True
#检查是否获胜
def check_win(board):
for list_str in board: #遍历棋盘的每一行
if ''.join(list_str).find('O'*5) != -1: #如果找到连续的五个'O'表示白棋获胜并返回一个0表示白棋获胜
print('白棋获胜')
return 0
elif ''.join(list_str).find('X'*5) != -1:
print('黑棋获胜')
return 1
else:
return -1 #都没有获胜
#检查所有方向的获胜情况
def check_win_all(board):
board_c = [[] for line in range(29)] #水平方向的棋盘副本
for x in range(15):
for y in range(15):
board_c[x-y].append(board[x][y]) #根据斜线填充棋盘副本
board_d = [[] for line in range(29)] #反对角线方向的棋盘副本
for x in range(15):
for y in range(15):
board_d[x+y].append(board[x][y]) #根据反对角线填充棋盘副本
#返回四个方向的检查结果
return [check_win(board), check_win([list(l) for l in zip(*board)]), check_win(board_c), check_win(board_d)]
def main():
pg.init()
clock = pg.time.Clock()
screen = pg.display.set_mode((WIDTH, HEIGHT)) #设置显示模式
black = pg.image.load("data/storn_black.png").convert_alpha()
white = pg.image.load("data/storn_white.png").convert_alpha()
background = pg.image.load("data/bg.png").convert_alpha()
objects = [] #棋子列表
pg.display.set_caption("五子棋") #标题
flag = 0 #当前下棋的标记
going = True #游戏是否继续的标志
chess_list = [black, white] #黑棋和白棋的列表
letter_list = ['X', 'O'] #黑棋和白棋的标记列表
while going:
screen.blit(background, (0, 0))
for event in pg.event.get():
if event.type == pg.QUIT: #点击关闭窗口
going = False
elif event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE: #如果按下Esc键
going = False
elif event.type == pg.MOUSEBUTTONDOWN: #鼠标点击
pos = pg.mouse.get_pos() #获取位置
a, b = round((pos[0] - 27)/40), round((pos[1] - 27)/40) #计算棋盘坐标
x, y = max(0, a) if a < 0 else min(a, 14), max(0, b) if b < 0 else min(b, 14) #限制棋子棋盘内
if set_chess(x, y, letter_list[flag]): #成功放置棋子
objects.append([chess_list[flag], (9+x*40, 9+y*40)]) #将棋子添加到棋子列表
flag = [1, 0][flag] #转换下棋方
if 0 in check_win_all(board) or 1 in check_win_all(board): #检查是否有人获胜
going = False #有人获胜,结束游戏
for o in objects:
screen.blit(o[0], o[1])
clock.tick(60)
pg.display.update()
if __name__ == '__main__':
WIDTH = 615
HEIGHT = 615
board = [[' ']*15 for line in range(15)]
main()
pg.quit()