Я хочу сделать шахматную доску в pygame с питоном. Всего лишь доски с петельками. Я пытался сделать это несколькими способами, но я так и не понял, что именно. Вот мой код:

import pygame
pygame.init()

#set color with rgb
white,black,red = (255,255,255),(0,0,0),(255,0,0)

#set display
gameDisplay = pygame.display.set_mode((800,600))

#caption
pygame.display.set_caption("ChessBoard")

#beginning of logic
gameExit = False

lead_x = 20
lead_y = 20

while not gameExit:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameExit = True

#For loop for chessboard 

#draw a rectangle
gameDisplay.fill(white)
pygame.draw.rect(gameDisplay, black, [lead_x,lead_y,20,20])
pygame.display.update()


#quit from pygame & python
pygame.quit()
quit()

Теперь мне нужно экспертное предложение, что будет с кодом на Python. Я просто хочу показать шахматную доску на моем экране. Это оно.

3
user7670579 29 Авг 2017 в 20:40

3 ответа

Лучший ответ

Возможное решение, может быть, не самое элегантное, но вы можете создавать квадраты в цикле

#Size of squares
size = 20

#board length, must be even
boardLength = 8
gameDisplay.fill(white)

cnt = 0
for i in range(1,boardLength+1):
    for z in range(1,boardLength+1):
        #check if current loop value is even
        if cnt % 2 == 0:
            pygame.draw.rect(gameDisplay, white,[size*z,size*i,size,size])
        else:
            pygame.draw.rect(gameDisplay, black, [size*z,size*i,size,size])
        cnt +=1
    #since theres an even number of squares go back one value
    cnt-=1
#Add a nice boarder
pygame.draw.rect(gameDisplay,black,[size,size,boardLength*size,boardLength*size],1)

pygame.display.update()
2
DJK 29 Авг 2017 в 20:16

Более эффективным было бы нарисовать доску один раз при инициализации и просто растереть эту поверхность:

cellSize = 20
board = Surface((cellSize * 8, cellSize * 8))
board.fill((255, 255, 255))
for x in range(0, 8, 2):
    for y in range(0, 8, 2):
        pygame.draw.rect(board, (0,0,0), (x*size, y*size, size, size))

А затем в вашем цикле вы сначала рисуете поверхность доски:

gameDisplay.blit(board, board.get_rect())
# Draw your game pieces
5
wyattis 29 Авг 2017 в 22:04

Вы можете использовать itertools.cycle для циклического перемещения по цвета во вложенном цикле for и просто передайте next(colors) в pygame.draw.rect. Я бы создал фоновую поверхность и нарисовал бы ее при запуске программы, а затем просто перелистывал фоновый всплеск в цикле while, потому что это более эффективно, чем копирование по отдельности.

import itertools
import pygame as pg


pg.init()

BLACK = pg.Color('black')
WHITE = pg.Color('white')

screen = pg.display.set_mode((800, 600))
clock = pg.time.Clock()

colors = itertools.cycle((WHITE, BLACK))
tile_size = 20
width, height = 8*tile_size, 8*tile_size
background = pg.Surface((width, height))

for y in range(0, height, tile_size):
    for x in range(0, width, tile_size):
        rect = (x, y, tile_size, tile_size)
        pg.draw.rect(background, next(colors), rect)
    next(colors)

game_exit = False
while not game_exit:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            game_exit = True

    screen.fill((60, 70, 90))
    screen.blit(background, (100, 100))

    pg.display.flip()
    clock.tick(30)

pg.quit()
0
skrx 8 Янв 2018 в 08:19