-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+ X`09`09 'w' : C := C + 1; X`09`09 'k' : C := C - 1; X`09`09 't' : C := C + 1; X`09`09 'n' : C := C + 1; X`09`09 'u' : R := R - 1; X`09`09 'x' : R := R - 1; X`09 end; X`09 0 : ; X`09 -1: X`09 Case Screen`5BR,c`5D of`20 X`09`09 't' : R := R + 1; X`09`09 'n' : C := C - 1;`20 X`09`09 'u' : C := C - 1; X`09`09 'm' : C := C + 1; X`09`09 'v' : C := C - 1; X`09`09 'j' : C := C - 1; X`09`09 'x' : R := R + 1; X`09 end; X`09 end; X -1: X`09 Case Screen`5BR,c`5D of`20 X`09 'w' : R := R + 1; X`09 'k' : R := R + 1; X`09 'n' : R := R + 1; X`09 'u' : R := R + 1; X`09 'v' : C := C + 1; X`09 'j' : R := R - 1; X`09 'q' : C := C + 1; X`09 end; X end; X move_Clock := true; X Prev_R := Save_R; X Prev_C := Save_C; X If Screen`5BR,C`5D = 'a' Then begin `7B reverse `7D X prev_R := R; X prev_C := C; X R := Save_R; X C := Save_C; X end else `20 X If Screen`5BR,c`5D = '*' Then`20 X `09move_Clock := False X Else X IF Screen`5BR,C`5D = ' ' Then`20 X `09 Writeln(' **** INTERNAL ERROR **** MOVE_CLOCK '); Xend; `09 `20 X X XProcedure fill_area; X Xvar Sr,Sc,R,C,Prev_R,Prev_C,area_C,Area_A: Integer; X some_one_there : Boolean; X X procedure Bfill_C(Fr,Fc: Integer); X X Begin X If Cal`5BFr,Fc`5D = ' ' Then Begin X `09Cal`5BFR,FC`5D := 'C'; X BFill_C(FR-1,FC); X `09BFill_C(FR,FC+1); X BFill_C(FR+1,FC); X BFill_C(FR,FC-1); X `09Bfill_C(FR+1,Fc+1); X `09Bfill_C(FR+1,Fc-1); X `09Bfill_C(FR-1,Fc+1); X `09Bfill_C(FR-1,Fc-1); X end else`20 X If Cal`5BFR,FC`5D in `5B'A','*'`5D Then`20 X `09Some_one_there := true; X end; X X procedure Bfill_A(FR,FC: Integer); X X Begin X If Cal`5BFR,FC`5D = ' ' Then Begin X `09Cal`5BFR,FC`5D := 'A'; X BFill_A(FR-1,FC); X `09BFill_A(FR,FC+1); X BFill_A(FR+1,FC); X BFill_A(FR,FC-1); X X BFill_A(FR+1,FC+1); X `09BFill_A(FR+1,FC-1); X BFill_A(FR-1,FC+1); X BFill_A(FR-1,FC-1); X end else`20 X If Cal`5BFR,FC`5D in `5B'C','*'`5D Then`20 X `09Some_one_there := true; X end; X X Procedure Display_Fill( Ch : Char ); X X var S,R,C : Integer; X H : Char; X X begin X H := Chr( Ord('a') + Ord(Head_sym`5Bplay`5D) - Ord('1') ); X R := 1 ; X S := 0 ;`20 X Write_5(Esc,'<',Esc,'`5B','7'); X write_5('m',Esc,'`5B','?','2'); X Write_3('l',Esc,'F'); X While R <= Screen_Dim_R do begin X `09C := 1; X `09While ( C < Screen_Dim_C ) do begin X `09 While ( C < screen_Dim_C ) and ( Cal`5BR,C`5D<>ch ) do`20 X `09 C := C + 1; X `09 If Cal`5BR,C`5D = Ch then `20 X`09 Write_4(Esc,'Y',Chr(31+R),Chr(31+C)); X `09 While ( C < screen_Dim_C) and ( Cal`5BR,C`5D = ch ) do begin X `09 write_1(H); X `09 Screen`5BR,C`5D := '*'; X `09 S := S + 1; X `09 C := C + 1; X `09 end; X end; X `09r := R + 1; X end; `09 `20 X Score`5Bplay`5D := S + Score`5Bplay`5D; X Area_Filled := Area_Filled + S; X Write_5(Esc,'<',Esc,'`5B','0'); X write_5('m',Esc,'`5B','?','2'); X Write_3('l',Esc,'F'); X Cursor_R := 9999; X end; X X `20 XBegin X `7B First Move Around Clock, to check no one on walls for building from wa Vlls`7D X Cal := Screen; `7B Uses A Lot Of Processing `7D X R := Pos_R; X C := Pos_C; X Prev_R := pos_R - Dir_R; X prev_C := Pos_C - Dir_C; X Area_C := 0; X Some_one_there := False; X repeat`20 X Some_one_there := Not move_Clock(R,C,Prev_r,Prev_C); X Until (Some_one_There or (( R = Pos_R ) and ( C = pos_C ))) ; X If not Some_one_there Then Begin X R := Pos_R; X C := Pos_C; X Prev_R := pos_R - Dir_R; X prev_C := Pos_C - Dir_C; X repeat X If move_Clock(R,C,Prev_r,Prev_C) Then begin X If Screen`5BR,C`5D In `5B'q','x'`5D Then begin X Sr := R + ( C - Prev_C ); X Sc := C - ( R - Prev_R ); X Bfill_C(Sr,Sc) X end; X end Else X Some_one_there := true; X Until (Some_one_There or (( R = Pos_R ) and ( C = pos_C ))) ; X end; X If Not Some_one_There Then`20 X Display_Fill('C'); X R := Pos_R; X C := Pos_C; X Prev_R := pos_R - Dir_R; X Prev_C := Pos_C - Dir_C; X repeat`20 X Some_one_there := Not move_Anti_Clock(R,C,Prev_r,Prev_C)`20 X until ( Some_one_There or (( R = Pos_R ) and ( C = pos_C ))) ; X If not some_one_there Then begin X R := Pos_R; X C := Pos_C; X Prev_R := pos_R - Dir_R; X prev_C := Pos_C - Dir_C; X Some_one_there := False; X repeat X If move_Anti_Clock(R,C,Prev_r,Prev_C) Then begin X`09If Screen`5BR,C`5D In `5B'q','x'`5D Then begin X`09 Sr := R - ( C - Prev_C ); X`09 Sc := C + ( R - Prev_R ); X`09 Bfill_A(Sr,Sc) X`09end; X end Else X Some_one_there := true; X until ( Some_one_There or (( R = Pos_R ) and ( C = pos_C ))) ; X end; X If Not Some_one_there Then`20 X Display_Fill('A'); Xend; X XFunction Valid_move : Boolean; X XBegin`20 X Valid_move := False; X Case (Dir_R+1) + (Dir_C+1)*4 Of`20 X 9 : `7B Right `7D X `09 If Ch_on`5BPlay`5D in `5B'l','w','t','n','m','v','q'`5D Then`20 X `09 Valid_move := True; X X 6 : `7B Down `7D X `09 If Ch_on`5BPlay`5D in `5B'l','w','k','t','n','u','x'`5D Then`20 X `09 Valid_move := True; X X 4 : `7B Up `7D X `09 If Ch_on`5BPlay`5D in `5B't','n','u','m','v','j','x'`5D Then X `09 Valid_move := True; X X 1 : `7B Left `7D X `09 If Ch_on`5BPlay`5D in `5B'w','k','n','u','v','j','q'`5D Then`20 X `09 Valid_move := True; X X end `7B Case `7D; Xend; X Xbegin X If Not Quit`5BPlay`5D And (Ord(Responce`5BPLay`5D) = 0 ) Then begin X Quit`5BPLay`5D := True; `7BInitalise all Variables `7D X Game`5BPlay`5D := 0; X Score`5BPlay`5D := 0; X Games_Won`5BPLay`5D := 0; X Score_Set(Play,Score`5BPlay`5D,Game`5BPLay`5D,Games_Won`5BPLay`5D); X end else`20 X If Not Quit`5BPlay`5D Then Begin X Dir_R := Move_R`5BPlay`5D; X Dir_C := Move_C`5BPLay`5D; X`09 pos_R := Head_R`5BPlay`5D; X pos_C := Head_C`5BPlay`5D; X `7B Change Direction Of The Position You Move To is Not A Wall ie = V '.' `7D X `09 IF ( Ord(responce`5Bplay`5D) > 128 ) Then`20 X `09 Can_create`5Bplay`5D := true; X`09 Responce`5Bplay`5D := Chr(Ord(Responce`5Bplay`5D) mod 16 ); X Case Ord(responce`5BPlay`5D) Of`20 X 8 : Begin X Dir_R := -1 ; X Dir_C := 0 ; `7B Moving Up `7D X end; X 2 : Begin X Dir_R := 1; X Dir_C := 0; `7B Moving Down `7D X end; X 4 : Begin X Dir_R := 0; `7B Moving Left `7D X Dir_C := -1; X end; X 6 : Begin X Dir_R := 0; `7B Moving Right `7D X Dir_C := 1; X end; X otherwise `7B Do Nothing Same Dir As Before `7D X end `7B Case `7D; X `09 If (( pos_r + dir_r ) > 0 ) and`20 X `09 (( pos_r + dir_r ) <= Screen_Dim_R ) and`20 X `09 (( pos_c + dir_c ) > 0 ) and`20 X `09 (( pos_c + dir_c ) <= Screen_Dim_C ) Then`20 X`09 If Creating`5Bplay`5D Then begin X If ( Dir_R = -1*Move_R`5Bplay`5D) and ( Dir_C = -1*Move_C`5Bp Vlay`5D) Then Begin X Dir_R := Move_R`5BPlay`5D; `7B Can't Reverse Your Direct Vion `7D X Dir_C := Move_C`5BPlay`5D; X end; X`09 If Screen`5Bpos_r + Dir_r, Pos_c + Dir_C`5D = ' ' THen Begin X `09`09 Area_Filled := Area_Filled + 1; X `09`09 New_Tail_Char; X`09 `09 At(pos_r,Pos_C,Screen`5BPos_r,Pos_C`5D); X pos_r := Pos_R + Dir_R; Pos_C := Pos_C + Dir_C; X`09 `09 at(pos_R,pos_C,Head_sym`5Bplay`5D); X`09 end else begin `7B v Must Be a Wall `7D X`09 `09 If not ( Screen`5Bpos_r + Dir_r, Pos_c + Dir_C`5D = '*') Then be Vgin X `09`09 new_tail_Char; X`09 `09 At(pos_r,Pos_C,Screen`5BPos_r,Pos_C`5D); X `09`09 write_1(Chr(7)); X pos_r := Pos_R + Dir_R; Pos_C := Pos_C + Dir_C; X `09`09 New_Join_Char(True); `7B Going into the wall `7D X`09`09 If ( Screen`5BPos_r,POs_C`5D = ' ') then`20 X`09`09`09 Writeln('ERROR NEW JOIN CHAR IS BLANK '); X`09 `09 Creating`5Bplay`5D := False; X`09 `09 Can_create`5Bplay`5D := False; X`09 `09 at(pos_R,pos_C,Head_sym`5Bplay`5D); X`09`09 Fill_area; X`09`09 end`20 X`09 end;`09`09 `09`09`20 X`09 End Else `7B Not Creating `7D X`09 If Not Valid_Move Then`20 X`09`09 If ( Screen`5Bpos_r + Dir_r, Pos_c + Dir_C`5D = ' ' ) Then`20 X`09`09 If Can_Create`5Bplay`5D Then Begin X`09`09`09Creating`5Bplay`5D := true; X`09`09`09Screen`5BPos_R,Pos_C`5D := Ch_on`5Bplay`5D; `7B For New_join_Char ` V7D X`09`09`09New_join_Char(false); `7B Going Out Form Wall `7D X`09`09`09At(pos_r,Pos_C,Screen`5BPos_r,Pos_C`5D); X`09`09`09Pos_r := Pos_R + Dir_R; Pos_C := Pos_C + Dir_C; X`09 `09`09At(pos_R,pos_C,Head_sym`5Bplay`5D); X`09`09 end else`20 X `09`09 else`20 X `09 else begin X`09`09 If ( Screen`5Bpos_r + Dir_r, Pos_c + Dir_C`5D <> '*' ) Then Begin X`09`09 Screen`5BPos_r,Pos_C`5D := Ch_on`5Bplay`5D; X`09`09 At(pos_r,Pos_C,Screen`5BPos_r,Pos_C`5D); X`09`09 pos_r := Pos_R + Dir_R; Pos_C := Pos_C + Dir_C; X`09`09 At(pos_R,pos_C,Head_sym`5Bplay`5D); X `09`09 end`20 X`09 end X `09 `7Bend`7D; X `09 If Not (( Pos_R = Head_R`5Bplay`5D ) and ( Pos_C = Head_C`5Bplay`5D)) V Then Begin X Move_R`5BPlay`5D := Dir_r; X Move_C`5BPLay`5D := Dir_c; X`09 Head_R`5BPlay`5D := pos_r; X Head_C`5BPlay`5D := pos_c; X `09 Ch_on`5Bplay`5D := Screen`5Bpos_r,Pos_C`5D; X `09end; X `09Screen`5BPos_r,Pos_C`5D := '*'; X end; Xend;`09`09 `20 X`09`09 `20 X X begin X If ( Game`5BYou`5D Mod 2 ) = 1 Then Begin `7B If 1 Then Loop Clockwi Vse `7D X For Play := 1 to Max_Player_number do`20 X add_This_Players_head; X end else`20 X Begin X For Play := Max_Player_Number downto 1 do`20 X add_This_Players_head; `7B Go Clockwise In Updatin Vg `7D X end; X If Area_Filled > Area_75_per Then begin X For Play := 1 to max_player_number do begin X `09game`5Bplay`5D := game`5Bplay`5D + 1; X Score_Set(Play,Score`5BPlay`5D,Game`5BPLay`5D,Games_Won`5BPLay`5D); X end; X Add_head := 0 X end else X Add_Head := 1; `7B 1 To Continue `7D X at(24,80,chr(0)); X Break_Buff; `7B does not write the buffer just says To`20 X Write this buffer to all the players when add_head exits V `7D Xend `7B add_Head`7D; X X XProcedure Snake_PLay;extern; X X XBegin `7B Mainline `7D X LineLimit(Output,MaxInt); X Initalise_Mainline; X While True Do Begin X Initalise_Positions; `7B initalises Pos Only relavent for master V snake `7D X Snake_Play; `7B Calls Add_head with the Moves of the pla Vyers until add_head returns 1 ( end of game ) `7D X Draw_Scores; X Snake_Game_End; `7B Syncs all players Together `7D X end; X9999 :`20 X Writeln(esc,'<'); Xend. X $ CALL UNPACK MQIX.PAS;1 1594095908 $ create 'f' X`09`09`09SUBROUTINE`09Help_Screen XC X`09PARAMETER ESC = 27 X`09CHARACTER Line*256 X`09BYTE LINEL(256) X`09EQUIVALENCE (LINE, LINEL) X BYte REP X`09INTEGER Len_Line,ErrNum XC X type 111, esc X111 Format(X,A1,'<') X1`09OPEN( UNIT=4, FILE='Games:MQixH.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`09Call Snake_write(%ref(LIne(:len_line)),Len_line) X GOTO 100 X200`09close (unit = 4) X999`09RETURN XC X50`09write(Line,51),Esc,Esc X51 FORMAT(X,A1,'`5B2J',A1,'`5B1;1HPlease wait...') X Call Snake_Write(%ref(Line(1:25)),25) X`09Call Sleep(4) X Goto 1 X END $ CALL UNPACK MQIXH.FOR;1 457915174 $ create 'f' X`1B`5BH`1B`5BJ`1B(B`1B`5B0m X`1B`5B1;1H`1B(0lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Vqqqqqqqqqqqqqqqqqqk X`1B`5B2;1Hx lk lk lqqk qwq qk lq `1B`5B2;80Hx`1B`5 VB3;1Hx xmwjx lj x x mwj X`1B`5B3;27H `1B`5B3;66H x`1B`5B4;1 VHx x x x x kx x lvk `20 X`1B`5B4;32H `1B`5B4;80Hx`1B`5B5;1Hx x x mqqvvk qvq qj m Vq `1B`5B5;80Hx X`1B`5B6;1Hx`1B`5B6;16Hm `1B`5B6;80Hx`1B`5B7;1Hx`1B`5B7; V80Hx`1B`5B8;1Hx Y`1B(Bou are the qix.`1B`5B8;47H X`1B`5B8;47HMovement :`1B`5B8;80H`1B(0x`1B`5B9;1Hx`1B`5B9;80Hx`1B`5B10;1Hx V F`1B(Bence off as much of the screen`1B`5B10;47H X`1B`5B10;47H8 - Up`1B`5B10;63H6 - Right `1B(0x`1B`5B11;1Hx V `1B`5B11;47H `20 X`1B`5B11;50H `1B`5B11;63H x`1B`5B12;1Hx `1B(Bas possib Vle before some one else`1B`5B12;47H2 - D X`1B`5B12;53Hown 4 - Left`1B`5B12;80H`1B(0x`1B`5B13;1Hx V `1B`5B13;47H `20 X`1B`5B13;56H `1B`5B13;80Hx`1B`5B14;1Hx `1B`5B14;47H`1B(B< S Vpace Bar > - Draw Fence `1B(0x X`1B`5B15;1Hx `1B`5B15;47H x`1B`5B16; V1Hx A`1B(Breas only score if no o X`1B`5B16;30Hne else`1B`5B16;80H`1B(0x`1B`5B17;1Hx V `1B`5B17;80Hx X`1B`5B18;1Hx `1B(Bis inside.`1B`5B18;80H`1B(0x`1B`5B19;1Hx`1B`5B19;80Hx`1 VB`5B20;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq X`1B`5B20;37Hqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj`1B`5B21;1Hlqqqqqqqq Vqqqq M`1B(Bessages `1B(0qqqqqqqqqqq X`1B`5B21;35Hqqqqk lqqqqqqqqqqqq N`1B(Bame `1B(0qqqqqqqqqqqqqqqqqqk`1B`5B22 V;1Hx `1B`5B22;39Hx x `1B(B*`1B(0`7E`1B`5B22;70H X`1B`5B22;70H`7E`1B(B* `1B(0x`1B`5B23;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Vqqqqqqqqj mqqqqqqqqqqqqqqqqqqqqqqqq`1B`5B1;1H X`1B`5B23;68Hqqqqqqqqqqqqj`1B`5B1;1H X X X X`1B`5B6;17H`7Eqq`60 X`1B`5B6;20Hqq`60 X`1B`5B6;22Hqq`60 X`1B`5B6;24Hqq`60 X`1B`5B6;26Hqq`60 X`1B`5B6;28Hqq`60 X`1B`5B4;30H`60`1B`5B5;30Hx`1B`5B6;30Hj +-+-+-+-+-+-+-+- END OF PART 3 +-+-+-+-+-+-+-+-