Τετάρτη 22 Ιουλίου 2026

Snake and Ladder - A RosettaCode Example

https://rosettacode.org/wiki/Snake_and_ladder#M2000_Interpreter 



MODULE SNAKE_AND_LADDER {
ESCAPE OFF
BOARD=LIST:= 4:=14, 9:=31, 17:=7, 20:=38, 28:=84, 40:=59, 51:=67, 54:=34
APPEND BOARD, 62:=19, 63:=81, 64:=60, 71:=91, 87:=24, 93:=73, 95:=75, 99:=78
BOARD2=LIST
FOR I=1 TO 100
IF EXIST(BOARD, I) THEN BOARD2(EVAL(BOARD))=I
NEXT
FOR I=1 TO 100
IF NOT EXIST(BOARD, I) THEN BOARD(I)=I
IF NOT EXIST(BOARD2, I) THEN BOARD2(I)=I
NEXT
CLS
WW=SCALE.X/12
HH=SCALE.Y/12
DIM C()
REFRESH 1000
C()=NXN(10, WW, HH, WW, HH)
FOR I=1 TO 100
J=BOARD(I)
IF I<>J THEN
LADDER I, J, WW, HH
END IF
NEXT
NXN_LABELS 10, WW, HH, WW, HH
REFRESH 25
HOLD
LONG PLAYER1=0, COMPUTER=0
MIN=MIN(WW, HH)/2
ZARI=RANDOM(1, 6)
BOOLEAN COMPUTER_PLAY=TRUE'-RANDOM(0, 1)
EVERY 1000/8 {
IF PLAYER1>0 THEN
MOVE C(PLAYER1)#VAL(0)+WW DIV 2,C(PLAYER1)#VAL(1)+HH DIV 2
PEN 15 {WIDTH 8 {CIRCLE MIN}}
END IF
IF COMPUTER>0 THEN
MOVE C(COMPUTER)#VAL(0)+WW DIV 2,C(COMPUTER)#VAL(1)+HH DIV 2
PEN 11{WIDTH 8 {CIRCLE MIN}}
END IF
REFRESH 1000
IF COMPUTER_PLAY THEN
COMPUTER+=ZARI
MOVE SCALE.X/2, SCALE.Y/2
PEN 11 {LEGEND ""+ZARI,"ARIAL", HH/10,0,2} :REFRESH
WAIT 500
IF COMPUTER>101 THEN COMPUTER=101-COMPUTER+101
IF COMPUTER=101 THEN RELEASE:EXIT
IF BOARD(COMPUTER)<>COMPUTER THEN COMPUTER=BOARD(COMPUTER)
COMPUTER_PLAY~
ELSE.IF KEYPRESS(32) THEN
PLAYER1+=ZARI
MOVE SCALE.X/2, SCALE.Y/2
PEN 15 {LEGEND ""+ZARI,"ARIAL", HH/10,0,2 }:REFRESH
WHILE KEYPRESS(32) {WAIT 10}
IF PLAYER1>101 THEN PLAYER1=101-PLAYER1+101
IF PLAYER1=101 THEN RELEASE:EXIT
IF BOARD(PLAYER1)<>PLAYER1 THEN PLAYER1=BOARD(PLAYER1)
COMPUTER_PLAY~
END IF
ZARI=RANDOM(1, 6)
IF KEYPRESS(27) THEN EXIT
RELEASE
}
IF PLAYER1=101 THEN
MOVE SCALE.X/2, SCALE.Y/2
LEGEND "PLAYER WIN","ARIAL", HH/10,0,2
ELSE.IF COMPUTER=101 THEN
MOVE SCALE.X/2, SCALE.Y/2
LEGEND "COMPUTER WIN","ARIAL", HH/10,0,2
ELSE
WHILE KEYPRESS(27) {WAIT 10}
END IF
REFRESH 25
ESCAPE ON
FUNCTION NXN(N AS LONG, W AS LONG, H AS LONG, XT AS LONG, YT AS LONG)
LOCAL LONG I, J, K=1, NN=101, S=-1
LOCAL P(1 TO N*N), C()
C()=(#2266AA, #114400)
FOR I=1 TO N
MOVE XT, YT
FOR J=0 TO N-1
NN+=S
MOVE XT+J*W, YT
P(NN)=(XT+J*W, YT)
POLYGON C(K MOD 2), W, 0,0,H,-W,0,0,-H
K++
NEXT
NN+=S:NN-=N:S*=-1
K++
YT+=H
NEXT
=P()
END FUNCTION
SUB NXN_LABELS(N AS LONG, W AS LONG, H AS LONG, XT AS LONG, YT AS LONG)
LOCAL LONG I, J, K=1, NN=101, S=-1
FOR I=1 TO N
MOVE XT, YT
FOR J=0 TO N-1
NN+=S
MOVE XT+J*W, YT
K++
PATH{POLYGON 4, W, 0,0,H,-W,0,0,-H}
IF BOARD(NN)<NN THEN
STEP W/2,H/2 : PEN 0 {CIRCLE FILL 0, W/3,H/W}
STEP -W/2,-H/2
ELSE.IF BOARD(NN)>NN THEN
STEP W/2,H/2 : PEN 14 {CIRCLE FILL 14, W/3,H/W}
STEP -W/2,-H/2
ELSE.IF BOARD2(NN)<NN THEN
STEP W/2,H/2 : PEN 14 {CIRCLE FILL 14, W/3,H/W}
STEP -W/2,-H/2
ELSE.IF BOARD2(NN)>NN THEN
STEP W/2,H/2 : PEN 0 {CIRCLE FILL 0, W/3,H/W}
STEP -W/2,-H/2
ELSE
STEP W/2,H/2 : PEN 2 {CIRCLE FILL 2, W/3,H/W}
STEP -W/2,-H/2
END IF
STEP W DIV 2, H/6-H/24
PATH 2 {FORMLABEL ""+NN,"LUCIDA",H/20*2/3, 2}
NEXT
NN+=S:NN-=N:S*=-1
K++
YT+=H
NEXT
END SUB
SUB LADDER(P1 AS INTEGER, P2 AS INTEGER, WW AS LONG, HH AS LONG)
LOCAL Z
IF P1<P2 THEN
Z=14
ELSE
SWAP P1, P2 : Z=0
END IF
MOVE C(P1)#VAL(0)+WW DIV 2,C(P1)#VAL(1)+HH DIV 2
LOCAL LONG DX=C(P2)#VAL(0)-C(P1)#VAL(0), DY=C(P2)#VAL(1)-C(P1)#VAL(1)
IF DX=0 THEN DX=WW/2:IF DX=0 THEN DX=TWIPSX
IF DY=0 THEN DY=HH/2:IF DY=0 THEN DY=TWIPSY
IF WW DIV 4 = 0 THEN WW = 4
LOCAL LONG DXN=DX DIV (WW DIV 4): IF DXN=0 THEN DXN=TWIPSX*SGN(DY)
LOCAL DYN=(DY+HH/2) DIV (DX DIV DXN), J=POS.Y-HH/2
FOR I=POS.X+DXN TO C(P2)#VAL(0)+WW/2 STEP DXN
WIDTH 8 {DRAW TO I,J,Z}: J+=DYN
NEXT
WIDTH 8 {DRAW TO C(P2)#VAL(0)+WW DIV 2,C(P2)#VAL(1)+HH DIV 2, Z}
END SUB
}
SNAKE_AND_LADDER



Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.