pygame 与元组冲突
pygame collision with tuples
所以我正在创建一个贪吃蛇游戏,但我无法检测到它的自我碰撞,我需要了解的是:
我的蛇是一个元组
snake = [(s_pos, s_pos),(s_pos + size, s_pos),(s_pos + size * 2, s_pos)]
就像这样,当它长大时,它会在列表中创建另一个东西,就像上面的代码一直到 snake[3]
,我知道如何检测与蛇的前 3 个部分的碰撞,但是当它上升它说索引超出范围,这是碰撞代码
def collision (c1,c2):
return (c1[0] == c2[0]) and (c1[1] == c2[1])
if collision(snake[0], snake[1]):
print("self collision")
有没有办法像
if collision(snake[0], snake[>1]):
print("self collision")
没有索引超出范围?
当蛇长大时它会创建蛇[4],我不知道如何创建一个代码来检测碰撞,对不起,如果我不清楚,让蛇长大的代码:snake.append((0,0))
我所有的代码(考虑到我对编码真的很陌生):
import pygame, random as rand, os
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((1020, 585))
pygame.display.set_caption('2snakes!')
#files location
current_path = os.path.dirname(__file__)
data_path = os.path.join(current_path, 'data')
icon = pygame.image.load(os.path.join(data_path, 'icon.png'))
pygame.display.set_icon(icon)
#variables
direction = 'RIGHT'
direction2 = 'RIGHT'
change_to = direction
change2_to = direction2
fps = 15
#snake
size = 15
s_pos = 60
snake = [(s_pos, s_pos),(s_pos + size, s_pos),(s_pos + size * 2, s_pos)]
s_skin = pygame.Surface((size, size))
s_skin.fill((82,128,208))
#snake2
size2 = 15
s2_pos = 90
snake2 = [(s2_pos, s2_pos),(s2_pos + size2, s2_pos),(s2_pos + size2 * 2, s2_pos)]
s2_skin = pygame.Surface((size2, size2))
s2_skin.fill((208,128,82))
#apple
apple = pygame.Surface((size, size))
apple_pos = (165, 150)
#collission
def collision (c1,c2):
return (c1[0] == c2[0]) and (c1[1] == c2[1])
def selfColliding(snake: list):
for i in snake:
if snake.count(i) > 1:
return True
return False
def gameOver():
#pygame.quit()
print("gameover")
def selfColliding(snake: list):
return True if snake.count(snake[0]) > 1 else False
while True:
#fps
pygame.time.Clock().tick(fps)
#basic stuff
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
#input
elif event.type == pygame.KEYDOWN:
#snake
if event.key == ord('w'):
change_to = 'UP'
if event.key == ord('s'):
change_to = 'DOWN'
if event.key == ord('a'):
change_to = 'LEFT'
if event.key == ord('d'):
change_to = 'RIGHT'
#snake2
if event.key == pygame.K_UP:
change2_to = 'UP'
if event.key == pygame.K_DOWN:
change2_to = 'DOWN'
if event.key == pygame.K_LEFT:
change2_to = 'LEFT'
if event.key == pygame.K_RIGHT:
change2_to = 'RIGHT'
#quit game
if event.key == pygame.K_ESCAPE:
pygame.event.post(pygame.event.Event(pygame.QUIT))
#noice smooth snake movement
#snake
if change_to == 'UP' and direction != 'DOWN':
direction = 'UP'
if change_to == 'DOWN' and direction != 'UP':
direction = 'DOWN'
if change_to == 'LEFT' and direction != 'RIGHT':
direction = 'LEFT'
if change_to == 'RIGHT' and direction != 'LEFT':
direction = 'RIGHT'
#snake2
if change2_to == 'UP' and direction2 != 'DOWN':
direction2 = 'UP'
if change2_to == 'DOWN' and direction2 != 'UP':
direction2 = 'DOWN'
if change2_to == 'LEFT' and direction2 != 'RIGHT':
direction2 = 'LEFT'
if change2_to == 'RIGHT' and direction2 != 'LEFT':
direction2 = 'RIGHT'
#movement
#snake
if direction == 'DOWN':
snake[0] = (snake[0][0], snake[0][1] + size)
if direction == 'UP':
snake[0] = (snake[0][0], snake[0][1] - size)
if direction == 'LEFT':
snake[0] = (snake[0][0] - size, snake[0][1])
if direction == 'RIGHT':
snake[0] = (snake[0][0] + size, snake[0][1])
#snake2
if direction2 == 'DOWN':
snake2[0] = (snake2[0][0], snake2[0][1] + size2)
if direction2 == 'UP':
snake2[0] = (snake2[0][0], snake2[0][1] - size2)
if direction2 == 'LEFT':
snake2[0] = (snake2[0][0] - size2, snake2[0][1])
if direction2 == 'RIGHT':
snake2[0] = (snake2[0][0] + size2, snake2[0][1])
#snake apple collision
if collision(snake[0], apple_pos):
snake.append((0,0))
#snake2 apple collision
if collision(snake2[0], apple_pos):
snake2.append((0,0))
#snake wall collisison
if snake[0][0] < 0 or snake[0][1] < 0:
gameOver()
elif snake[0][0] > 1020 or snake[0][1] > 585:
gameOver()
#snake2 wall collisison
#if snake2[0][0] < 0 or snake2[0][1] < 0:
#gameOver()
#elif snake2[0][0] > 1020 or snake2[0][1] > 585:
#gameOver()
#all blocks follow first
#snake
for i in range(len(snake) -1, 0, -1):
snake[i] = (snake[i-1][0], snake[i-1][1])
#snake2
for i in range(len(snake2) -1, 0, -1):
snake2[i] = (snake2[i-1][0], snake2[i-1][1])
if selfColliding:
print("self colliding")
#rendering
screen.fill((0,0,0))
apple.fill((255,0,0))
screen.blit(apple,apple_pos)
for pos in snake:
screen.blit(s_skin,pos)
for pos2 in snake2:
screen.blit(s2_skin,pos2)
pygame.display.update()
检查列表中是否多次存在任何元组的可能解决方案:
def selfColliding(snake: list):
for i in snake:
if snake.count(i) > 1:
return True
return False
或者如@Rabbid76 所指出的,如果您只想检查头部是否发生碰撞:
def selfColliding(snake: list):
return True if snake.count(snake[0]) > 1 else False
如果要测试列表中的第一个元素是否与列表中的任何其他元素相同,可以执行以下操作:
if snake[0] in snake[1:]:
print("self collision")
print(snake[0], "is in", snake[1:])
第一个元素似乎在您的列表中出现了两次。请参阅 并将解决方案应用于您的代码:
direction = 'RIGHT'
direction2 = 'RIGHT'
# [...]
snake = [(s_pos + size * 2, s_pos),(s_pos + size, s_pos),(s_pos, s_pos)]
snake2 = [(s2_pos + size2 * 2, s2_pos),(s2_pos + size2, s2_pos),(s2_pos, s2_pos)]
# [...]
while True:
# [...]
new_pos = None
if direction == 'DOWN':
new_pos = (snake[0][0], snake[0][1] + size)
if direction == 'UP':
new_pos = (snake[0][0], snake[0][1] - size)
if direction == 'LEFT':
new_pos = (snake[0][0] - size, snake[0][1])
if direction == 'RIGHT':
new_pos = (snake[0][0] + size, snake[0][1])
if new_pos:
snake = [new_pos] + snake
del snake[-1]
new_pos2 = None
if direction2 == 'DOWN':
new_pos2 = (snake2[0][0], snake2[0][1] + size2)
if direction2 == 'UP':
new_pos2 = (snake2[0][0], snake2[0][1] - size2)
if direction2 == 'LEFT':
new_pos2 = (snake2[0][0] - size2, snake2[0][1])
if direction2 == 'RIGHT':
new_pos2 = (snake2[0][0] + size2, snake2[0][1])
if new_pos2:
snake2 = [new_pos2] + snake2
del snake2[-1]
#snake apple collision
if collision(snake[0], apple_pos):
snake.append((-20,-20))
#snake2 apple collision
if collision(snake2[0], apple_pos):
snake2.append((-20,-20))
#snake wall collisison
if snake[0][0] < 0 or snake[0][1] < 0:
gameOver()
elif snake[0][0] > 1020 or snake[0][1] > 585:
gameOver()
if snake[0] in snake[1:]:
print("self collision")
print(snake2[0], "is in", snake2[1:])
if snake2[0] in snake2[1:]:
print("self collision")
print(snake2[0], "is in", snake2[1:])
我发现了(实际上我并没有发现,我只是使用了@rabbid76 的代码,我尝试了一些修改并且它成功了!)怎么做:
if snake[0] in snake[1:][1:]:
print("self collision")
print(snake[0], "is in", snake[1:])
我使用@Rabbid76 代码稍作改动,它可以工作!
所以我正在创建一个贪吃蛇游戏,但我无法检测到它的自我碰撞,我需要了解的是: 我的蛇是一个元组
snake = [(s_pos, s_pos),(s_pos + size, s_pos),(s_pos + size * 2, s_pos)]
就像这样,当它长大时,它会在列表中创建另一个东西,就像上面的代码一直到 snake[3]
,我知道如何检测与蛇的前 3 个部分的碰撞,但是当它上升它说索引超出范围,这是碰撞代码
def collision (c1,c2):
return (c1[0] == c2[0]) and (c1[1] == c2[1])
if collision(snake[0], snake[1]):
print("self collision")
有没有办法像
if collision(snake[0], snake[>1]):
print("self collision")
没有索引超出范围?
当蛇长大时它会创建蛇[4],我不知道如何创建一个代码来检测碰撞,对不起,如果我不清楚,让蛇长大的代码:snake.append((0,0))
我所有的代码(考虑到我对编码真的很陌生):
import pygame, random as rand, os
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((1020, 585))
pygame.display.set_caption('2snakes!')
#files location
current_path = os.path.dirname(__file__)
data_path = os.path.join(current_path, 'data')
icon = pygame.image.load(os.path.join(data_path, 'icon.png'))
pygame.display.set_icon(icon)
#variables
direction = 'RIGHT'
direction2 = 'RIGHT'
change_to = direction
change2_to = direction2
fps = 15
#snake
size = 15
s_pos = 60
snake = [(s_pos, s_pos),(s_pos + size, s_pos),(s_pos + size * 2, s_pos)]
s_skin = pygame.Surface((size, size))
s_skin.fill((82,128,208))
#snake2
size2 = 15
s2_pos = 90
snake2 = [(s2_pos, s2_pos),(s2_pos + size2, s2_pos),(s2_pos + size2 * 2, s2_pos)]
s2_skin = pygame.Surface((size2, size2))
s2_skin.fill((208,128,82))
#apple
apple = pygame.Surface((size, size))
apple_pos = (165, 150)
#collission
def collision (c1,c2):
return (c1[0] == c2[0]) and (c1[1] == c2[1])
def selfColliding(snake: list):
for i in snake:
if snake.count(i) > 1:
return True
return False
def gameOver():
#pygame.quit()
print("gameover")
def selfColliding(snake: list):
return True if snake.count(snake[0]) > 1 else False
while True:
#fps
pygame.time.Clock().tick(fps)
#basic stuff
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
#input
elif event.type == pygame.KEYDOWN:
#snake
if event.key == ord('w'):
change_to = 'UP'
if event.key == ord('s'):
change_to = 'DOWN'
if event.key == ord('a'):
change_to = 'LEFT'
if event.key == ord('d'):
change_to = 'RIGHT'
#snake2
if event.key == pygame.K_UP:
change2_to = 'UP'
if event.key == pygame.K_DOWN:
change2_to = 'DOWN'
if event.key == pygame.K_LEFT:
change2_to = 'LEFT'
if event.key == pygame.K_RIGHT:
change2_to = 'RIGHT'
#quit game
if event.key == pygame.K_ESCAPE:
pygame.event.post(pygame.event.Event(pygame.QUIT))
#noice smooth snake movement
#snake
if change_to == 'UP' and direction != 'DOWN':
direction = 'UP'
if change_to == 'DOWN' and direction != 'UP':
direction = 'DOWN'
if change_to == 'LEFT' and direction != 'RIGHT':
direction = 'LEFT'
if change_to == 'RIGHT' and direction != 'LEFT':
direction = 'RIGHT'
#snake2
if change2_to == 'UP' and direction2 != 'DOWN':
direction2 = 'UP'
if change2_to == 'DOWN' and direction2 != 'UP':
direction2 = 'DOWN'
if change2_to == 'LEFT' and direction2 != 'RIGHT':
direction2 = 'LEFT'
if change2_to == 'RIGHT' and direction2 != 'LEFT':
direction2 = 'RIGHT'
#movement
#snake
if direction == 'DOWN':
snake[0] = (snake[0][0], snake[0][1] + size)
if direction == 'UP':
snake[0] = (snake[0][0], snake[0][1] - size)
if direction == 'LEFT':
snake[0] = (snake[0][0] - size, snake[0][1])
if direction == 'RIGHT':
snake[0] = (snake[0][0] + size, snake[0][1])
#snake2
if direction2 == 'DOWN':
snake2[0] = (snake2[0][0], snake2[0][1] + size2)
if direction2 == 'UP':
snake2[0] = (snake2[0][0], snake2[0][1] - size2)
if direction2 == 'LEFT':
snake2[0] = (snake2[0][0] - size2, snake2[0][1])
if direction2 == 'RIGHT':
snake2[0] = (snake2[0][0] + size2, snake2[0][1])
#snake apple collision
if collision(snake[0], apple_pos):
snake.append((0,0))
#snake2 apple collision
if collision(snake2[0], apple_pos):
snake2.append((0,0))
#snake wall collisison
if snake[0][0] < 0 or snake[0][1] < 0:
gameOver()
elif snake[0][0] > 1020 or snake[0][1] > 585:
gameOver()
#snake2 wall collisison
#if snake2[0][0] < 0 or snake2[0][1] < 0:
#gameOver()
#elif snake2[0][0] > 1020 or snake2[0][1] > 585:
#gameOver()
#all blocks follow first
#snake
for i in range(len(snake) -1, 0, -1):
snake[i] = (snake[i-1][0], snake[i-1][1])
#snake2
for i in range(len(snake2) -1, 0, -1):
snake2[i] = (snake2[i-1][0], snake2[i-1][1])
if selfColliding:
print("self colliding")
#rendering
screen.fill((0,0,0))
apple.fill((255,0,0))
screen.blit(apple,apple_pos)
for pos in snake:
screen.blit(s_skin,pos)
for pos2 in snake2:
screen.blit(s2_skin,pos2)
pygame.display.update()
检查列表中是否多次存在任何元组的可能解决方案:
def selfColliding(snake: list):
for i in snake:
if snake.count(i) > 1:
return True
return False
或者如@Rabbid76 所指出的,如果您只想检查头部是否发生碰撞:
def selfColliding(snake: list):
return True if snake.count(snake[0]) > 1 else False
如果要测试列表中的第一个元素是否与列表中的任何其他元素相同,可以执行以下操作:
if snake[0] in snake[1:]:
print("self collision")
print(snake[0], "is in", snake[1:])
第一个元素似乎在您的列表中出现了两次。请参阅
direction = 'RIGHT'
direction2 = 'RIGHT'
# [...]
snake = [(s_pos + size * 2, s_pos),(s_pos + size, s_pos),(s_pos, s_pos)]
snake2 = [(s2_pos + size2 * 2, s2_pos),(s2_pos + size2, s2_pos),(s2_pos, s2_pos)]
# [...]
while True:
# [...]
new_pos = None
if direction == 'DOWN':
new_pos = (snake[0][0], snake[0][1] + size)
if direction == 'UP':
new_pos = (snake[0][0], snake[0][1] - size)
if direction == 'LEFT':
new_pos = (snake[0][0] - size, snake[0][1])
if direction == 'RIGHT':
new_pos = (snake[0][0] + size, snake[0][1])
if new_pos:
snake = [new_pos] + snake
del snake[-1]
new_pos2 = None
if direction2 == 'DOWN':
new_pos2 = (snake2[0][0], snake2[0][1] + size2)
if direction2 == 'UP':
new_pos2 = (snake2[0][0], snake2[0][1] - size2)
if direction2 == 'LEFT':
new_pos2 = (snake2[0][0] - size2, snake2[0][1])
if direction2 == 'RIGHT':
new_pos2 = (snake2[0][0] + size2, snake2[0][1])
if new_pos2:
snake2 = [new_pos2] + snake2
del snake2[-1]
#snake apple collision
if collision(snake[0], apple_pos):
snake.append((-20,-20))
#snake2 apple collision
if collision(snake2[0], apple_pos):
snake2.append((-20,-20))
#snake wall collisison
if snake[0][0] < 0 or snake[0][1] < 0:
gameOver()
elif snake[0][0] > 1020 or snake[0][1] > 585:
gameOver()
if snake[0] in snake[1:]:
print("self collision")
print(snake2[0], "is in", snake2[1:])
if snake2[0] in snake2[1:]:
print("self collision")
print(snake2[0], "is in", snake2[1:])
我发现了(实际上我并没有发现,我只是使用了@rabbid76 的代码,我尝试了一些修改并且它成功了!)怎么做:
if snake[0] in snake[1:][1:]:
print("self collision")
print(snake[0], "is in", snake[1:])
我使用@Rabbid76 代码稍作改动,它可以工作!