Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- width 40,25
- ' # são paredes
- ' - também são paredes mas que os fantasmas podem passar
- ' . são pontos comestiveis
- ' * são pontos comestiveis de invencibilidade
- ' @ é o ponto inicial do jogador
- ' x é o ponto inicial dos fantasmas
- dim as string sMap(25),sM(25)
- sM( 1)="7888888888w8888888889"
- sM( 2)="4.........5.........6"
- sM( 3)="4.789.789.5.789.789.6"
- sM( 4)="4*5 5.5 5.5.5 5.5 5*6"
- sM( 5)="4.123.123.s.123.123.6"
- sM( 6)="4...................6"
- sM( 7)="4.789.w.78889.w.789.6"
- sM( 8)="4.123.5.12w23.5.123.6"
- sM( 9)="4.....5...5...5.....6"
- sM(10)="18889.a88.s.88d.78883"
- sM(11)=" 5.5.......5.5 "
- sM(12)="22223.s.7---9.s.12222"
- sM(13)=" ...5 x 5... "
- sM(14)="88889.w.18883.w.78888"
- sM(15)=" 5.5.......5.5 "
- sM(16)="72223.s.22w22.s.12229"
- sM(17)="4.........5.........6"
- sM(18)="4.889.888.5.888.788.6"
- sM(19)="4*..5.....@.....5..*6"
- sM(20)="189.5.w.78889.w.5.783"
- sM(21)="723.s.5.12w23.5.s.129"
- sM(22)="4.....5...5...5.....6"
- sM(23)="4.8888s88.s.88s8888.6"
- sM(24)="4...................6"
- sM(25)="122222222222222222223"
- dim as integer iX,iY,iC,M,N,iOff1,iOff2
- dim as integer iPlayerX,iPlayerY,iStartX,iStartY
- dim as integer iSpawnX,iSpawnY,iRand,iLevel=1,iPlayer=1
- dim as integer iScore=0,iScore2,iLives=3,iAuto=4
- dim as integer iErase,iUpdate=1
- dim as integer iGhostX(3),iGhostY(3),iGhostSX(3),iGhostSY(3)
- dim as integer iGhostMov(3),iGhostWait(3),iGhostSlow(3)
- 'dim as integer iGhostColor(3)={2,3,4,5}
- do
- dim as integer iDots,iSuper,iDead=1
- locate 1,1
- 'exibe labirinto inicial conforme os dados no mapa
- 'salvando os pontos de teleporte, e os pontos iniciais do jogador/fantasmas
- for iY=1 to 25
- sMap(iY)=sM(iY)
- for iX=1 to 21
- iC = asc( sMap(iY) , iX )
- 'if iC = asc("#") then color 9 : print "#"; : mid(sMap(iY),iX,1) = "#"
- if iC = asc("1") then color 9 : print chr(200); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("2") then color 9 : print chr(205); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("3") then color 9 : print chr(188); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("4") then color 9 : print chr(186); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("5") then color 9 : print chr(186); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("6") then color 9 : print chr(186); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("7") then color 9 : print chr(201); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("8") then color 9 : print chr(205); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("9") then color 9 : print chr(187); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("w") then color 9 : print chr(203); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("s") then color 9 : print chr(202); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("a") then color 9 : print chr(204); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("d") then color 9 : print chr(185); : mid(sMap(iY),iX,1) = "y"
- if iC = asc("-") then color 9 : print "-"; : mid(sMap(iY),iX,1) = "z"
- if iC = asc(" ") then print " ";
- if iC = asc("x") then print " "; : iSpawnX=iX : iSpawnY=iY
- if iC = asc(".") then color 6 : print chr(250); : iDots += 1
- if iC = asc("*") then color 14 : print chr(254); : iDots += 1
- if iC = asc("@") then print " "; : iStartX=iX : iStartY=iY
- next iX
- if iY <> 25 then print 'avança para a próxima linha (menos na última)
- next iY
- 'posição inicial dos fantasmas
- 'e tempo entre cada movimentação
- for N=0 to 3
- iGhostX(N) = iSpawnX : iGhostY(N) = iSpawnY
- iGhostSX(N) = 1 : iGhostSY(N) = 0
- iGhostWait(N) = N*128+N+32 : iGhostSlow(N) = 0
- next N
- iPlayerX = iStartX : iPlayerY = iStartY
- dim as string sKey , sKey1 , sKey2
- do
- 'ajusta o nosso "aleatório"
- iRand += 1
- while iRand > 3
- iRand -= 4
- wend
- 'movimenta os fantasmas
- for N = 0 to 3
- iX = iGhostX(N) : iY = iGhostY(N)
- 'apaga fantasma (coloca devolta o que tinha na posição dele)
- locate iY,iX : iC = asc( sMap(iY) , iX )
- if iC = asc(".") then color 6 : print chr(250);
- if iC = asc("z") then color 9 : print "-";
- if iC = asc("*") then color 14 : print chr(254);
- if iC <> asc(".") and iC <> asc("*") and iC <> asc("z") then print " ";
- 'se jogador tocou fantasma então um deles morre
- if iX=iPlayerX and iY=iPlayerY then
- if iGhostSlow(N)>0 then 'fantasma morre
- iScore += 150
- for M = 0 to 3
- if iGhostWait(M) > 8 then iScore += 50
- next M
- iGhostX(N) = iSpawnX : iGhostY(N) = iSpawnY
- iGhostSX(N) = 1 : iGhostSY(N) = 0
- iGhostWait(N) = 128+N : iGhostSlow(N) = 0
- else 'jogador morre
- iDead = 1 : sKey1 = "" : sKey2 = ""
- end if
- end if
- if iGhostWait(N)>0 then
- 'reduz o contador e passa ao próximo fantasma até que ele zere
- if iGhostWait(N) < 9 or iGhostSlow(N)=0 then iGhostWait(N) -= 1
- if iGhostWait(N) < 1 then
- 'fantasmas metade da velocidade enquanto jogador esta super
- if iGhostSlow(N)>0 then iGhostWait(N) = 8 else iGhostWait(N) = 4
- iC = 0
- 'que direções o fantasma pode ir?
- '1) não pode bater nas paredes
- '2) não pode voltar aonde veio
- '3) não pode bater em outro fantasma
- dim as integer iUp=0,iDn=0,iLt=0,iRt=0
- 'previne o fantasma de mover um em cima do outro
- for M = 0 to 3
- if M = N then continue for 'ignora o próprio
- if (iX+1)=iGhostX(M) and (iY )=iGhostY(M) then iRt=-1
- if (iX-1)=iGhostX(M) and (iY )=iGhostY(M) then iLt=-1
- if (iX )=iGhostX(M) and (iY-1)=iGhostY(M) then iUp=-1
- if (iX )=iGhostX(M) and (iY+1)=iGhostY(M) then iDn=-1
- next M
- 'se não bater na parede e não estiver voltando então adiciona direção valida
- if iRt=0 and asc( sMap( iY ) , iX+1 ) < asc("y") and iX < 21 then
- if iGhostSX(N)<>-1 or iGhostSY(N)<> 0 then iC += 1 : iRt = 1 : iRand += 1 else iRt = -2
- end if
- if iLt=0 and asc( sMap( iY ) , iX-1 ) < asc("y") and iX > 1 then
- if iGhostSX(N)<> 1 or iGhostSY(N)<> 0 then iC += 2 : iLt = 1 : iRand += 1 else iLt = -2
- end if
- if iUp=0 and asc( sMap( iY-1 ) , iX ) <> asc("y") then
- if iGhostSX(N)<> 0 or iGhostSY(N)<> 1 then iC += 4 : iUp = 1 : iRand += 1 else iUp = -2
- end if
- if iDn=0 and asc( sMap( iY+1 ) , iX ) < asc("y") then
- if iGhostSX(N)<> 0 or iGhostSY(N)<>-1 then iC += 8 : iDn = 1 : iRand += 1 else iDn = -2
- end if
- 'se não houver outra possibilidade de movimento então permite ir na direção oposta
- if iC=0 then
- if iRt=-2 and iGhostSX(N)=-1 and iGhostSY(N)= 0 then iC += 1 : iRt = 1 : iRand += 1
- if iLt=-2 and iGhostSX(N)=+1 and iGhostSY(N)= 0 then iC += 2 : iLt = 1 : iRand += 1
- if iUp=-2 and iGhostSX(N)= 0 and iGhostSY(N)=+1 then iC += 4 : iUp = 1 : iRand += 1
- if iDn=-2 and iGhostSX(N)= 0 and iGhostSY(N)=-1 then iC += 8 : iDn = 1 : iRand += 1
- end if
- 'decide nova direção
- if 1 then 'N = 1 or N = 3 then
- M = 1000
- iOff1 = iPlayerX-iX : if iGhostSlow(N)>0 then ioff1 = -iOff1
- ioff2 = iOff1 : if ioff2 < 0 then ioff2 = -ioff2
- if ioff2>0 and ioff2<M then
- if iRt=1 and iOff1>0 then iGhostSX(N) = 1 : iGhostSY(N) = 0 : M = ioff2
- if iLt=1 and iOff1<0 then iGhostSX(N) = -1 : iGhostSY(N) = 0 : M = ioff2
- end if
- iOff1 = iPlayerY-iY : if iGhostSlow(N)>0 then ioff1 = -iOff1
- ioff2 = iOff1 : if ioff2 < 0 then ioff2 = -ioff2
- if ioff2>0 and ioff2<M then
- if iDn=1 and iOff1>0 then iGhostSX(N) = 0 : iGhostSY(N) = +1 : M = ioff2
- if iUp=1 and iOff1<0 then iGhostSX(N) = 0 : iGhostSY(N) = -1 : M = ioff2
- end if
- if iC=0 or M <> 1000 then M = 0
- else
- if iC>0 and iC <> iGhostMov(N) then M = 1 else M = 0
- end if
- while M
- iRand += 1 : while iRand>3 : iRand -= 4 : wend
- if iRand=0 and iRt=1 then iGhostSX(N) = 1 : iGhostSY(N) = 0 : exit while
- if iRand=1 and iDn=1 then iGhostSX(N) = 0 : iGhostSY(N) = 1 : exit while
- if iRand=2 and iLt=1 then iGhostSX(N) = -1 : iGhostSY(N) = 0 : exit while
- if iRand=3 and iUp=1 then iGhostSX(N) = 0 : iGhostSY(N) = -1 : exit while
- wend
- 'move o fantasma (se puder)
- iGhostMov(N)=iC
- if iC>0 then
- iGhostX(N) += iGhostSX(N)
- iGhostY(N) += iGhostSY(N)
- end if
- end if
- end if
- 'se está morto então coloca os fantasmas na posição/tempo padrão
- if iDead then
- iGhostX(N)=iSpawnX : iGhostY(N)=iSpawnY
- iGhostWait(N) = N*128+N+32
- end if
- locate iGhostY(N),iGhostX(N)
- if iGhostSlow(N)>0 then
- 'enquanto player estar super fantasmas ficam da mesma cor
- 'mas quando o super estiver para acabar eles piscam
- iC = 3
- for M=4 to 40 step 4
- if iSuper>M then
- if iC=3 then iC=15 else iC=3
- end if
- next M
- color iC
- else
- color N+10
- end if
- print chr(15);
- next N
- 'se esta morto coloca o jogador na posição padrão
- 'e se ele não estava na posição padrão então desconta uma vida
- if iDead then
- if iPlayerX<>iStartX or iPlayerY<>iStartY then
- locate iPlayerY,iPlayerX : print " "; : iLives -= 1
- end if
- iPlayerX = iStartX : iPlayerY = iStartY
- else
- if (iScore-iScore2) > 5000 then
- iScore2 = iScore2 + 5000 : iLives += 1
- end if
- end if
- 'teleporta de um lado a outro
- if iPlayerX < 1 then iPlayerX = 21 : iRand += 3
- if iPlayerX > 21 then iPlayerX = 1 : iRand += 1
- 'quando pisa num ponto come ele, reduz a contagem pontos
- 'se não tiver mais pontos para comer, venceu!
- if asc( sMap(iPlayerY) , iPlayerX ) = asc(".") then
- iDots -= 1 : iRand += 2 : iScore += 5
- mid( sMap(iPlayerY) , iPlayerX ) = " "
- end if
- 'se era um super ponto fica poderoso por 256 frames
- if asc( sMap(iPlayerY) , iPlayerX ) = asc("*") then
- iDots -= 1 : iSuper += 256 : iRand += 3 : iScore += 20
- mid( sMap(iPlayerY) , iPlayerX ) = " "
- 'reiniciar AI ao começar o super
- for N = 0 to 3
- if iGhostX(N)<>iSpawnX or iGhostY(N)<>iSpawnY then iGhostMov(N) = 0 : iGhostSlow(N) = 1
- next N
- end if
- 'informações na tela
- if iUpdate then
- color 15 : locate 2,23 : print "Dots.: ";iDots;" ";
- color 14 : locate 4,23 : print "Super: ";(iSuper+19)\20;" ";
- color 10 : locate 6,23 : print "Score: ";iScore
- color 12 : locate 8,23 : print "Vidas: ";iLives
- color 11 : locate 10,23 : print "Nivel: ";iLevel
- end if
- 'se estiver poderoso pisca entre chr(1) e chr(2) senão só chr(1)
- if iSuper > 0 then
- iSuper -= 1 : iRand += 1
- iPlayer = 3-iPlayer '2<->1
- if iSuper=0 then 'reiniciar AI se acabou super
- for N = 0 to 3
- if iGhostSlow(N) > 0 then iGhostMov(N) = 0 : iGhostSlow(N) = 0
- next N
- end if
- else
- iPlayer = 1
- end if
- 'se não tiver mais vidas acaba sem o jogador aparecer na tela
- if iLives < 1 then exit do
- 'desenha jogador
- locate iPlayerY,iPlayerX,0
- color 14 : print chr(iPlayer);
- 'se tiver pego todos os pontos acaba com o jogador aparecendo na tela
- if iDots < 1 then exit do
- 'enquanto nenhuma tecla estiver pressionada volta para o começo do loop
- sKey = inkey
- 'if sKey = "" then sleep 50,1 : continue do
- sleep 50-iLevel,1
- if sKey="" orelse sKey=sKey1 then
- iAuto = iAuto-1
- if iAuto then continue do
- iAuto=4 : if sKey = "" then sKey=sKey2
- end if
- sKey2 = sKey
- 'apaga jogador (possível mudará de posição)
- if sKey = chr(27) then exit do 'escape quit
- 'uma das setas foi pressionada? e o jogador pode se mover para lá?
- iErase = 0 : iX = iPlayerX : iY = iPlayerY
- for N = 0 to 1
- if sKey = chr(255)+"K" and asc( sMap(iPlayerY ) , iPlayerX-1 ) < asc("y") then
- iPlayerX -= 1 : iRand += 1 : sKey1 = sKey : iErase = 1
- end if
- if sKey = chr(255)+"M" and asc( sMap(iPlayerY ) , iPlayerX+1 ) < asc("y") then
- iPlayerX += 1 : iRand += 2 : sKey1 = sKey : iErase = 1
- end if
- if sKey = chr(255)+"H" and asc( sMap(iPlayerY-1) , iPlayerX ) < asc("y") then
- iPlayerY -= 1 : iRand += 3 : sKey1 = sKey : iErase = 1
- end if
- if sKey = chr(255)+"P" and asc( sMap(iPlayerY+1) , iPlayerX ) < asc("y") then
- iPlayerY += 1 : iRand += 1 : sKey1 = sKey : iErase = 1
- end if
- if sKey=sKey1 then exit for
- sKey = sKey1
- next N
- if iErase=1 then locate iY,iX : print " "; : iDead=0
- loop
- if iDots <= 0 then
- for N = 0 to 15
- if iC=10 then iC=15 else iC=10
- if N = 15 then iC = 0
- locate 16,24 : color iC
- print "Well Done!";
- sleep 150,1
- next N
- iLevel += 1 : continue do
- else
- if iLives <= 0 then
- while inkey<>chr(27)
- if iC=12 then iC=9 else iC=12
- locate 16,24 : color iC
- print "GAME OVER!";
- sleep 200,1
- wend
- end if
- end if
- exit do
- loop
Add Comment
Please, Sign In to add comment