⚠️ Warning: This is a draft ⚠️
This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.
If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.
Phix
{{trans|C++}}
constant W = 62, H = 42, INC = 10
integer robotsCount, aliveRobots, score, X, Y, alive
sequence board = repeat(repeat(' ',W),H)
procedure clearBoard()
board = repeat(repeat('#',W),H)
for y=2 to H-1 do
for x=2 to W-1 do
board[y,x] = ' '
end for
end for
end procedure
procedure printScore()
position(H,1); bk_color(GREEN); text_color(BRIGHT_GREEN);
printf(1," SCORE: %d ", score)
end procedure
procedure createBoard()
aliveRobots = robotsCount
for x=1 to robotsCount do
while true do
integer a = rand(W),
b = rand(H)
if board[b,a]=' ' then
board[b,a]='+'
exit
end if
end while
end for
end procedure
procedure displayBoard()
position(1,1)
for y=1 to H do
for x=1 to W do
integer t = board[y,x],
k = find(t," #+A*@")
bk_color(BLACK)
text_color({WHITE,BRIGHT_BLUE,YELLOW,BRIGHT_RED,BRIGHT_RED,BRIGHT_GREEN}[k])
puts(1,t)
end for
puts(1,"\n")
end for
printScore()
end procedure
procedure checkCollision(integer x, y)
if X==x and Y==y then
alive = false
board[y,x] = 'A'
else
integer c = board[y,x]
if find(c,"*+~") then
board[y,x] = '*'
c = 1+(c!='*')
aliveRobots -= c
score += c
end if
end if
end procedure
procedure moveRobots()
for y=1 to H do
for x=1 to W do
if board[y,x]='+' then
integer tx = x+compare(X,x),
ty = y+compare(Y,y)
if tx!=x or ty!=y then
board[y,x] = ' '
if board[ty,tx]=' ' then
board[ty,tx] = '~'
else
checkCollision(tx, ty)
end if
end if
end if
end for
end for
for y=1 to H do
for x=1 to W do
if board[y,x]=='~' then board[y,x] = '+' end if
end for
end for
end procedure
procedure execute(integer x, y)
board[Y,X] = ' '; X += x; Y += y;
board[Y,X] = '@'; moveRobots();
end procedure
procedure teleport()
board[Y,X] = ' '
X = rand(W-2) + 1;
Y = rand(H-2) + 1;
if find(board[Y,X],"*+~") then
alive = false
board[Y,X] = 'A'
else
board[Y,X] = '@'
end if
moveRobots()
end procedure
procedure waitForEnd()
while aliveRobots and alive do
moveRobots()
displayBoard()
sleep(0.5)
end while
end procedure
procedure getInput()
while true do
integer k = upper(wait_key())
if k='Q' and X > 2 and Y > 2 then execute(-1,-1) exit
elsif k='W' and Y > 2 then execute( 0,-1) exit
elsif k='E' and X < W-1 and Y > 2 then execute( 1,-1) exit
elsif k='A' and X > 2 then execute(-1, 0) exit
elsif k='D' and X < W-1 then execute( 1, 0) exit
elsif k='Y' and X > 2 and Y < H-1 then execute(-1, 1) exit
elsif k='X' and Y < H-1 then execute( 0, 1) exit
elsif k='C' and X < W-1 and Y < H-1 then execute( 1, 1) exit
elsif k='T' then teleport() exit
elsif k='Z' then waitForEnd() exit
elsif k='!' then alive = false exit
end if
end while
printScore()
end procedure
procedure play()
clear_screen()
while true do
cursor(NO_CURSOR)
robotsCount = 10; score = 0; alive = true;
clearBoard(); X = rand(W-2); Y = rand(H-2);
board[Y,X] = '@'; createBoard();
while alive do
displayBoard(); getInput();
if aliveRobots=0 then
robotsCount += INC; clearBoard();
board[Y,X] = '@'; createBoard();
end if
end while
displayBoard()
position(25, 1); bk_color(BLACK); text_color(WHITE)
position( 8,10); puts(1,"+----------------------------------------+")
position( 9,10); puts(1,"| GAME OVER |")
position(10,10); puts(1,"| PLAY AGAIN(Y/N)? |")
position(11,10); puts(1,"+----------------------------------------+")
position(10,39); cursor(BLOCK_CURSOR);
if upper(wait_key())!='Y' then exit end if
end while
clear_screen()
end procedure
play()