-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+ X`09clrb`09master_flag`09`09; say no master snake X`09$setef_s efn=#flag$v_read+64`09; wake everybody up X`09$setef_s efn=#flag$v_update+64 X`09$setef_s efn=#flag$v_endofgame+64 X`09$setef_s efn=#flag$v_synch+64 X`09$setef_s efn=#flag$v_game+64`09; for people waiting for a game X100$: X;`09clear screen and put out of graphics mode X`09callg`09text_end_game, snake_write X`09blbc`09abort, 200$`09`09; game is not being aborted --> 200$ X`09callg`09text_abort, snake_write X200$: X`09$deltva_s inadr=ret_range`09; delete global section X X;`09$dassgn_s chan=snake_fab+fab$l_stv ; deassign channel X X`09ret X X`09 X`09.entry`09- XNAME_SET, `5Em X;+ X;`09CALL NAME_SET( name ) X;`09set this players name X;- X`09mull3`09#name_size, player, r3`09; get our player number (0-7) X`09addl2`09#13, r3`09`09`09; skip username X`09movc3`09#name_size-13, @4(ap), name(r3) ; store name in shared memory X`09ret X X`09.entry`09- XNAME_GET, `5Em X;+ X;`09CALL NAME_GET( name , player # ) X;`09returns the name of specified player (1-8) X;- X`09subl3`09#1, @8(ap), r1`09`09; get player number (0-7) X`09mull2`09#name_size, r1`09`09; offset to this players name X`09movc3`09#name_size, name(r1), @4(ap) ; return players name X`09ret X X`09.entry`09- XSCORE_SET, `5Em<> X;+ X;`09CALL SCORE_SET( player #, score , # games , # wins ) X;- Xplayer_arg = 4 Xscore_arg = 8 Xgames_arg = 12 Xwins_arg = 16 X`09subl3`09#1, @player_arg(ap), r1`09`09; get our player # (0-snake) X`09movl`09@score_arg(ap), score`5Br1`5D`09; store score X`09movl`09@games_arg(ap), n_games`5Br1`5D X`09movl`09@wins_arg(ap), wins`5Br1`5D X`09ret X X`09.entry`09- XSCORE_GET, `5Em<> X;+ X;`09CALL SCORE_GET( player , score , # games , # wins ) X;- X;player_arg = 4 X;score_arg = 8 X;games_arg = 12 X;wins_arg = 16 X`09subl3`09#1, @player_arg(ap), r1`09`09; get player # (0-snake) X`09movl`09score`5Br1`5D, @score_arg(ap)`09; return score X`09movl`09n_games`5Br1`5D, @games_arg(ap)`09; return # of games played X`09movl`09wins`5Br1`5D, @wins_arg(ap)`09`09; return # of wins X`09ret X X`09.entry`09- Xsnake_game_count, `5Em<> X;+ X;`09CALL SNAKE_GAME_COUNT( # games ) X;`09returns # of games played (total) X;- X`09movl`09game_count, @4(ap) X`09ret X X`09.end $ CALL UNPACK SNAKE.MAR;1 235814742 $ create 'f' X`1B`5BH`1B`5BJ`1B(B`1B`5B0m X`1B`5B1;1H`1B(0lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk lqqqqqqqqqqqqq O`1B V(Bbject `1B(0qqqqqqqqqqqqqk X`1B`5B2;1Hx`1B`5B2;39Hx x`1B`5B2;78Hx`1B`5B3;1Hx lqq lk x lqk k x V lqq x x T`1B(Bo Be The La X`1B`5B3;59Hst Snake Alive `1B(0x`1B`5B4;1Hx x xmk x x mk x lj x V x x`1B`5B4;78Hx X`1B`5B5;1Hx mqqqkx mkx xqqu twj tq x mqqqqqqqqqqqqqqqqqqqqqqq Vqqqqqqqqqqqj X`1B`5B6;1Hx xx xx x x xmk x x lqqqqqqqqqqqqq H`1B(Baza Vrds `1B(0qqqqqqqqqqqqk X`1B`5B7;1Hx lqqqjx mj m x x mk mqqqk x x`1B`5B7;78Hx`1B`5B8;1Hx V x x x x `20 X`1B`5B8;33Hx x x H`1B(Bitting Any Object Will Kill You `1B(0x`1B`5B9;1 VHx`1B`5B9;39Hx x`1B`5B9;78Hx X`1B`5B10;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj mqqqqqqqqqqqqqqqqqqqqqq Vqqqqqqqqqqqqj X`1B`5B11;1Hlqqqqqqqqqqq I`1B(Bntroduction `1B(0qqqqqqqqqqqqk lqqqqqqqqqqqq V C`1B(Bontrols `1B(0qqqqqqqqqqqqk X`1B`5B12;1Hx`1B`5B12;39Hx x`1B`5B12;78Hx`1B`5B13;1Hx M`1B(Bulti User Game V For Up To 8 Players `1B(0x x`1B`5B13;58H8 `1B(B- X`1B`5B13;61H Up`1B`5B13;78H`1B(0x`1B`5B14;1Hx`1B`5B14;39Hx x`1B`5B14;78Hx` V1B`5B15;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq X`1B`5B15;39Hj x 4 `1B(B- Left`1B`5B15;66H6 - Right `1B(0x`1B`5B16;1Hl Vqqqqqqqqqqqqq S`1B(Bymbols `1B(0qqqqqqqqqqq X`1B`5B16;35Hqqqqk x`1B`5B16;78Hx`1B`5B17;1Hx`1B`5B17;39Hx x`1B`5B17;58H2 V `1B(B- Down`1B`5B17;78H`1B(0x`1B`5B18;1Hx Y`1B(Bou -`20 X`1B`5B18;11H`1B(0`60 O`1B(Bthers - 1..8 `1B(0x x`1B`5B18;78Hx` V1B`5B19;1Hx`1B`5B19;39Hx x T`1B(Bype "E"`20 X`1B`5B19;60Hto Exit Game `1B(0x`1B`5B20;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqq Vqqqqqqqqqj mqqqqqqqqqqqqqqqqqqq X`1B`5B20;63Hqqqqqqqqqqqqqqqj`1B`5B21;1Hlqqqqqqqqqqqq M`1B(Bessages `1B(0qqqq Vqqqqqqqqqqqk lqqqqqqqqqqqqq N`1B(Ba X`1B`5B21;60Hme `1B(0qqqqqqqqqqqqqqqk`1B`5B22;1Hx`1B`5B22;39Hx x `1B(B* V`1B(0`7E `1B`5B22;70H`7E* x X`1B`5B23;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj mqqqqqqqqqqqqqqqqqqqqqq Vqqqqqqqqqqqqj`1B`5B1;1H X`1B* $ CALL UNPACK SNAKE.SCN;1 185950272 $ create 'f' X`09SUBROUTINE`09HELP_SCREEN XC X`09PARAMETER ESC = 27 X`09CHARACTER Line*256 X BYte REP X`09INTEGER Len_Line,ErrNum XC X`09CALL image_dir() XC X Write(5,111)esc X111 Format(X,A1,'<') X1`09OPEN(UNIT=4,FILE='IMAGE_DIR:SNAKE.SCN',ReadOnly, X`091 STATUS='OLD',IoStat=ErrNum) X If (ERRNUM.EQ.30) Goto 50 X If (ERRNUM.NE.0 ) Goto 999 X100 READ(4,110,END=200) LEN_LINE, LINE(:LEN_LINE) X110 FORMAT(Q,A) X WRITE(5,120) LINE(:LEN_LINE) X120 FORMAT(1X,A) X GOTO 100 X200`09close (unit = 4) X999`09RETURN XC X50`09Write(5,51),Esc,Esc X51 FORMAT(X,A1,'`5B2J',A1,'`5B1;1HPlease wait...') X Call Sleep(4) X Goto 1 XC X END $ CALL UNPACK SNAKEH.FOR;1 1311099332 $ create 'f' X X`7B$S-`7D X`7B$C+`7D X`7B X X XXXXX X X XXXXX X X XXXXXX X X X XX X X X X X X `20 X X X X X X X X X X `20 X XXXXX X X X XXXXXXX XXXX XXXXX`20 X X X X X X X X X X `20 X X X X XX X X X X X `20 X XXXXX X X X X X X XXXXXX X `20 X X`09`09Program`09: Snake X X`09`09Authors`09: Rex Croft - Macro X X Murray Speight - Pascal`20 X X`09`09Place`09: University Of Waikato`20 X X`09`09Date `09: May 1982`20 X X`09Software Is Subject To Change Without Notification X The Author And His Family assume No Rsponsability For X`09Its Reliabliity Or Use.`20 X X `7D X XProgram Snake(Input,Output); X XLabel`099999; `7B For Abortive exit Of Pgm `7D X X XConst `09Max_Num_Players`09= 8; `7B Up To 8 Players `7D X`09Screen_Dim_X `09= 23; `7B PLaying Board 40 * 23 `7D X`09Screen_Dim_Y`09= 40; X`09Len_Of_Buff`09= 1024; `7B Buffer to Write Chars `7D X Max_Name_Length = 32; `7B Lenngth of a players name `7D X XType `09Player_Responce = Packed Array `5B1..Max_Num_Players`5D Of Char; X`09Buffer`09`09= Packed Array `5B1..Len_Of_Buff`5D Of Char;`09 X`09Positions`09= Array `5B1..Max_Num_Players`5D Of INteger; X`09Players_Screen`09= Array `5B1..Screen_Dim_X,1..Screen_Dim_Y`5D Of Char; X`09Died_Type`09= Array `5B1..Max_NUm_Players`5D Of Boolean; X`09Name_Line`09= Packed array `5B1..max_Name_Length`5D of Char; X Name_Table`09= Array `5B1..Max_Num_Players`5D of name_LIne; X XVar `09Responce `09,`09`09`09`7B What Players Have Typed `7D X`09Head_Sym`09: Player_Responce; `7B What Symbol is THe Head `7D X`09Screen`09`09: Players_Screen; `7B 23 * 40 Array For Screen`7D X`09Name`09`09: Name_Table; `7B Names Of Each Player `7D X Init_Pos_X`09, `7B Where initaially Players St Vart `7D X Init_pos_Y , `7B "" "" For Y Coord `7D X`09Score`09`09, `7B Score Of Each PLayer `7D X Game`09`09, `7B Num Games Each PLayer Played ` V7D X`09Games_Won `09, `7B Games Won By Each PLayer `7D X`09Move_X`09`09, `7B What Dir Each Playe Is Moving X C Voord `7D X`09Move_Y`09`09, `7B "" "" Y Coord `7D X`09Head_X`09`09, `7B Where The Head Is For Each Player V X Coord `7D X`09Head_Y`09 `09, `7B "" "" Y Coord `7D X`09Tail_X`09`09, `7B Where The Tail Is For Each Player V X Coord `7D X`09Tail_Y`09`09: Positions; `7B "" "" Y Cord `7D X`09TT_Buff`09`09: Buffer; `7B Lenght Of Buffer To Hold Screen V Output `7D X`09TT_Len`09`09, `7B String To Hold Screen Output `7D X Who_Is_PLaying , `7B Word With Bits Set As To V Who is Playing `7D X`09You`09`09, `7B Which Number You are `7D`20 X`09Dummy `09`09, `7B Dummy argument `7D X`09Num_players , `7B How Many people are Playing ` V7D X`09Max_Player_Number , `7B The Highest PLayers Number wh Vo is Playing `7D X Num_Moved_Last_Round , `7B Number of players who mo Vved last Round ( Last Screen Update ) `7D X`09Players_Removing`09: Integer; `7B Are We Removing Odd 1 or even 2 pl Vayers Tails `7D X`09Quit`09`09, `7B Has The PLayer Quit (not playing ) V or is He Playing `7D X`09Died `09`09: Died_Type; `7B Has The PLayer Died ( Died If He h Vas Quit ) `7D X`09Esc`09`09: Char; `7B esc For escape sequences `7D X`09Seed`09`09: Real; `7B Seed for random number generaotor ` V7D X X XProcedure Break_Buff; X X Procedure Snake_Screen( Var Line : Buffer ; Var Lenght : Integer );extern V;`20 X X`7B Only Call This Once From The Add_head Function`20 X X Does not write array to screen `7D X XBegin X Snake_Screen(TT_Buff,TT_Len);`20 X TT_Len := 0; Xend; X X XProcedure Help_Screen;extern; X XProcedure Pos( X,Y : Integer ; Ch : Char ); X X`7B Write Char at Pos X,Y in Buffer `7D X XBegin X TT_Buff`5BTT_Len+1`5D := Esc; X TT_Buff`5BTT_Len+2`5D := 'Y'; X TT_Buff`5BTT_Len+3`5D := Chr(31+X); X TT_Buff`5BTT_Len+4`5D := Chr(31+Y); X TT_Buff`5BTT_Len+5`5D := Ch; X TT_Len := TT_Len + 5; Xend; X XFunction at(X,Y: Integer):Char; X X`7B Posotion Cursor at X , Y this Is For Use In Write Statments `7D X XBegin X Write(esc,'Y',chr(31+X),Chr(31+Y)); X at := Chr(0); Xend; X X XFunction Snake_Init(Var You : INteger ; Var Game_going : Integer):Integer;e Vxtern; X XProcedure Name_Set(Var Name : Name_Line );extern; X XProcedure Name_Get( VAR Name : Name_Line ; Play : Integer );extern; X XProcedure Score_Set( Player : INTEGER; VAR Score,Games_PLayed,wins : INteger V); X`09`09`09`09`09`09`09extern; XProcedure Score_Get( Player : INTEGER; VAR Score,Games_Played,wins : Integer V ); X`09`09`09`09`09`09`09extern; XProcedure Snake_Start( Var Whos_PLaying : Integer ; var Rand : Positions );E Vxtern; X XProcedure Snake_Read(Var Directions : Player_Responce );Extern; X XProcedure Snake_Game_End;extern; X XProcedure Snake_Wait;Extern; X XProcedure Snake_Game_count( Var Num : Integer);extern; X XProcedure Snake_Dead(Var PLayer : Integer );extern; X XProcedure Sleep( Num_Sec : Integer);extern; X XProcedure Draw_Scores; X XVar I,num_on_table,play,max_score,Top_play,Total_Num_Games,This_score: Integ Ver; X X XBegin X Num_on_Table := 0; X Writeln(esc,'H',Esc,'J',Esc,'G',esc,'<'); X Writeln(' Player User Name Score Game Won Gra Vph'); X writeln(' ------ ---- ---- ----- ---- --- --- V--'); X writeln; X Max_score := -99999; X X `7B Find The Top Player goes By The his Score And Num Of Games Played `7 VD X For PLay := 1 to Max_Num_PLayers do begin X Score_get(Play,Score`5BPLay`5D,Game`5BPLay`5D,Games_won`5Bplay`5D); X If Game`5BPlay`5D > 0 Then Begin X This_score := Round(Score`5Bplay`5D / (Game`5Bplay`5D)**(0.8)); X If This_score > Max_score Then Begin X Top_Play := Play; X Max_score := This_score + 1; X end; X end; X end; X For Play := 1 to Max_Num_PLayers do Begin X If Game`5BPLay`5D > 0 Then Begin `7B IF Games PLayed > 0 Then You A Vre PLaying `7D X Num_On_Table := Num_On_Table + 1; X If PLay = Top_PLay Then`20 X Write(esc,'`5B1m'); `7B High intensity Flash `7D X Write(Play:4); X Write(' ',Name`5BPlay`5D:32); X write(Score`5BPLay`5D:7); `7B Print Info `7D X Write(Game`5BPlay`5D:6); X Write(Games_won`5Bplay`5D:5); X Write(' ',Esc,'`5B7m'); `7B Rev Video `7D X If PLay = Top_PLay Then `20 X Write(' *** Champ *** ') X `09 Else X For I := 1 to Round(Score`5Bplay`5D*15 / ((Game`5Bplay`5D)**(0.8 V)*max_score)) do`20 X Write(' '); X Writeln(esc,'`5B0m'); `7B Normal Video `7D X end; X End; X writeln; X X`7B Print The Games You Have Played With The Totak Num of Games Played so Fa Vr `7D X Snake_Game_Count( Total_Num_games ); X Writeln(' Game # ',Game`5BYou`5D:1,'`09Total # ',Total_Num_Games:1); X writeln; X writeln; X If Num_on_Table <= 1 Then`20 X Goto 9999; X writeln(' Please Wait For Next Game ..... '); X writeln(esc,'`5B?2l',esc,'F'); Xend; X XProcedure Draw_screen; X XVar play,I,X,Y,Line_at : Integer; X X Function Min(A,B:Integer):Integer; X X Begin X If A < B Then`20 X Min := A`20 X Else X Min := B X end; X XBegin `7B Draw Screen `7D X Write(at(1,1),esc,'J',esc,'<',esc,'(0',esc,'<',esc,'(0'); `7B Clear H Vome `7D X Write(esc,'#6l'); X For Y := 1 To (Screen_Dim_Y-2) Do`20 X Write('q'); X Writeln('k'); X For X := 2 To ( Screen_dim_X - 1 ) Do begin X Write(esc,'#6x'); X For Y := 1 to (Screen_Dim_Y-1) do`20 X Write('`7E'); X Writeln('x'); X end; X write(esc,'#6m'); X For Y := 1 to (Screen_Dim_Y-1) Do`20 X Write('q'); X Writeln('j'); X X`7B Show Who You Are At Thje Bottom Of The Screen `7D X Writeln(`7BEsc,'`5B24;1H',Esc,'#6',Esc,'(BYou # ',You:1,`7D X`09 esc,'`5B?2l',esc,'F',at(1,1)); `20 Xend; X X `20 XProcedure initalise_Positions; X X X XVar Mult,Play,X,Y : Integer; X X Rand`09 : Positions; X XBegin X XPlayers_Removing := -1; `7B On First Few Moves Don't remove Tail `7D X XSnake_Start(Who_Is_Playing,Rand); X X X`7B Randomly Position The Starting Pos Of The PLayers `7D XFor play := 1 to Max_num_players do Begin X Head_X`5BPlay`5D := Init_Pos_X`5BRand`5BPlay`5D`5D; X Head_Y`5Bplay`5D := Init_Pos_Y`5BRand`5BPLay`5D`5D; X Move_X`5Bplay`5D := 1; X MOve_Y`5BPlay`5D := 0; Xend; XTail_X := Head_X; XTail_Y := Head_Y; X +-+-+-+-+-+-+-+- END OF PART 3 +-+-+-+-+-+-+-+-