Implementando backgammon basado en pygame
Domine el algoritmo central, cómo juzgar si hay cinco piezas consecutivas y el juicio confuso de la posición del movimiento.
1. Solo necesita determinar si los colores de las piezas de ajedrez en las cuatro direcciones alrededor de la última pieza de ajedrez (arriba y abajo, izquierda y derecha, superior izquierda e inferior derecha, inferior derecha y superior izquierda) son consistentes con el color de ¡La última pieza de ajedrez! (ver código para más detalles)
2. ¡El juicio confuso de la posición de la pieza mejora enormemente la experiencia de jugar al ajedrez! Simplemente use el redondeo básico. Si excede la mitad de las dos líneas del tablero, se puede considerar que está en la siguiente línea, ¡y viceversa!
Si tiene alguna otra pregunta, ¡no dude en comunicarse!
Generar la apariencia del tablero de ajedrez.
import pygame
pygame.init()
pygame.display.set_caption('五子棋') #窗口名称
dir1=[(-1, 0), (1, 0)]
dir2=[(0, -1), (0, 1)]
dir3=[(-1, -1), (1, 1)]
dir4=[(-1, 1), (1, -1)]
direct=[dir1,dir2,dir3,dir4]#设定判断连子方向
space=60#四周边距
cell_size=40#每个格子大小
cell_number=15#行列数
screen_size=cell_size*(cell_number-1)+2*space#窗口边长
screen = pygame.display.set_mode((screen_size,screen_size))#窗口大小
chess_arr=[]#已经落下的棋子的屏幕坐标
chess_done=[]#已经落下的棋子的坐标
chess=0#总棋子数
flag='black'#先下者为黑
game_state='good'
chess_board=[[0]*15 for i in range(15)]#设定棋盘集合
'''#第一次的失败实验
def chess_number(chess_board,dx,dy,lastx,lasty):#判断连子数
tempx=lastx
tempy=lasty
num=0
while True:
tempx += dx#将tempx移动一格,以便判断连子数
tempy += dy
if tempx<0 or tempy< 0 or tempx >14 or tempy >14 or chess_board[tempy][tempx] == '0':num
num=num+1
'''
def chess_number(chess_board,dx,dy,lastx,lasty):#判断连子数
tempx=lastx
tempy=lasty
num=0
while True:
tempx += dx#将tempx移动一格,以便判断连子数
tempy += dy
if 0<=tempx<=14 and 0<=tempy<=14 and chess_board[tempy][tempx]==flag:
num+=1
elif 0<=tempx<=14 and 0<=tempy<=14 and chess_board[tempy][tempx]!=flag:
return num
if tempx<0 or tempy<0 or tempx>14 or tempy>14 or chess_board[tempy][tempx]==0:
return num
def check_win(chess_done,flag):
for dir in direct:#遍历方向
di1,di2=dir
dx,dy=di1
number1=chess_number(chess_board,dx,dy,xi,yi)
dx,dy=di2
number2=chess_number(chess_board,dx,dy,xi,yi)
print(number1+number2)
if number1+number2>=4:#包括最后一颗子在内,连子数大于等于5
return True
while True: # 死循环确保窗口一直显示
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
pygame.quit()
if event.type == pygame.MOUSEBUTTONUP and game_state == 'good': # 鼠标弹起
x, y = pygame.mouse.get_pos() # 获取鼠标位置
if (x-space)//cell_size in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]:#判断在格子附近
if (x-space)%cell_size>0.5*cell_size:#向大取整
xi=(x-space)//cell_size+1
else:#向小取整
xi=(x-space)//cell_size
else:
break
if (y-space)//cell_size in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]:#判断在格子附近
if (y-space)%cell_size>0.5*cell_size:#向大取整
yi=(y-space)//cell_size+1
else:#向小取整
yi=(y-space)//cell_size
else:
break
if xi in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] and yi in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] and (xi*cell_size+space,yi*cell_size+space,'black') not in chess_arr and (xi*cell_size+space,yi*cell_size+space,'white') not in chess_arr:
chess_arr.append((xi*cell_size+space,yi*cell_size+space,flag))#将落子坐标加入集合
chess_done.append((xi,yi,flag))
chess_board[yi][xi]=flag
if check_win(chess_done, flag):
game_state = 'black' if flag == 'black' else 'white'#判断输赢
else:
flag = 'white' if flag == 'black' else 'black'#切换棋子颜色
chess+=1
if chess==225:
game_state='tie'
screen.fill((222,171,138))#设置底色
for x in range(0, cell_size * cell_number, cell_size):
pygame.draw.line(screen,(255,255,255),(x+space,space),(x+space,screen_size-space),1)#窗口, 线条颜色, 开始坐标, 结束坐标, 线条大小
for y in range(0, cell_size * cell_number, cell_size):
pygame.draw.line(screen,(255,255,255),(space,y+space),(screen_size-space,y+space),1)#窗口, 线条颜色, 开始坐标, 结束坐标, 线条大小
for i in [4,10]:
for j in [4,10]:
pygame.draw.circle(screen,(255,255,255),(i*cell_size+space,j*cell_size+space),5,5)
pygame.draw.circle(screen,(255,255,255),(7*cell_size+space,7*cell_size+space),5,5)
for x,y,c in chess_done:
if c == 'black':
color=(0,0,0)#定义颜色
else:
color=(255,255,255)
pygame.draw.circle(screen,color,(x*cell_size+space,y*cell_size+space),12,12)#画出集合内所有棋子
if game_state != 'good':
myfont = pygame.font.Font(None,120)
color= 221,207,113#胜利者金黄色
if game_state=='white':#判断输出语句
win_text='white win'
elif game_state == 'black':
win_text='black win'
elif game_state == 'tie':
win_text='TIE'
textImage = myfont.render(win_text, True, color)
screen.blit(textImage, (260,320))
pygame.display.update()