This is (finally) my 1000th post and what better way than some of my finest (non COM) code. Here is KiXmaze3D - the first 3D game written in KiX... enjoy... again...


Code:

; 
; KiXmaze
;
; a 3D maze game
; by cj
;
; version 1.4
;

break on ; allow CTRL+C and setup vars
$=setascii("on") $x=chr(219) $x3=$x+$x+$x $up=chr(223) $dn=chr(220) $up3=$up+$up+$up $dn3=$dn+$dn+$dn
$xup1=chr(220)+chr(223)+chr(223) $xup2=chr(220)+chr(220)+chr(223)
$xdn1=chr(223)+chr(220)+chr(220) $xdn2=chr(223)+chr(223)+chr(220)

dim $d[8] $i=0 do $d[$i]=0 $i=$i+1 until $i=8 ; dim arrays for maze
dim $maze[10]

$startR=1 $startC=1 ; setup initial conditions
$endR=5 $endC=10
$face=1 ; 0=up, 1=right, 2=down, 3=left
$width=11
$height=9

; define maze
; you can change this all you like
; 1=wall, 0=space
; ensure the $endR and $endC are on a space
; all R/C vars are zero based
$maze[0]="11111111111"
$maze[1]="10000010001"
$maze[2]="11111010101"
$maze[3]="10000000001"
$maze[4]="10101111111"
$maze[5]="10101000100"
$maze[6]="10100010101"
$maze[7]="10011000001"
$maze[8]="11111111111"

$currentR=$startR ; starting point
$currentC=$startC

;$kixlib=olecreateobject("kixlib32.library") ; this library had a 'hide cursor' routine
;if $kixlib<>0 $=olecallfunc($kixlib,"SetConsoleCursorVisible","s","0") endif

cls ; clear screen and draw bounding box
box(0, 0, 20, 56, single)
:start
do
gosub calculate ; calculate walls
gosub draw ; draw walls 1, 1, 19, 55
if $kixlib=0 at(0, 0) endif get $ans ; move cursor out if the way if visible
select
case $ans="h" ; forward (Up arrow)
if $d[4]<>3
select ; determine the movement based on direction faced
case $face=0 $currentR=$currentR-1 ; North/up - reduce Row var
case $face=1 $currentC=$currentC+1 ; East/right - inc Column
case $face=2 $currentR=$currentR+1 ; South/down
case $face=3 $currentC=$currentC-1 ; West/left
case 1
endSelect
endif
case $ans="p" ; backward (Down arrow)
select
case $face=0 if substr($maze[$currentR+1], $currentC+1, 1)=0 $currentR=$currentR+1 endif
case $face=1 if substr($maze[$currentR], $currentC+0, 1)=0 $currentC=$currentC-1 endif
case $face=2 if substr($maze[$currentR-1], $currentC+1, 1)=0 $currentR=$currentR-1 endif
case $face=3 if substr($maze[$currentR], $currentC+2, 1)=0 $currentC=$currentC+1 endif
endSelect
case $ans="k" ; turn left (Left arrow)
$face=$face-1
if $face=-1 $face=3 endif
case $ans="m" ; turn right (Right arrow)
$face=$face+1
if $face=4 $face=0 endif
case 1
endSelect
if $currentC<0 $currentC=0 endif ; constrain to array bounds
if $currentR<0 $currentR=0 endif
if $currentC>$width-1 $currentC=$width-1 endif
if $currentR>$height-1 $currentC=$height-1 endif
until $ans="q" ; press Q to quit

at(22,0) color w+/n ; goodbye
"Goodbye!" ?
;if $kixlib<>0 $=olecallfunc($kixlib,"SetConsoleCursorVisible","s","1") endif ; Cursor visible again
quit ; we outta here


