gpt4 book ai didi

python - 蛇游戏,但问题是如果我将蛇向左移动然后将蛇向右移动,蛇会自己崩溃或相反,上下相同

转载 作者:行者123 更新时间:2023-12-04 07:36:56 24 4
gpt4 key购买 nike

如果我向右移动,如何让蛇不向左移动,这样它就不会上下碰撞。
所以如果我按左箭头,我不能按右箭头,除非我按向上或向下箭头相同的上下箭头,因为如果我按向右箭头然后向左箭头,蛇会崩溃并且游戏结束了向上和向下

import pygame
from pygame.locals import *
import time
import random

SIZE = 40
BACKGROUND_COLOR = (110, 110, 5)


class Apple:
def __init__(self, parent_screen):
self.parent_screen = parent_screen
self.image = pygame.image.load("resources/apple.jpg").convert()
self.x = 120
self.y = 120

def draw(self):
self.parent_screen.blit(self.image, (self.x, self.y))
pygame.display.flip()

def move(self):
self.x = random.randint(1, 24) * SIZE
self.y = random.randint(1, 19) * SIZE


class Snake:
def __init__(self, parent_screen):
self.parent_screen = parent_screen
self.image = pygame.image.load("resources/block.jpg").convert()
self.direction = 'down'

self.length = 1
self.x = [40]
self.y = [40]

def move_left(self):
self.direction = 'left'

def move_right(self):
self.direction = 'right'

def move_up(self):
self.direction = 'up'

def move_down(self):
self.direction = 'down'

def walk(self):
# update body
for i in range(self.length - 1, 0, -1):
self.x[i] = self.x[i - 1]
self.y[i] = self.y[i - 1]

# update head
if self.direction == 'left':
self.x[0] -= SIZE
if self.direction == 'right':
self.x[0] += SIZE
if self.direction == 'up':
self.y[0] -= SIZE
if self.direction == 'down':
self.y[0] += SIZE

self.draw()

def draw(self):
for i in range(self.length):
self.parent_screen.blit(self.image, (self.x[i], self.y[i]))

pygame.display.flip()

def increase_length(self):
self.length += 1
self.x.append(-1)
self.y.append(-1)


class Game:
def __init__(self):
pygame.init()
pygame.display.set_caption("Codebasics Snake And Apple Game")

pygame.mixer.init()
self.play_background_music()

self.surface = pygame.display.set_mode((1000, 800))
self.snake = Snake(self.surface)
self.snake.draw()
self.apple = Apple(self.surface)
self.apple.draw()

def play_background_music(self):
pygame.mixer.music.load('resources/bg_music_1.mp3')
pygame.mixer.music.play(-1, 0)

def play_sound(self, sound_name):
global sound
if sound_name == "crash":
sound = pygame.mixer.Sound("resources/crash.mp3")
elif sound_name == 'ding':
sound = pygame.mixer.Sound("resources/ding.mp3")

pygame.mixer.Sound.play(sound)
# pygame.mixer.music.stop()

def reset(self):
self.snake = Snake(self.surface)
self.apple = Apple(self.surface)

def is_collision(self, x1, y1, x2, y2):
if x1 >= x2 and x1 < x2 + SIZE:
if y1 >= y2 and y1 < y2 + SIZE:
return True
return False

def render_background(self):
bg = pygame.image.load("resources/background.jpg")
self.surface.blit(bg, (0, 0))

def play(self):
self.render_background()
self.snake.walk()
self.apple.draw()
self.display_score()
pygame.display.flip()

# snake eating apple scenario
for i in range(self.snake.length):
if self.is_collision(self.snake.x[i], self.snake.y[i], self.apple.x, self.apple.y):
self.play_sound("ding")
self.snake.increase_length()
self.apple.move()

# snake colliding with itself
for i in range(3, self.snake.length):
if self.is_collision(self.snake.x[0], self.snake.y[0], self.snake.x[i], self.snake.y[i]):
self.play_sound('crash')
raise ("Collision Occurred")

# snake colliding with the boundries of the window
if not (0 <= self.snake.x[0] <= 1000 and 0 <= self.snake.y[0] <= 800):
self.play_sound('crash')
raise ("Hit the boundry error")

def display_score(self):
font = pygame.font.SysFont('arial', 30)
score = font.render(f"Score: {self.snake.length}", True, (200, 200, 200))
self.surface.blit(score, (850, 10))

def show_game_over(self):
self.render_background()
font = pygame.font.SysFont('arial', 30)
line1 = font.render(f"Game is over! Your score is {self.snake.length}", True, (255, 255, 255))
self.surface.blit(line1, (200, 300))
line2 = font.render("To play again press Enter. To exit press Escape!", True, (255, 255, 255))
self.surface.blit(line2, (200, 350))
pygame.mixer.music.pause()
pygame.display.flip()

def run(self):
running = True
pause = False

while running:
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
running = False

if event.key == K_RETURN:
pygame.mixer.music.unpause()
pause = False

if not pause:
if event.key == K_LEFT:
self.snake.move_left()

if event.key == K_RIGHT:
self.snake.move_right()

if event.key == K_UP:
self.snake.move_up()

if event.key == K_DOWN:
self.snake.move_down()

elif event.type == QUIT:
running = False
try:

if not pause:
self.play()

except Exception as e:
self.show_game_over()
pause = True
self.reset()

time.sleep(.0955)


if __name__ == '__main__':
game = Game()
game.run()

最佳答案

你必须锁定彼此的方向:

class Snake:
# [...]

def move_left(self):
if self.direction != 'right':
self.direction = 'left'

def move_right(self):
if self.direction != 'left':
self.direction = 'right'

def move_up(self):
if self.direction != 'down':
self.direction = 'up'

def move_down(self):
if self.direction != 'up':
self.direction = 'down'

关于python - 蛇游戏,但问题是如果我将蛇向左移动然后将蛇向右移动,蛇会自己崩溃或相反,上下相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67694618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com