Игра змейка. Баги
Я хочу создать игру "змейка" без модуля Pygame, всё практически готово, но есть 2 критических бага:
- Это баг движения, если быть конкретным, то во время поворота поворачивается всё тело. Сразу скажу, что передвижение происходит по средству телепортации части тела в впередистоящую (PS. сама змейка это массив, где расположены координаты каждого тела, пример: [[0,2],[0,3]])
- Это баг рисовки, по тем или иным причинам справа от головы змейки появляется ещё одно тело. Прошу помощи, так как уже пытался делать всё, я переписывал код с нуля, переделывал функции и прочее. И хочу сказать перед тем, как вы увидите код: я только только начал изучать программирование и это мой первый вопрос на stack overflow, поэтому за говнокод и недостаток информации прошу прощенья.
Так же: код нужно запускать именно в терминале, в pycharm(овском) изначальном он не работает как следует. Код:
import os, time, random, keyboard
class main_logic:
snake = [[2, 2], [1, 2]]
food = [5, 5]
side = 2
score = 0
def move(self, side):
snake = self.snake
NewHeadX = snake[0][0]
NewHeadY = snake[0][1]
if side == 0: # вверх
NewHeadY -= 1
self.side = 0
print("Повернули наверх")
elif side == 1: # вниз
NewHeadY += 1
self.side = 1
print("Повернули вниз")
elif side == 2: # вправо
NewHeadX += 1
self.side = 2
print("Повернули вправо")
elif side == 3: # влево
NewHeadX -= 1
self.side = 3
print("Повернули влево")
if self.food[0] == NewHeadX and self.food[1] == NewHeadY:
snake.append([0, 0])
self.score += 1
self.foodspawn(self)
for i in range(len(snake)):
if i == 0:
pass
elif i > 0:
b = i - 1
snake[i][0] = snake[b][0]
snake[i][1] = snake[b][1]
snake[0][0] = NewHeadX
snake[0][1] = NewHeadY
self.snake = snake
return snake
def foodspawn(self):
y = random.randint(0, 9)
x = random.randint(0, 9)
food = [x, y]
self.food = food
return food
def printer():
map_top = "┌─────────────────────────────────────────────────┐\n"
map_bottom = "└───────────────────────────────────────────────────┘"
symbols = ["△", "▽", "▷", "◁", "#", "⎔"] # Вверх, вниз, вправо, влево
print(map_top)
for y in range(10):
for x in range(10):
if x == main_logic.snake[0][0] and y == main_logic.snake[0][1]:
print(symbols[main_logic.side], end="")
elif x == main_logic.food[0] and y == main_logic.food[1]:
print(symbols[5], end="")
else:
printed1 = False
for s in range(len(main_logic.snake)):
if x == main_logic.snake[s][0] and y == main_logic.snake[s][1]:
print(symbols[4], end="")
if printed1 == False:
print(" ", end="")
if x >= 9:
print("")
print(map_bottom)
print("У вас", main_logic.score, "очков!")
sec1 = time.time()
first = False
while True:
def get_time(time_need):
if time_need == "ms":
sec = time.time()
msec = (sec * 1000) % 1000
return msec
elif time_need == "m":
minute = time.localtime()
return minute[4]
if keyboard.is_pressed('W'):
key = "W"
first = True
elif keyboard.is_pressed('S'):
key = "S"
first = True
elif keyboard.is_pressed('D'):
key = "D"
first = True
elif keyboard.is_pressed('A'):
key = "A"
first = True
sec = time.time()
if sec - sec1 >= 2:
sec1 = sec
os.system("cls")
if first == False:
snake = main_logic.move(main_logic, 2)
elif key == "W":
snake = main_logic.move(main_logic, 0)
elif key == "S":
snake = main_logic.move(main_logic, 1)
elif key == "D":
snake = main_logic.move(main_logic, 2)
elif key == "A":
snake = main_logic.move(main_logic, 3)
printer()
Ответы (1 шт):
Автор решения: Daniil Loban
→ Ссылка
Cделал небольшой пример кроме класса логики, надеюсь будет полезен.
class Snake:
def __init__(self, snake):
self.snake = snake
def get_body(self):
return self.snake
def get_direction(self):
neck = self.snake[len(self.snake)-2]
head = self.snake[len(self.snake)-1]
if (head[1] > neck[1]): return 'down'
if (head[1] < neck[1]): return 'up'
if (head[0] < neck[0]): return 'left'
if (head[0] > neck[0]): return 'right'
def move(self, dx, dy):
tail = self.snake.pop(0)
head = self.snake[len(self.snake)-1]
new_head = [head[0] + dx, head[1] + dy];
self.snake.append(new_head);
def move_down(self):
self.move(0, 1)
def move_up(self):
self.move(0, -1)
def move_left(self):
self.move(-1, 0)
def move_right(self):
self.move(1, 0)
class Dashboard:
def __init__(self, height, width):
self.width = width
self.height = height
self.symbols = {
"up": "△",
'down': "▽",
'right':"▷",
'left':"◁",
'body':"#",
'apple':"⎔"
}
def draw_dash(self, snake):
lines = [[ "_" for i in range(self.width) ] for j in range(self.height) ]
snake_body = snake.get_body();
snake_length = len(snake_body);
for i, [x,y] in enumerate(snake_body):
lines[y][x] = self.symbols['body'] if i < snake_length-1 else self.symbols[snake.get_direction()]
res = [ ''.join(line) for line in lines]
print('\n'.join(res))
snake = [[2, 2], [2, 3], [2, 4]]
sn = Snake(snake)
db = Dashboard(10, 10)
db.draw_dash(sn)
sn.move_right()
db.draw_dash(sn)