如何为这个游戏制作算法?

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 是空的,所以玩家可以绕过其他车。为确保不会偶然出现长长的自由路区域,大幅增加了车辆出现在玩家队伍中的概率。

如果有人需要任何进一步的信息或我的代码(无论出于何种原因,我不知道),请随时回来找我。

谢谢你帮我!