很早之前写了一个类似的五子棋,没有做到pygame里面,闲着没事给整过来了,主要就是加了一个鼠标映射坐标。
表情被锤会变脸。
设置的0积分不知道能不能下载
https://download.csdn.net/download/ChillingKangaroo/82109145
代码不多,主要是由几个图片
import pygame as pg
import math
import time
import randomclass Tile(): def __init__(self,grid_size,screen_size,x,y): #一个坐标单位self.x,self.y = x,yself.grid_size = grid_sizeself.rectangle = (self.x*tile_size[0]+50,self.y*tile_size[1]+50,tile_size[0],tile_size[1])self.points = [ [(0.5+self.x)*tile_size[0]+50,self.y*tile_size[1]+50], #upper middle[(0.5+self.x)*tile_size[0]+50,(self.y+1)*tile_size[1]+50], #lower middle[(self.x)*tile_size[0]+50,(self.y+0.5)*tile_size[1]+50], #middle left right[(self.x+1)*tile_size[0]+50,(self.y+0.5)*tile_size[1]+50], #middle right] self.chess = Nonedef draw(self,color = (255,253,150),line_color = (150,175,255)): #x,y represents the tile coordinates pg.draw.rect(screen,color,self.rectangle)pg.draw.line(screen,line_color,(self.points[0]),(self.points[1]),3)pg.draw.line(screen,line_color,(self.points[2]),(self.points[3]),3)if self.chess != None:screen.blit(chess[self.chess],((self.x+0.3)*tile_size[0] + 50, (self.y+0.3)*tile_size[1] + 50))pg.display.update()def draw_chessboard():screen.fill((255,255,255))for y in range(grid_size[1]):for x in range(grid_size[0]):matrix[y][x].draw()def get_clicked_tile():x_,y_ = pg.mouse.get_pos() #pixel coordinatesx = int((x_-50)/tile_size[0]) if int((x_-50)) >= 0 else -1y = int((y_-50)/tile_size[1]) if int((y_-50)) >= 0 else -1return x,ydef check_win(x,y):directions = [[(-1,0),(1,0)],[(0,-1),(0,1)],[(-1,1),(1,-1)],[(-1,-1),(1,1)]] #x,yfor line in directions:depth=0 for dx,dy in line:tempx = dxtempy = dyif x+dx in range(grid_size[0]) and y+dy in range(grid_size[1]):while matrix[y+dy][x+dx].chess == matrix[y][x].chess and depth <= 5:depth += 1if depth == 4:return matrix[y][x].chessdx += tempxdy += tempyif x+dx not in range(grid_size[0]) or y+dy not in range(grid_size[1]):breakdef display_score():global turnplayer1_won_text = font.render(f': {player_won[0]}', True, (0,0,0), (255,255,255))player2_won_text = font.render(f': {player_won[1]}', True, (0,0,0), (255,255,255))turn_text = font.render(f'Turns: {turn} ', True, (0,0,0), (255,255,255))screen.blit(player1_won_text,(1000,120))screen.blit(player2_won_text,(1000,220))screen.blit(chess_scoreboard[0],(900,100))screen.blit(chess_scoreboard[1],(900,200))screen.blit(turn_text,(900,300))pg.display.update()def game_over_animation():for x in range(grid_size[0]+1):for y in range(grid_size[1]):if x +1 < grid_size[0]:matrix[y][x+1].chess = 2 if matrix[y][x+1].chess != None else Nonematrix[y][x+1].draw()if x < grid_size[0]:matrix[y][x].chess = 3matrix[y][x].draw()if x > 0:matrix[y][x-1].chess = Nonematrix[y][x-1].draw()time.sleep(0.05)#================================initialize parameter===================================
chess_color = [(0,0,0),(255,255,255)]
screen_size = [1200,800]
chess_size = [800,800]
grid_size = [15,15]
tile_size = [(chess_size[0]-100)/grid_size[0],(chess_size[1]-100)/grid_size[1]]run = True
game_ended = False
player_won = [0,0]
turn = 0
chess = [ pg.transform.smoothscale(pg.image.load('smiley.png'), (int(tile_size[0]/2),int(tile_size[0]/2))), #player1pg.transform.smoothscale(pg.image.load('angry.png'), (int(tile_size[0]/2),int(tile_size[0]/2))), #player2pg.transform.smoothscale(pg.image.load('sad.png'), (int(tile_size[0]/2),int(tile_size[0]/2))), #sad facepg.transform.smoothscale(pg.image.load('fist.png'), (int(tile_size[0]/2),int(tile_size[0]/2)))] #fist
chess_scoreboard = [ pg.transform.smoothscale(pg.image.load('smiley.png'), (80,80)),pg.transform.smoothscale(pg.image.load('angry.png'), (80,80)),]matrix = []
for y in range(grid_size[1]):temp = []for x in range(grid_size[0]):tile = Tile(grid_size,screen_size,x,y)temp.append(tile)matrix.append(temp)screen = pg.display.set_mode(screen_size)
pg.init()
#================================draw board==============================================
draw_chessboard()
font = pg.font.Font('freesansbold.ttf', 32)
display_score()
#================================game loop==============================================
while run:for event in pg.event.get():if event.type == pg.QUIT:run = Falsepg.quit()if event.type == pg.KEYDOWN:if event.key == pg.K_g:winner = (turn+1)%2print(f'player{(turn%2)+1} gave up')player_won[winner] += 1game_ended = Truedisplay_score()if event.type == pg.MOUSEBUTTONUP:if not game_ended:x,y = get_clicked_tile()if x in range(grid_size[0]) and y in range(grid_size[1]) and matrix[y][x].chess == None:matrix[y][x].chess = turn%2matrix[y][x].draw()winner = check_win(x,y)turn += 1if winner != None:print(f'the winner is: player{winner+1}')player_won[winner] += 1game_ended = Truedisplay_score()else:game_over_animation()game_ended = Falseturn = 0display_score()for y in range(grid_size[1]):for x in range(grid_size[0]):matrix[y][x].chess = Nonematrix[y][x].draw()time.sleep(1/30)