Computer Science Canada

Simple Pacman AI

Author:  Artimes [ Thu Nov 04, 2004 7:34 pm ]
Post subject:  Simple Pacman AI

I'm making a Pac-Man game and I need some simple AI for my ghosts... This is what I have

code:

 if (superpacman = 0) then
        Pic.Draw (picBlinky1, xBlinky - 10, yBlinky - 10, picMerge)
        if (dirBlinky1 = 1) then
            Pic.Draw (picBlinky3, xBlinky - 5, yBlinky + 1, picMerge)
        elsif (dirBlinky1 = 2) then
            Pic.Draw (picBlinky4, xBlinky - 5, yBlinky + 1, picMerge)
        elsif (dirBlinky1 = 3) then
            Pic.Draw (picBlinky5, xBlinky - 5, yBlinky + 1, picMerge)
        elsif (dirBlinky1 = 4) then
            Pic.Draw (picBlinky6, xBlinky - 5, yBlinky + 1, picMerge)
        end if
    else
        Pic.Draw (picBlinky2, xBlinky - 10, yBlinky - 10, picMerge)
    end if

    if (dirBlinky1 = 1) and (findTile (xBlinky, yBlinky + 10) > 2) then
        dirBlinky1 := Rand.Int (1, 4)
    elsif (dirBlinky1 = 2) and (findTile (xBlinky + 10, yBlinky) > 2) then
        dirBlinky1 := Rand.Int (1, 4)
    elsif (dirBlinky1 = 3) and (findTile (xBlinky, yBlinky - 10) > 2) then
        dirBlinky1 := Rand.Int (1, 4)
    elsif (dirBlinky1 = 4) and (findTile (xBlinky - 10, yBlinky) > 2) then
        dirBlinky1 := Rand.Int (1, 4)
    elsif (dirBlinky1 = 5) then
        dirBlinky1 := Rand.Int (1, 4)
    end if

    dirBlinky2 := false
    if (disBlinky = 0) and (dirBlinky2 = false) then
        if (dirBlinky1 = 1) and (findTile (xBlinky + 20, yBlinky) <= 2) or (findTile (xBlinky + 20, yBlinky) = 12) then
            dirBlinky1 := Rand.Int (1, 2)
            if (dirBlinky1 = 2) then
                dirBlinky1 := 2
            else
                dirBlinky1 := 1
            end if
            dirBlinky2 := true
            disBlinky := 0
        elsif (dirBlinky1 = 1) and (findTile (xBlinky - 20, yBlinky) <= 2) or (findTile (xBlinky - 20, yBlinky) = 12) then
            dirBlinky1 := Rand.Int (1, 2)
            if (dirBlinky1 = 2) then
                dirBlinky1 := 4
            else
                dirBlinky1 := 1
            end if
            dirBlinky2 := true
            disBlinky := 0
        elsif (dirBlinky1 = 2) and (findTile (xBlinky, yBlinky + 20) <= 2) or (findTile (xBlinky, yBlinky + 20) = 12) then
            dirBlinky1 := Rand.Int (1, 2)
            if (dirBlinky1 = 2) then
                dirBlinky1 := 1
            else
                dirBlinky1 := 2
            end if
            dirBlinky2 := true
            disBlinky := 0
        elsif (dirBlinky1 = 2) and (findTile (xBlinky, yBlinky - 20) <= 2) or (findTile (xBlinky, yBlinky - 20) = 12) then
            dirBlinky1 := Rand.Int (1, 2)
            if (dirBlinky1 = 2) then
                dirBlinky1 := 3
            else
                dirBlinky1 := 2
            end if
            dirBlinky2 := true
            disBlinky := 0
        elsif (dirBlinky1 = 3) and (findTile (xBlinky + 20, yBlinky) <= 2) or (findTile (xBlinky + 20, yBlinky) = 12) then
            dirBlinky1 := Rand.Int (1, 2)
            if (dirBlinky1 = 2) then
                dirBlinky1 := 2
            else
                dirBlinky1 := 3
            end if
            dirBlinky2 := true
            disBlinky := 0
        elsif (dirBlinky1 = 3) and (findTile (xBlinky - 20, yBlinky) <= 2) or (findTile (xBlinky - 20, yBlinky) = 12) then
            dirBlinky1 := Rand.Int (1, 2)
            if (dirBlinky1 = 2) then
                dirBlinky1 := 4
            else
                dirBlinky1 := 3
            end if
            dirBlinky2 := true
            disBlinky := 0
        elsif (dirBlinky1 = 4) and (findTile (xBlinky, yBlinky + 20) <= 2) or (findTile (xBlinky, yBlinky + 20) = 12) then
            dirBlinky1 := Rand.Int (1, 2)
            if (dirBlinky1 = 2) then
                dirBlinky1 := 1
            else
                dirBlinky1 := 4
            end if
            dirBlinky2 := true
            disBlinky := 0
        elsif (dirBlinky1 = 4) and (findTile (xBlinky, yBlinky - 20) <= 2) or (findTile (xBlinky, yBlinky - 20) = 12) then
            dirBlinky1 := Rand.Int (1, 2)
            if (dirBlinky1 = 2) then
                dirBlinky1 := 3
            else
                dirBlinky1 := 4
            end if
            dirBlinky2 := true
            disBlinky := 0
        else
            if (dirBlinky1 = 1) and (findTile (xBlinky, yBlinky + 10) > 2) then
                dirBlinky1 := 5
            elsif (dirBlinky1 = 2) and (findTile (xBlinky + 10, yBlinky) > 2) then
                dirBlinky1 := 5
            elsif (dirBlinky1 = 3) and (findTile (xBlinky, yBlinky - 10) > 2) then
                dirBlinky1 := 5
            elsif (dirBlinky1 = 4) and (findTile (xBlinky - 10, yBlinky) > 2) then
                dirBlinky1 := 5
            end if
        end if
    end if

    if (yBlinky = 349) and (dirBlinky1 = 1) then
        yBlinky := 70
    elsif (xBlinky = 349) and (dirBlinky1 = 2) then
        xBlinky := 30
    elsif (yBlinky = 70) and (dirBlinky1 = 3) then
        yBlinky := 349
    elsif (xBlinky = 30) and (dirBlinky1 = 4) then
        xBlinky := 349
    end if

    if (dirBlinky1 = 5) then
        disBlinky := 0
        dirBlinky2 := true
    else
        disBlinky := disBlinky + 1
    end if
    if (disBlinky >= 20) then
        disBlinky := 0
    end if


That's just to make the AI pick a direction when he hits and intersection or a wall... But it glitches... There are too many variables to explain, if you would be kindest enough I would PM you the rest of the game and it might make some more sence. (Blinky is the name of the ghost)

Author:  wtd [ Thu Nov 04, 2004 8:24 pm ]
Post subject: 

It really looks like you need to refactor. Look up tutorials on functions and procedures.

Author:  Artimes [ Thu Nov 04, 2004 8:35 pm ]
Post subject: 

I've tried a tonne of other methods... This one kinda works but the ghosts cut some corners short and overlap the wall.


: