2017-08-29 6 views
1

Je veux faire un échiquier en pygame avec python. Juste seulement l'échiquier avec des boucles pour. J'ai essayé de plusieurs façons de le faire mais je n'ai pas compris exactement ce que ce sera. Voici mon code:Faire un 8 * 8 échiquier en pygame avec python

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() 

Maintenant, je besoin d'une suggestion d'experts ce que ce sera avec le code python. Je veux juste montrer un échiquier sur mon écran. C'est tout.

+1

Vous n'avez pas inclus votre code. Voici quelques liens qui peuvent être liés ou utiles: [ChessBoard - Pygame] (http://www.pygame.org/project-ChessBoard-282-.html), http://openbookproject.net/thinkcs/python/english3e/ pygame.html – davedwards

+1

Pouvez-vous montrer ce que vous avez essayé? –

+0

oui, je colle mon code ici maintenant. – user7670579

Répondre

1

Solution possible, peut-être pas le plus élégant, mais vous pouvez créer les carrés dans une boucle

#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() 
+0

oui, cela fonctionne. Merci pour vos commentaires. – user7670579

2

plus efficace serait de tirer le conseil d'administration une fois à l'initialisation et juste blit cette surface:

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)) 

Et puis dans votre boucle vous dessinez la surface du panneau premier:

gameDisplay.blit(board, board.get_rect()) 
# Draw your game pieces 
0

vous ca n utilisez itertools.cycle pour parcourir les couleurs dans une boucle imbriquée et passez simplement next(colors) à pygame.draw.rect. Je créerais une surface d'arrière-plan et dessinerais les rects dessus quand le programme commencerait, et juste blitterais le surf de fond dans la boucle while, parce que c'est plus efficace que blitting les rects séparément.

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()