Em mới tập tành viết game snake bằng pygame, code em viết như sau:
import pygame,sys,random
from pygame.locals import *
winwidth = 500
winheight = 500
FPS = 30
clock = pygame.time.Clock()
pygame.init()
win = pygame.display.set_mode((winwidth,winheight))
pygame.display.set_caption("Snake_Game")
block_size = 25
assert winwidth%block_size == 0 and winheight%block_size == 0,"AttentionError"
Loserfont = pygame.font.SysFont("c",100)
Loserfont = Loserfont.render("You have run out of the edge",1,(192,192,192))
Loserfont_x = winwidth //4
Loserfont_y = winheight//4
food_x = random.randint(1,(winwidth-block_size)//block_size+1)
food_y = random.randint(1,(winheight-block_size)//block_size+1)
def food(food_x,food_y):
return food_x == random.randint(1,(winwidth-block_size)//block_size+1) and food_y == random.randint(1,(winheight-block_size)//block_size+1)
def Grid():
for x in range(winwindth):
for y in range(winheight):
pygame.draw.rect(win,(255,0,0),(x*block_size,y*block_size,block_size,block_size),2)
class Snake():
def __init__(self):
self.width = block_size
self.height = block_size
self.body = [[winwidth//2,winheight//2],[winwidth//2+block_size,winheight//2],
[winwidth//2+2*block_size,winheight//2]]
self.new_head = []
self.tail = []
def draw(self):
HEAD = 0
x = 0
y = 1
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
if event.type == K_UP and self.direction != "DOWN":
self.direction == "UP"
elif event.type == K_DOWN and self.direction != "UP":
self.direction == "DOWN"
elif event.type == K_RIGHT and self.direction != "LEFT":
self.direction == "RIGHT"
elif event.type == K_LEFT and self.direction != "RIGHT":
self.direction == "LEFT"
#If the snake touch the edge
if self.body[HEAD][x] < 0 or self.body[HEAD][x] > winwidth or self.body[HEAD][y]< 0 or self.body[HEAD][y] > winheight:
return
#If the snake touch his self's body
for body in self.body[1:]:
if body[x] == self.body[HEAD][x] and body[y] == self.body[HEAD][y]:
return
#If the snake eat the food
if self.body[HEAD][x] == food_x and self.body[HEAD][y] == food_y:
food(food_x,food_y)
pygame.draw.rect(win,(255,0,0),(food_x*block_size,food_y*block_size,block_size,block_size))
self.direction = ""
if self.direction == "UP":
self.new_head = [self.body[HEAD][x],self.body[HEAD][y] - block_size]
elif self.direction == "DOWN":
self.new_head = [self.body[HEAD][x],self.body[HEAD][y] + block_size]
elif self.direction == "LEFT":
self.new_head = [self.body[HEAD][x] - block_size, self.body[HEAD][y]]
elif self.direction == "RIGHT":
self.new_head = [self.body[HEAD][x] + block_size, self.body[HEAD][y]]
self.body.insert(0,self.new_head)
self.body.pop()
body = 0
while body<len(self.body):
pygame.draw.rect(win,(255,0,0),(self.body[body][x],self.body[body][y],block_size,block_size))
pygame.draw.rect(win,(0,0,0),(self.body[body][x]+5,self.body[body][y]+5,block_size,block_size),2)
body += 1
Grid()
pygame.display.update()
snake = Snake()
if __name__ == "__main__":
while True:
snake.draw()
grid()
Cũng loay hoai mãi mà chẳng hiểu sao nó cứ hiện ra lỗi như này:
Traceback (most recent call last):
File “C:\Program Files\Python37-32\Pygame.py”, line 98, in
snake.draw()
File “C:\Program Files\Python37-32\Pygame.py”, line 87, in draw
pygame.draw.rect(win,(255,0,0),(self.body[body][x],self.body[body][y],block_size,block_size))
IndexError: list index out of range
Ae giải thích giúp em giờ em phải khắc phục lỗi bằng cách nào ạ?