-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ X Max_score := This_score + 1.0; 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 Name_Get(Name`5BPlay`5D,Play); X Write(Play:4); X Write(' ',Name`5BPlay`5D:32); X write(Score`5BPLay`5D:7); `7B Print Info `7D X Writeln(Game`5BPlay`5D:6); X End; X End; X writeln;`20 X Writeln(' Player Score Indicator '); X Writeln; 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 Write(Play:4); X Write(' ',Esc,'F'); `7B Graphics `7D X Score_Ratio := (Score`5Bplay`5D+Games_won`5BPLay`5D*10)*Len_Scale X / ((Game`5Bplay`5D)**(0.9)*Round(max_score)); X For I := 1 to Round(Score_Ratio) do`20 X Write('a'); X If PLay = Top_PLay Then`20 X Write(Esc,'G ** Champ ** '); X Writeln; `7B Normal Video `7D X end; X End; 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(Esc,'G'); X Writeln(' Game # ',Game`5BYou`5D:1,' Total # ',Total_Num_Games:1, X '`09`09Please Wait For Next Game ... ',Esc,'F'); X`7B If Num_on_Table <= 1 Then`20 X Goto 9999; `7D Xend; X XProcedure Draw_screen; X XVar play,I,R,C,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(esc,'H',esc,'J',Esc,'F'); `7B Clear Home `7D X Write('l',Esc,'<',Esc,'#6',Esc,'`5B?2l',Esc,'F'); X For C := 1 To (Screen_Dim_C-2) Do`20 X Write('q'); X Writeln('k'); X For R := 2 To ( Screen_dim_R - 1 ) Do begin X Write('x',Esc,'<',Esc,'#6',Esc,'`5B?2l',Esc,'F'); X Writeln(Pos(R,Screen_dim_C),'x'); X end; X Write('m',Esc,'<',Esc,'#6',Esc,'`5B?2l',Esc,'F'); X For C := 2 to (Screen_Dim_C-1) Do`20 X Write('q'); X Writeln('j',Esc,'H'); Xend; X X `20 XProcedure initalise_Positions; X X X XVar Mult,Play,R,C : Integer; X X XBegin X XArea_Filled := Screen_Dim_R*2 + Screen_Dim_C*2 - 4; X XCursor_C := 9999; X XSnake_Start(Who_Is_Playing,Rand); X X`7B Randomly Position The Starting Pos Of The PLayers `7D XFor play := 1 to Max_num_players do Begin X Head_R`5BPlay`5D := Init_pos_R`5BRand`5BPlay`5D`5D; X Head_C`5Bplay`5D := Init_pos_C`5BRand`5BPLay`5D`5D; X Can_Create`5Bplay`5D := False; X Creating`5Bplay`5D := False; X Move_R`5BPlay`5D := 1; X Move_C`5BPLay`5D := 0; Xend; X XMult := 2**(Max_num_Players - 1 ); `7B 2 ** Number of PLayers - 1`7D XNum_Players := 0; X X`7B Examine Each Bit In Mult To See If You Are Playing `7D XMax_player_number := 0; XFor Play := Max_Num_PLayers downto 1 do begin X If ( Who_Is_PLaying div Mult ) = 1 Then begin X Num_Players := Num_PLayers + 1; X Quit`5Bplay`5D := False; `7B Bit Set You Are Playing `7D X Who_is_Playing := Who_is_Playing - Mult; X If Max_player_number = 0 Then`20 X Max_player_number := play ;`7B The Highest Numbered Player `7D X end else begin X Quit`5BPlay`5D := True; `7B Bit Not Set Not Playing ie Quit `7D X end; X Mult := Mult div 2; Xend; X X`7B If You are PLaying Then You Havnt Died `7D XFor R := 1 To Screen_Dim_R do`20 X For C := 1 to Screen_Dim_C do X Screen`5BR,C`5D := ' '; XFor C := 1 To Screen_Dim_C do Begin X Screen`5B1,C`5D := 'q'; X Screen`5BScreen_Dim_R,C`5D := 'q'; Xend; XFor R := 1 To Screen_Dim_R Do Begin X Screen`5BR,1`5D := 'x'; X Screen`5BR,Screen_Dim_C`5D := 'x';`20 Xend; XScreen`5B1,1`5D := 'l'; XScreen`5B1,Screen_Dim_C`5D := 'k'; XScreen`5BScreen_Dim_R,1`5D := 'm'; XScreen`5BScreen_Dim_R,Screen_Dim_C`5D := 'j'; XHead_Sym`5B1`5D := chr(128+ord('1')); `7B Set The Bits In The Chars `7D XHead_Sym`5B2`5D := chr(128+ord('2')); XHead_Sym`5B3`5D := chr(128+ord('3')); XHead_Sym`5B4`5D := chr(128+ord('4')); XHead_Sym`5B5`5D := chr(128+ord('5')); XHead_Sym`5B6`5D := chr(128+ord('6')); XHead_Sym`5B7`5D := chr(128+ord('7')); XHead_Sym`5B8`5D := chr(128+ord('8')); X X`7B Note If This Procedure Is Only Called When You Are Master Snake`20 X Draw Screen Should Be In The Mainlkine Before Init_Pos X And The Writing Of The PLayers Pos Should Be To The Buffer`20 X And Then Written To All Who Are PLaying `7D X XDraw_screen; `20 X X`7B Pos Inital Player Positions `7D XFor Play := 1 to Max_Num_Players Do Begin X responce`5BPlay`5D := ' '; `7B Initalise First Responce Should Not BE N Veeded `7D X Game`5BPLay`5D := Game`5BPLay`5D; Xend; XFor Play := 1 to Max_Num_PLayers do `20 X If Not Quit`5BPlay`5D Then begin X Ch_On`5Bplay`5D := Screen`5BHead_R`5BPlay`5D,Head_C`5BPlay`5D`5D; X Screen`5BHead_R`5BPlay`5D,Head_C`5BPlay`5D`5D := '*'; X If ( Play <> You ) Then `20 X Writeln(pos(Head_R`5BPlay`5D,Head_C`5BPlay`5D),Head_sym`5BPlay`5D,Esc, V'H') X Else Begin`20 X Writeln(pos(Head_R`5BYou`5D,Head_C`5BYou`5D),'`60',Esc,'H'); X end; X end; XSleep(1); Xend; X XProcedure Initalise_Mainline; X XVar Zero,Init_Rep,PLay,Name_Pos,Game_Going : Integer; X XProcedure Verify_name(VAr Name : Name_Line ); X XVar I : INteger; X X XBegin X For I := 1 to Max_Name_length do `7B Remove All Invalid Chars From The V Name`7D X If ( Name`5Bi`5D < ' ' ) Then Begin X Write(chr(7)); X Name`5Bi`5D := ' '; X end; Xend; X X XBegin X Esc := Chr(27); X Back_Space := CHr(8); X Line_Feed := Chr(10); X Up_Line := 'A' `7B Used With A For Move up One Line `7D; X Area_75_Per := Trunc ( Screen_Dim_R * Screen_Dim_C * (0.90 )); X Seed := Clock; X TT_Len := 0; X `20 X X `7B set where Each Player Starts `7D X X Init_pos_R`5B1`5D := 1; X Init_pos_C`5B1`5D := 1; X `20 X Init_pos_R`5B2`5D := Screen_dim_R ; X Init_pos_C`5B2`5D := Screen_dim_C ; X `20 X Init_pos_R`5B3`5D := 1; X Init_pos_C`5B3`5D := Screen_dim_C; X `20 X Init_pos_R`5B4`5D := Screen_dim_R; X Init_pos_C`5B4`5D := 1; X `20 X Init_pos_R`5B5`5D := 1; X Init_pos_C`5B5`5D := Screen_dim_C div 2; X `20 X Init_pos_R`5B6`5D := Screen_dim_R; X Init_pos_C`5B6`5D := Screen_dim_C div 2; X `20 X Init_pos_R`5B7`5D := Screen_dim_R div 2; X Init_pos_C`5B7`5D := 1; X `20 X Init_pos_R`5B8`5D := Screen_dim_R div 2; X Init_pos_C`5B8`5D := Screen_dim_C; X X Writeln(Esc,'<',Esc,'`5B?2l'); `7B Vt52 Mode `7D X Writeln(Esc,'H',Esc,'J'); `7B Clear Screen `7D X Init_rep := Snake_Init(You,Game_going); X You := You + 1; `20 X If Init_rep = 1 Then Begin X `7B you are the First Person to play zero all the scores `7D X For Play := 1 to Max_Num_PLayers do begin X Zero := 0; X Score_Set(Play,Zero,zero,zero); X end; X Help_Screen; X Writeln(Esc,'`5B?2l',Esc,'H'); X Writeln(pos(22,3),' Please Enter Your Name Player #',You:1); X Write(pos(22,51)); X Readln(Name`5BYou`5D); X Verify_Name(Name`5BYou`5D); X Name_set(Name`5BYou`5D); X Write(pos(22,3), ' Hit < Return > When Others Ready '); X Readln; X Writeln; X Write(pos(22,3), ' Please Wait For Game To Start '); X Writeln; X end Else Begin X If You = 0 Then Begin X Writeln(pos(1,33),'Multi User Qix'); X Writeln; X Writeln(pos(4,10),' Sorry No Qix''s Available'); X`09 Sleep(3); X goto 9999; X end else begin `7B Init_rep = 0 `7D`20 X Help_Screen; X Writeln(Esc,'`5B?2l',esc,'H'); X Writeln(pos(22,3),' Please Enter Your Name Player # ',You:1); X Write(pos(22,51)); X Readln(Name`5BYou`5D); X Verify_name(Name`5BYou`5D); X Name_set(Name`5BYou`5D); X Writeln; X Write(pos(22,3), ' Please Wait For Game To Start '); X Writeln; X If Game_Going = 1 Then`20 X Snake_Game_End; X end; X end; X Game`5BYou`5D := 0; Xend `7B Initalise Mainline `7D; X X`5BGLOBAL`5D Function Add_head( Var Responce : Player_responce ):Integer; X XVar Play : Integer; X XProcedure Add_this_players_Head; X Xvar P,pos_R,Pos_c,dir_R,dir_C : Integer; X X Procedure New_join_Char( Into_wall : Boolean) ; X X var count : Integer; X X Begin X Case Screen`5Bpos_r,pos_C`5D of`20 X`09 'k' : Count := 10; X`09 'u' : Count := 11; X`09 'l' : Count := 12; X`09 't' : Count := 13; X`09 'w' : Count := 14; X`09 'n' : Count := 15; X`09 'j' : Count := 3; X`09 'm' : Count := 5; X`09 'q' : Count := 6; X`09 'v' : Count := 7; X`09 'x' : Count := 9; X`09 end;`09 `09 X If into_Wall Then`20 X`09 Case ( Dir_R + 1 ) + ( Dir_C + 1 ) * 2 of`20 X`09 2 : Count := Count + 8; X`09 4 : Count := Count + 1; X`09 1 : Count := Count + 4; X`09 5 : Count := Count + 2; X`09 end X `09 else X`09 Case ( Dir_R + 1 ) + ( Dir_C + 1 ) * 2 of`20 X`09 2 : Count := Count + 1; X`09 4 : Count := Count + 8; X`09 1 : Count := Count + 2; X`09 5 : Count := Count + 4; X`09 end; X`09 Case Count Of`20 X`09 0`09: Screen`5Bpos_r,Pos_C`5D := ' ';`20 X`09 1,8,9 : Screen`5Bpos_r,Pos_C`5D := 'x'; X`09 2,4,6 : Screen`5Bpos_r,Pos_C`5D := 'q'; X`09 3`09: Screen`5Bpos_r,Pos_C`5D := 'j'; X`09 5`09: Screen`5Bpos_r,Pos_C`5D := 'm'; X`09 7`09: Screen`5Bpos_r,Pos_C`5D := 'v'; X`09 10`09: Screen`5Bpos_r,Pos_C`5D := 'k'; X`09 11`09: Screen`5Bpos_r,Pos_C`5D := 'u'; X`09 12`09: Screen`5Bpos_r,Pos_C`5D := 'l'; X`09 13`09: Screen`5Bpos_r,Pos_C`5D := 't'; X`09 14`09: Screen`5Bpos_r,Pos_C`5D := 'w'; X`09 15`09: Screen`5Bpos_r,Pos_C`5D := 'n' X`09 end `7B case `7D; X end; X X X procedure new_tail_CHar; X X begin X Case (move_R`5Bplay`5D+1) + (Move_C`5Bplay`5D+1)*4 of`20 X 6 : `7B Down `7D X Case (Dir_R+1) + (Dir_C+1)*4 Of`20 X 6 : `7B Down `7D X Screen`5BPos_R,Pos_C`5D := 'x'; X 9 : `7B Right `7D X Screen`5BPos_R,Pos_C`5D := 'm'; X 1 : `7B Left `7D X Screen`5BPos_R,Pos_C`5D := 'j'; X 4 : `7B Up Note : This Is Poss On First Move `7D X Screen`5BPos_R,Pos_C`5D := 'x'; X end `7B Case `7D; X 4 : `7B Up `7D X Case (Dir_R+1) + (Dir_C+1)*4 Of`20 X 6 : `7B Down `7D X Screen`5BPos_R,Pos_C`5D := 'x'; X 4 : `7B Up `7D X Screen`5BPos_R,Pos_C`5D := 'x'; `20 X 9 : `7B Right `7D X Screen`5BPos_R,Pos_C`5D := 'l'; X 1 : `7B Left `7D X Screen`5BPos_R,Pos_C`5D := 'k'; `20 X end `7B Case `7D; X `20 X 9 : `7B Right `7D X Case (Dir_R+1) + (Dir_C+1)*4 Of`20 X 6 : `7B Down `7D X Screen`5BPos_R,Pos_C`5D := 'k'; `20 X 4 : `7B Up `7D X Screen`5BPos_R,Pos_C`5D := 'j'; `20 X 9 : `7B Right `7D X Screen`5BPos_R,Pos_C`5D := 'q'; X 1 : `7B Left `7D X Screen`5BPos_R,Pos_C`5D := 'q'; `20 X end `7B Case `7D; X X 1 : `7B Left `7D X Case (Dir_R+1) + (Dir_C+1)*4 Of`20 X 9 : `7B Right `7D X Screen`5BPos_R,Pos_C`5D := 'q'; X 6 : `7B Down `7D X Screen`5BPos_R,Pos_C`5D := 'l'; `20 X 4 : `7B Up `7D X Screen`5BPos_R,Pos_C`5D := 'm'; `20 X 1 : `7B Left `7D X Screen`5BPos_R,Pos_C`5D := 'q'; `20 X end `7B Case `7D; X X end `7B Case `7D; X end;`09`20 X X Function move_Anti_Clock( var R,C,Prev_R,Prev_C : integer):Boolean; X X var`20 X Save_R,Save_C : Integer; X X Begin X Save_R := R; X Save_C := C; X Case ( Prev_C - C ) of`20 X 1 :`20 X`09 Case Screen`5BR,C`5D of`20 X`09 'l' : R := R + 1; X `09 'w' : R := R + 1; X `09 't' : R := R + 1; X `09 'n' : R := R + 1; X`09 'm' : R := R - 1; X`09 'v' : C := C - 1; X`09 'q' : C := C - 1; X`09 end; X 0 : X`09 Case ( prev_R - R ) Of`20 X`09 1 : X`09 Case Screen`5BR,c`5D of X`09`09 'l' : C := C + 1; X`09`09 'w' : C := C - 1; X`09`09 'k' : C := C - 1; X`09`09 't' : R := R - 1; X`09`09 'n' : C := C - 1; X`09`09 'u' : C := C - 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' : C := C + 1; X`09`09 'n' : C := C + 1;`20 X`09`09 'u' : R := R + 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' : C := C + 1; X`09 'k' : R := R + 1; X`09 'n' : R := R - 1; X`09 'u' : R := R - 1; X`09 'v' : R := R - 1; X`09 'j' : R := R - 1; X`09 'q' : C := C + 1; X`09 end; X end; X move_Anti_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_Anti_Clock := False X Else X IF Screen`5BR,C`5D = ' ' Then`20 X `09 Writeln(' **** INTERNAL ERROR **** MOVE_ANTI_CLOCK '); Xend; `09 `20 X X X Function Move_Clock( var R,C,Prev_R,Prev_C : Integer):Boolean; X X var`20 X Save_R,Save_C : Integer; X X Begin X Save_R := R; X Save_C := C; X Case ( Prev_C - C ) of`20 X 1 :`20 X`09 Case Screen`5BR,C`5D of`20 X`09 'l' : R := R + 1; X `09 'w' : C := C - 1; X `09 't' : R := R - 1; X `09 'n' : R := R - 1; X`09 'm' : R := R - 1; X`09 'v' : R := R - 1; X`09 'q' : C := C - 1; X`09 end; X 0 : X`09 Case ( prev_R - R ) Of`20 X`09 1 : X`09 Case Screen`5BR,c`5D of X`09`09 'l' : C := C + 1; +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-