:calculate ; calculate visible walls from location and orientation
if $currentR=$endR and $currentC=$endC ; you reached the 'end' point
at(22,0) color w+/n
"You did it!" ?
if $kixlib<>0 $=olecallfunc($kixlib,"SetConsoleCursorVisible","s","1") endif ; Cursor on
quit
endif
select
case $face=0 ; north/up
$oneR=$currentR-0 $sevenR=$currentR-0
$oneC=$currentC-1 $sevenC=$currentC+1
$twoR=$currentR-1 $sixR=$currentR-1
$twoC=$currentC-1 $sixC=$currentC+1
$threeR=$currentR-2 $fiveR=$currentR-2
$threeC=$currentC-1 $fiveC=$currentC+1
if substr($maze[$currentR-1], $currentC+1, 1)=1 $d[4]=3
else if substr($maze[$currentR-2], $currentC+1, 1)=1 $d[4]=2
else if substr($maze[$currentR-3], $currentC+1, 1)=1 $d[4]=1
else $d[4]=0
endif
endif
endif
case $face=1 ; east/right
$oneR=$currentR-1 $sevenR=$currentR+1
$oneC=$currentC+0 $sevenC=$currentC+0
$twoR=$currentR-1 $sixR=$currentR+1
$twoC=$currentC+1 $sixC=$currentC+1
$threeR=$currentR-1 $fiveR=$currentR+1
$threeC=$currentC+2 $fiveC=$currentC+2
if substr($maze[$currentR], $currentC+2, 1)=1 $d[4]=3
else if substr($maze[$currentR], $currentC+3, 1)=1 $d[4]=2
else if substr($maze[$currentR], $currentC+4, 1)=1 $d[4]=1
else $d[4]=0
endif
endif
endif
case $face=2 ; south/down
$oneR=$currentR+0 $sevenR=$currentR+0
$oneC=$currentC+1 $sevenC=$currentC-1
$twoR=$currentR+1 $sixR=$currentR+1
$twoC=$currentC+1 $sixC=$currentC-1
$threeR=$currentR+2 $fiveR=$currentR+2
$threeC=$currentC+1 $fiveC=$currentC-1
if substr($maze[$currentR+1], $currentC+1, 1)=1 $d[4]=3
else if substr($maze[$currentR+2], $currentC+1, 1)=1 $d[4]=2
else if substr($maze[$currentR+3], $currentC+1, 1)=1 $d[4]=1
else $d[4]=0
endif
endif
endif
case $face=3 ; west/left
$oneR=$currentR+1 $sevenR=$currentR-1
$oneC=$currentC-0 $sevenC=$currentC-0
$twoR=$currentR+1 $sixR=$currentR-1
$twoC=$currentC-1 $sixC=$currentC-1
$threeR=$currentR+1 $fiveR=$currentR-1
$threeC=$currentC-2 $fiveC=$currentC-2
if substr($maze[$currentR], $currentC-0, 1)=1 $d[4]=3
else if substr($maze[$currentR], $currentC-1, 1)=1 $d[4]=2
else if substr($maze[$currentR], $currentC-2, 1)=1 $d[4]=1
else $d[4]=0
endif
endif
endif
case 1
endSelect


; this walls up holes in the map
if $oneR>-1 and $oneR<$height-1 and $oneC>-1 and $oneC<$width-1
$d[1]=substr($maze[$oneR], $oneC+1, 1)
else
$d[1]=1
endif
if $twoR>-1 and $twoR<$height-1 and $twoC>-1 and $twoC<$width-1
$d[2]=substr($maze[$twoR], $twoC+1, 1)
else
$d[2]=1
endif
if $threeR>-1 and $threeR<$height-1 and $threeC>-1 and $threeC<$width-1
$d[3]=substr($maze[$threeR], $threeC+1, 1)
else
$d[3]=1
endif
if $fiveR>-1 and $fiveR<$height-1 and $fiveC>-1 and $fiveC<$width-1
$d[5]=substr($maze[$fiveR], $fiveC+1, 1)
else
$d[5]=1
endif
if $sixR>-1 and $sixR<$height-1 and $sixC>-1 and $sixC<$width-1
$d[6]=substr($maze[$sixR], $sixC+1, 1)
else
$d[6]=1
endif
if $sevenR>-1 and $sevenR<$height-1 and $sevenC>-1 and $sevenC<$width-1
$d[7]=substr($maze[$sevenR], $sevenC+1, 1)
else
$d[7]=1
endif

return


