如何为这个游戏制作算法?
How to make an algorithm for this game?
我正在尝试重新编码我小时候在一台非常旧的 PC 上玩过的游戏。为此,我可能需要一些谜语或逻辑爱好者的帮助。原理很简单:
在window右边是一个“车”(五个长方形类似车的结构)可以三行移动,顶行,中行,底行.其他汽车从这三条线之一的 window 左侧驶来,并向右侧的汽车移动。玩家必须移动右侧的汽车,以免与左侧驶来的汽车相撞。
从左边驶来的汽车被保存在一个列表中。如果一辆车移出框架,就会产生另一辆车。所有的汽车都是用一个循环遍历汽车数组的for循环来模拟的。
但我似乎无法找出一种算法来在正确的线上生成新车。有一些限制,以确保汽车有可能通过。
不允许这样的例子:
为了防止这种情况,我使用了这个条件:
if cars[-1].line != cars[-2].line:
pssble=[carss[-1].line,cars[-2].line]
cars.append(Auto(pssble[random.randint(0,1)])
因此,如果最后两辆车不在同一行,则第三辆车必须在其中一排,否则会发生如上图所示的情况。
但是可能会发生其他事情。这个:
我现在可以继续解释任何事情的每一种可能性,但我怀疑这对任何人都没有帮助。如果可以,请告诉我,我会描述更多。
虽然我找到了让汽车不挡路的可能性,但它间接地迫使所有汽车排成两条线,这样玩家就不必再移动了。这也不是我想要的。
总而言之,要么游戏因为汽车被堵住而无法进行,要么游戏很无聊,因为你什么都不用做。
如果有人对如何解决这个问题有想法,或者对这个问题的逻辑谜题感兴趣,我会很高兴得到一个 awnser。我将把整个代码放在下面。
提前致谢
代码:
#Setup
import pygame, sys, random, time
from pygame.locals import *
from pygame import mixer
import math
pygame.init()
pygame.font.init()
infobj=pygame.display.Info()
WINDOWWIDTH= 1000#infobj.current_w
WINDOWHEIGHT=400#infobj.current_h
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE=(255, 255, 255)
BROWN=(139, 69, 19)
RED=(255,0,0)
Grey=(179,179,179)
clock=0.06
MOVESPEED=8
carHeight=3 #As in current line of the car
autos=[] #the list of cars
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
auto=pygame.image.load("Auto.png")
auto=pygame.transform.scale(auto,(int(WINDOWWIDTH/5),int(WINDOWHEIGHT/3)))
playerrect=auto.get_rect()
playerrect.bottom=WINDOWHEIGHT/carHeight
playerrect.left=0
global windowSufarce
class Auto:
def __init__(self, line):
self.line=line
self.auto=pygame.image.load("Auto.png")
self.auto=pygame.transform.scale(auto,(int(WINDOWWIDTH/5),int(WINDOWHEIGHT/3)))
self.autorect=auto.get_rect()
self.autorect.bottom=(WINDOWHEIGHT/3)*self.line
self.autorect.left=WINDOWWIDTH
def sim(self):
self.autorect.left=self.autorect.left-MOVESPEED
windowSurface.blit(self.auto,self.autorect)
#makes two cars at the beginning
autos.append(Auto(random.randint(1,3)))
autos.append(Auto(random.randint(1,3)))
while True:
windowSurface.fill(WHITE)
playerrect.bottom=(WINDOWHEIGHT/3)*carHeight
windowSurface.blit(auto, playerrect)
if autos[-1].autorect.right<=WINDOWWIDTH-4 and autos[-1].autorect.right>=WINDOWWIDTH-10:
if something: #THIS IS THE PROBLEM. This is where I need the conditions for the car. All my tries, even consisting of up to 6 if-statements failed.
autos.append(Auto(LINE))
for car in autos:
try:
car.sim()
except:
pass
if playerrect.colliderect(car.autorect):
print("Collision detected. Exiting")
sys.exit()
pygame.display.update()
time.sleep(clock)
#Keyboard stuff
pressed=pygame.key.get_pressed()
if (pressed[pygame.K_w] or pressed[pygame.K_UP]) and carHeight>1:
carHeight=carHeight-1
if (pressed[pygame.K_s] or pressed[pygame.K_DOWN]) and carHeight<3:
carHeight=carHeight+1
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
感谢The_spider和fana的评论,我找到了解决方案。我在问题中解释的条件仍然存在。 class Auto
已被修改,可以传递一个附加参数,将 Car 标记为可见或不可见。每产生四辆汽车就被定义为不可见,并加载空白图像,这些汽车的碰撞检测也被停用。
通过这个解决方案,上图的情况被上述条件避免了,下图的情况和所有其他堵车的可能性被每四分之一的事实避免了car-sized space 是空的,所以玩家可以绕过其他车。为确保不会偶然出现长长的自由路区域,大幅增加了车辆出现在玩家队伍中的概率。
如果有人需要任何进一步的信息或我的代码(无论出于何种原因,我不知道),请随时回来找我。
谢谢你帮我!
我正在尝试重新编码我小时候在一台非常旧的 PC 上玩过的游戏。为此,我可能需要一些谜语或逻辑爱好者的帮助。原理很简单:
在window右边是一个“车”(五个长方形类似车的结构)可以三行移动,顶行,中行,底行.其他汽车从这三条线之一的 window 左侧驶来,并向右侧的汽车移动。玩家必须移动右侧的汽车,以免与左侧驶来的汽车相撞。
从左边驶来的汽车被保存在一个列表中。如果一辆车移出框架,就会产生另一辆车。所有的汽车都是用一个循环遍历汽车数组的for循环来模拟的。
但我似乎无法找出一种算法来在正确的线上生成新车。有一些限制,以确保汽车有可能通过。
不允许这样的例子:
为了防止这种情况,我使用了这个条件:
if cars[-1].line != cars[-2].line:
pssble=[carss[-1].line,cars[-2].line]
cars.append(Auto(pssble[random.randint(0,1)])
因此,如果最后两辆车不在同一行,则第三辆车必须在其中一排,否则会发生如上图所示的情况。
但是可能会发生其他事情。这个:
我现在可以继续解释任何事情的每一种可能性,但我怀疑这对任何人都没有帮助。如果可以,请告诉我,我会描述更多。
虽然我找到了让汽车不挡路的可能性,但它间接地迫使所有汽车排成两条线,这样玩家就不必再移动了。这也不是我想要的。
总而言之,要么游戏因为汽车被堵住而无法进行,要么游戏很无聊,因为你什么都不用做。
如果有人对如何解决这个问题有想法,或者对这个问题的逻辑谜题感兴趣,我会很高兴得到一个 awnser。我将把整个代码放在下面。
提前致谢
代码:
#Setup
import pygame, sys, random, time
from pygame.locals import *
from pygame import mixer
import math
pygame.init()
pygame.font.init()
infobj=pygame.display.Info()
WINDOWWIDTH= 1000#infobj.current_w
WINDOWHEIGHT=400#infobj.current_h
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE=(255, 255, 255)
BROWN=(139, 69, 19)
RED=(255,0,0)
Grey=(179,179,179)
clock=0.06
MOVESPEED=8
carHeight=3 #As in current line of the car
autos=[] #the list of cars
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
auto=pygame.image.load("Auto.png")
auto=pygame.transform.scale(auto,(int(WINDOWWIDTH/5),int(WINDOWHEIGHT/3)))
playerrect=auto.get_rect()
playerrect.bottom=WINDOWHEIGHT/carHeight
playerrect.left=0
global windowSufarce
class Auto:
def __init__(self, line):
self.line=line
self.auto=pygame.image.load("Auto.png")
self.auto=pygame.transform.scale(auto,(int(WINDOWWIDTH/5),int(WINDOWHEIGHT/3)))
self.autorect=auto.get_rect()
self.autorect.bottom=(WINDOWHEIGHT/3)*self.line
self.autorect.left=WINDOWWIDTH
def sim(self):
self.autorect.left=self.autorect.left-MOVESPEED
windowSurface.blit(self.auto,self.autorect)
#makes two cars at the beginning
autos.append(Auto(random.randint(1,3)))
autos.append(Auto(random.randint(1,3)))
while True:
windowSurface.fill(WHITE)
playerrect.bottom=(WINDOWHEIGHT/3)*carHeight
windowSurface.blit(auto, playerrect)
if autos[-1].autorect.right<=WINDOWWIDTH-4 and autos[-1].autorect.right>=WINDOWWIDTH-10:
if something: #THIS IS THE PROBLEM. This is where I need the conditions for the car. All my tries, even consisting of up to 6 if-statements failed.
autos.append(Auto(LINE))
for car in autos:
try:
car.sim()
except:
pass
if playerrect.colliderect(car.autorect):
print("Collision detected. Exiting")
sys.exit()
pygame.display.update()
time.sleep(clock)
#Keyboard stuff
pressed=pygame.key.get_pressed()
if (pressed[pygame.K_w] or pressed[pygame.K_UP]) and carHeight>1:
carHeight=carHeight-1
if (pressed[pygame.K_s] or pressed[pygame.K_DOWN]) and carHeight<3:
carHeight=carHeight+1
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
感谢The_spider和fana的评论,我找到了解决方案。我在问题中解释的条件仍然存在。 class Auto
已被修改,可以传递一个附加参数,将 Car 标记为可见或不可见。每产生四辆汽车就被定义为不可见,并加载空白图像,这些汽车的碰撞检测也被停用。
通过这个解决方案,上图的情况被上述条件避免了,下图的情况和所有其他堵车的可能性被每四分之一的事实避免了car-sized space 是空的,所以玩家可以绕过其他车。为确保不会偶然出现长长的自由路区域,大幅增加了车辆出现在玩家队伍中的概率。
如果有人需要任何进一步的信息或我的代码(无论出于何种原因,我不知道),请随时回来找我。
谢谢你帮我!