战舰游戏崩溃,如果我点击网格外.我该如何阻止这一切?



我是pygame新手,所以我决定为自己的项目制作一款战舰游戏。游戏相对简单,船只将被随机放置,玩家有一定数量的射击来找到并击沉所有船只,否则他们就会失败。然而,我已经制作了一个响应玩家输入的网格,但如果玩家点击网格外(网格下的一个小区域,将显示剩余的总射击等信息),游戏就会显示错误并停止。我该如何解决这个问题?

下面是我的代码:
import pygame, random, sys
from sys import exit
from pygame.locals import *
pygame.init()
SCREENWIDTH = 255
SCREENHEIGHT = 300
GRIDWIDTH = 20
GRIDHEIGHT = 20
MARGIN = 5
FPS = 60
BLACK    = (  0,   0,   0)
WHITE    = (255, 255, 255)
RED      = (255,  0,    0)
GREEN    = (  0, 255,   0)
GRAY     = ( 60,  60,  60)
BLUE     = (  0,   0, 255)
YELLOW   = (255, 255,   0)
TURQUOISE= (  0, 100, 100)
SCREEN = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT))
pygame.display.set_caption("BATTLESHIPS")
FPSCLOCK = pygame.time.Clock()
MAIN_BACK = pygame.image.load("Water back.jpg")
PLAY_BUTTON_IMAGE = pygame.image.load("Start-Button-Vector-PNG.png")
HEADING_FONT = pygame.font.Font(None, 60)
HEADING = HEADING_FONT.render("Battleships", True, WHITE)
MENU = True
PLAYING = False
GRID = []
for ROW in range(10):
GRID.append([])
for COLUMN in range(10):
GRID[ROW].append(0)
class Button():
def __init__ (self, x, y, image, scale):
width = image.get_width()
height = image.get_height()
self.image = image
self.rect = self.image.get_rect()
self.image = pygame.transform.scale(image, (int(width * scale), int(height * scale)))
self.rect.topleft = (x, y)
self.clicked = False 
def draw(self):
action = False 
if PLAY_ON == False:
return
pos = pygame.mouse.get_pos() 

if self.rect.collidepoint(pos):
if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
self.clicked = True
action = True
#endif
#endif
if pygame.mouse.get_pressed()[0] == 0:
self.clicked = False
#endif

SCREEN.blit(self.image, (self.rect.x, self.rect.y)) 
return action
PLAY_BUTTON = Button(3, 125, PLAY_BUTTON_IMAGE, 0.5)
PLAY_ON = True
def draw_grid():
for ROW in range(10): 
for COLUMN in range(10):
COLOR = WHITE 
if GRID[ROW][COLUMN] == 1:
COLOR = GREEN 
pygame.draw.rect(SCREEN,
COLOR, 
[(MARGIN + GRIDWIDTH) * COLUMN + MARGIN,
(MARGIN + GRIDHEIGHT) * ROW + MARGIN,
GRIDWIDTH,
GRIDHEIGHT])


SCREEN.fill(TURQUOISE)
PLAY_BUTTON.draw()
SCREEN.blit(HEADING, (10,20))
pygame.display.update()
while MENU == True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()

elif PLAY_BUTTON.draw() == True and PLAY_ON == True:
PLAY_ON = False
PLAYING = True
SCREEN.fill(BLUE)
draw_grid()
MENU = False
FPSCLOCK.tick(FPS)
pygame.display.update()
while PLAYING == True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
POS = pygame.mouse.get_pos()
COLUMN = POS[0] // (GRIDWIDTH + MARGIN)
ROW = POS[1] // (GRIDHEIGHT + MARGIN)
GRID[ROW][COLUMN] = 1
draw_grid()
FPSCLOCK.tick(FPS)
pygame.display.update()

您必须检查COLUMNROW是否在网格范围内::

while PLAYING == True:
for event in pygame.event.get():
# [...]
if event.type == pygame.MOUSEBUTTONDOWN:
POS = pygame.mouse.get_pos()
COLUMN = POS[0] // (GRIDWIDTH + MARGIN)
ROW = POS[1] // (GRIDHEIGHT + MARGIN)
if 0 <= ROW < 10 and 0 <= COLUMN < 10:
GRID[ROW][COLUMN] = 1
draw_grid()

最新更新