:draw ; render calulated walls to screen
; 1
if $d[1]=0
; remove 1<>0
at(2, 2) " " at(3, 5) " " at(4, 8) " " at(18, 2) " " at(17, 5) " " at(16, 8) " "
; draw 1=0
color w+/n
at(5, 1) $up3$up3$up3 at(15, 1) $dn3$dn3$dn3
$i=5 do at($i, 10) $x $i=$i+1 until $i=16
else
; remove 1=0
at(5, 1) " " at(15, 1) " "
; draw 1<>0
color w+/n
at(2, 2) $xdn1 at(3, 5) $xdn2 at(4, 8) $xdn1 at(18, 2) $xup1 at(17, 5) $xup2 at(16, 8) $xup1
$i=5 do at($i, 10) if $d[2]=0 $x else " " endif $i=$i+1 until $i=16
endif
; 7
if $d[7]=0
; remove 7<>0
at(2, 52) " " at(3, 49) " " at(4, 46) " " at(18, 52) " " at(17, 49) " " at(16, 46) " "
; draw 7=0
color w+/n
at(5, 46) $up3$up3$up3 at(15, 46) $dn3$dn3$dn3
$i=5 do at($i, 46) $x $i=$i+1 until $i=16
else
; remove 7=0
at(5, 46) " " at(15, 46) " "
; draw 7<>0
color w+/n
at(2, 52) $xup1 at(3, 49) $xup2 at(4, 46) $xup1 at(18, 52) $xdn1 at(17, 49) $xdn2 at(16, 46) $xdn1
$i=5 do at($i, 46) if $d[6]=0 $x else " " endif $i=$i+1 until $i=16
endif
;2
if $d[4]<>3
if $d[2]=0
; remove 2<>0
at(5, 11) " " at(6, 14) " " at(7, 17) " " at(15, 11) " " at(14, 14) " " at(13, 17) " "
; draw 2=0
color w/n
at(8, 11) $up3$up3$up3 at(12, 11) $dn3$dn3$dn3
$i=8 do at($i, 19) $x $i=$i+1 until $i=13
else
; remove 2=0
at(8, 11) " " at(12, 11) " "
; draw 2<>0
color w/n
at(5, 11) $xdn1 at(6, 14) $xdn2 at(7, 17) $xdn1 at(15, 11) $xup1 at(14, 14) $xup2 at(13, 17) $xup1
$i=8 do at($i, 19) if $d[3]=0 $x else " " endif $i=$i+1 until $i=13
endif
;6
if $d[6]=0
; remove 6<>0
at(5, 43) " " at(6, 40) " " at(7, 37) " " at(15, 43) " " at(14, 40) " " at(13, 37) " "
; draw 6=0
color w/n
at(8, 37) $up3$up3$up3 at(12, 37) $dn3$dn3$dn3
$i=8 do at($i, 37) $x $i=$i+1 until $i=13
else
; remove 6=0
at(8, 37) " " at(12, 37) " "
; draw 6<>0
color w/n
at(5, 43) $xup2 at(6, 40) $xup1 at(7, 37) $xup2 at(15, 43) $xdn2 at(14, 40) $xdn1 at(13, 37) $xdn2
$i=8 do at($i, 37) if $d[5]=0 $x else " " endif $i=$i+1 until $i=13
endif
endif
if $d[4]=1 or $d[4]=0
;3
if $d[3]=0
; remove 3<>0
at(8, 20) " " at(9, 23) " " at(12, 20) " " at(11, 23) " "
; draw 3=0
color n+/n
at(9, 20) $up3$up3 at(11, 20) $dn3$dn3
at(9, 25) $x at(10, 25) $x at(11, 25) $x
else
; remove 3=0
at(9, 20) " " at(11, 20) " "
; draw 3<>0
color n+/n
at(8, 20) $xdn1 at(9, 23) $xdn2 at(12, 20) $xup1 at(11, 23) $xup2
at(9, 25) $dn at(10, 25) $x at(11, 25) $up
endif
;5
if $d[5]=0
; remove 5<>0
at(8, 34) " " at(9, 31) " " at(12, 34) " " at(11, 31) " "
; draw 5=0
color n+/n
at(9, 31) $up3$up3 at(11, 31) $dn3$dn3
at(9, 31) $x at(10, 31) $x at(11, 31) $x
else
; remove 5=0
at(9, 31) " " at(11, 31) " "
; draw 5<>0
color n+/n
at(8, 34) $xup2 at(9, 31) $xup1 at(12, 34) $xdn2 at(11, 31) $xdn1
at(9, 31) $dn at(10, 31) $x at(11, 31) $up
endif
endif
;4
select
case $d[4]=0
; remove 4=1
at(9, 26) " " at(11, 26) " "
; remove 4=2 horizontal
at(8, 23) " "
at(12, 23) " "
; remove 4=3 horizontal
at(5, 14) " "
at(15, 14) " "
case $d[4]=1
; remove 4=2 horizontal
at(8, 23) " "
at(12, 23) " "
; remove 4=3 horizontal
at(5, 14) " "
at(15, 14) " "
; draw 4=1
color n+/n
; at(9, 25) $x at(11, 25) $x at(9, 31) $x