【发布时间】:2021-08-22 20:48:50
【问题描述】:
所以我正在尝试自学 Python,作为一个项目,我正在尝试使用 pygame 创建游戏 Connect 4。我已经实现了一个显示所有图块坐标的调试功能,但是当我激活它时(将变量“调试”设置为“1”,每隔一次我尝试初始化脚本时,它就会变成黑色并崩溃。其他 50% 的情况下,它工作正常。当我禁用文本渲染时它不会发生。但是,我不知道为什么会发生这种情况,并且在我的控制台中没有收到任何错误报告。
我正在使用 Pygame 2.0.1 在 Python 3.7 中通过 Anaconda3 发行版编写 Spyder。
这是代码。有问题的行似乎是 41-43 和 75-79,但我不知道可能出了什么问题。有谁知道可能是什么问题?不同的字体也会发生这种情况。
import sys
import pygame
# ==== Settings ====
scalingFactor = 2 #Must be an integer
displayWidth = 320 * scalingFactor
displayHeight = 375 * scalingFactor
displaySize = [displayWidth, displayHeight]
Black = (0, 0, 0)
White = (255, 255, 255)
Grey = (255, 255, 255)
Red = (255, 20, 20)
Blue = (80, 80, 255)
player1 = Red
player2 = Blue
turnColor = player1 #Starting color
frameBackgroundColor = White
frameLatticeColor = Black
frameMargin = 5 * scalingFactor
gridWidth = 40 * scalingFactor
gridHeight = 40 * scalingFactor
columns = 7
rows = 6
fontColor = Black
debug = 1
# ==== Code ====
pygame.init()
screen = pygame.display.set_mode(displaySize)
clock = pygame.time.Clock()
pygame.display.set_caption('Connect Four')
if debug == 1: #Line 43 starts here
#This somehow makes the script unstable and won't allow it to run every other time I try to initialize it.
font = pygame.font.Font(None, 24)
running = True
grid = []
for row in range(rows):
grid.append([])
for column in range(columns):
grid[row].append(0)
def drawGrid():
for row in range(rows):
for column in range(columns):
color = White
pygame.draw.rect(screen,
color,
[(frameMargin + gridWidth) * column + frameMargin,
(frameMargin + gridHeight) * row + frameMargin,
gridWidth, gridHeight])
if grid[row][column] == 1:
pygame.draw.circle(screen,
player1,
[(frameMargin + gridWidth) * column + frameMargin + gridWidth // 2,
(frameMargin + gridHeight) * row + frameMargin + gridHeight // 2],
gridWidth // 2 - 5)
if grid[row][column] == 2:
pygame.draw.circle(screen,
player2,
[(frameMargin + gridWidth) * column + frameMargin + gridWidth // 2,
(frameMargin + gridHeight) * row + frameMargin + gridHeight // 2],
gridWidth // 2 - 5)
if debug == 1: #Line 75 starts here
textString = str(row) + "," + str(column)
textRender = font.render(textString, True, fontColor)
screen.blit(textRender,((frameMargin + gridWidth) * column + frameMargin + 8,
(frameMargin + gridHeight) * row + frameMargin + 8))
def validTile_check(validTile, pos, column, row):
# Checks if registered click is on tile or on frame lattice
if pos[0] % (gridWidth + frameMargin) <= frameMargin or pos[1] % (gridWidth + frameMargin) <= frameMargin:
print("Click registered on", pos, ". Not on tile.")
# Checks if registered click is within grid
elif row > rows - 1 or column > columns - 1:
print("Click registered on", pos, ". With grid coordinates:", row, column, ". Not a tile.")
validTile = 0
# Checks if registered click is on bottom tile
elif grid[row][column] == 0 and row == rows - 1:
validTile = 1
# Checks if registered click is on tile with placed piece in tile below
elif grid[row][column] == 0 and grid[row + 1][column] > 0:
validTile = 1
else:
validTile = 0
return validTile
def winCheck(winCondition, grid, pos, column, row):
winCondition = 0
chain = 1
for n in range(1, 3):
if chain == 4:
winCondition = 1
break
if row + n < rows:
if grid[row][column] == grid[row + n][column]:
chain += 1
else:
break
return winCondition
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
column = pos[0] // (gridWidth + frameMargin)
row = pos[1] // (gridHeight + frameMargin)
validTile = 0
winCondition = 0
validTile = validTile_check(validTile, pos, column, row)
if validTile == 0:
print("Click registered on", pos, ". With grid coordinates:", row, column, ". Not a valid tile.")
# Marks tile if clicked tile was unmarked.
elif grid[row][column] == 0:
if turnColor == player1:
grid[row][column] = 1
turnColor = player2
elif turnColor == player2:
grid[row][column] = 2
turnColor = player1
print("Click registered on", pos, ". With grid coordinates:", row, column, ". Tile marked.")
# Unmarks tile if clicked tile was marked.
elif grid[row][column] > 0:
grid[row][column] = 0
print("Click registered on", pos, ". With grid coordinates:", row, column, ". Tile unmarked.")
winCheck(winCondition, grid, pos, column, row)
if winCondition == 1:
print("Winner!")
screen.fill(Black)
drawGrid()
pygame.display.update()
clock.tick(60)
pygame.quit()
控制台如下所示:
In [2]: runfile('C:/Users/Admin/Documents/Connect4/Game/gameFrame.py', wdir='C:/Users/Admin/Documents/Connect4/Game')
In [1]: runfile('C:/Users/Admin/Documents/Connect4/Game/gameFrame.py', wdir='C:/Users/Admin/Documents/Connect4/Game')
pygame 2.0.1 (SDL 2.0.14, Python 3.7.4)
Hello from the pygame community. https://www.pygame.org/contribute.html
In [2]: runfile('C:/Users/Admin/Documents/Connect4/Game/gameFrame.py', wdir='C:/Users/Admin/Documents/Connect4/Game')
pygame 2.0.1 (SDL 2.0.14, Python 3.7.4)
Hello from the pygame community. https://www.pygame.org/contribute.html
In [1]:
In [2]: runfile('C:/Users/Admin/Documents/Connect4/Game/gameFrame.py', wdir='C:/Users/Admin/Documents/Connect4/Game')
当它显示“来自 pygame 社区的您好”时。它可以工作,当它什么也不显示,或者只显示 'runfile()' 行时,它会崩溃。
【问题讨论】:
-
它是如何崩溃的?是否引发异常?如果是这样,请包括完整的错误消息和回溯。哪一行是第 41-43 行和第 75-79 行?
-
当我运行脚本时,它要么工作,要么窗口只保持黑色几秒钟然后退出。没有错误信息,什么都没有。我将在原始帖子中添加行号,并包含控制台日志的注释摘录。
-
我无法重现该问题。你的操作系统是什么?
-
Windows 10 家庭版 64 位。更多规格:Intel(R) Core(TM) i5-9600K,16GB RAM。
-
我推荐使用
pygame.font.SysFont而不是pygame.font.Font:font = pygame.font.SysFont(None, 24)
标签: python text pygame crash render