I'm trying to make my first game, so I thought the snake game would be a nice doable challenge (guess I was wrong) to get started.
The problem seems to be that when I append a snake part to the body list, containing all the parts, it seems to append it multiple times. This makes all the parts to be in the same position and it loses the whole rest of the "snake" body. How would I fix this or is there some other issue with the code.
import pygame
pygame.init()
class Cube():
pos = [0, 0]
def __init__(self, x, y, color=(255, 0, 0)):
self.color = color
self.pos[0] = x
self.pos[1] = y
def draw(self):
x = (self.pos[0] * xSizeBtwn) + 2
y = (self.pos[1] * ySizeBtwn) + 2
pygame.draw.rect(win, self.color, (x, y, xSizeBtwn - 2, ySizeBtwn - 2))
pygame.display.update()
class Snake():
body = []
pos = []
def __init__(self, color=(255, 0, 0)):
self.color = color
self.dirx = 1
self.diry = 0
self.length = 10
self.pos = [3, 3]
def move(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
self.dirx = -1
self.diry = 0
print("moved a")
elif keys[pygame.K_d]:
self.dirx = 1
self.diry = 0
print("moved d")
elif keys[pygame.K_w]:
self.diry = -1
self.dirx = 0
print("moved s")
elif keys[pygame.K_s]:
self.diry = 1
self.dirx = 0
print("moved s")
self.newPosX = self.pos[0] + self.dirx
self.newPosY = self.pos[1] + self.diry
self.pos[0] = self.newPosX
self.pos[1] = self.newPosY
present = True
for b in self.body:
print(b.pos, self.newPosX, self.newPosY)
if b.pos[0] == self.newPosX and b.pos[1] == self.newPosY:
print("true")
present = False
# the problem is right here (i think)
if present:
self.body.append(Cube(self.newPosX, self.newPosY, self.color))
if len(self.body) > self.length:
self.body.pop(0)
def draw(self):
for b in self.body:
b.draw()
print(b.pos)
def drawAll():
win.fill((30, 30, 30))
drawGrid()
pygame.display.update()
def drawGrid():
x = 0
y = 0
for n in range(rows - 1):
y += ySizeBtwn
pygame.draw.line(win, (255, 255, 255), (0, (int)(y)), (gameHeight, (int)(y)))
for n in range(columns - 1):
x += xSizeBtwn
pygame.draw.line(win, (255, 255, 255), ((int)(x), 0), ((int)(x), gameWidth))
def main():
global gameWidth, gameHeight, columns, rows, xSizeBtwn, ySizeBtwn, win
gameWidth = 500
gameHeight = 500
columns = 15
rows = 15
xSizeBtwn = gameWidth / columns
ySizeBtwn = gameHeight / rows
win = pygame.display.set_mode((gameWidth, gameHeight))
pygame.display.set_caption("Snake")
clock = pygame.time.Clock()
run = True
snake = Snake()
while run:
pygame.time.delay(100)
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
drawAll()
snake.move()
snake.draw()
main()
pygame.quit()
Sorry for the messy code, I just started programming.
Also, if you have any tips, it would be really helpful.