$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_VERIFY"))' $! $! This archive created by VMS_SHARE Version 7.2-007 22-FEB-1990 $! On 5-JUN-1992 23:19:46.43 By user MASLIB $! $! This VMS_SHARE Written by: $! Andy Harper, Kings College London UK $! $! Acknowledgements to: $! James Gray - Original VMS_SHARE $! Michael Bednarek - Original Concept and implementation $! $!+ THIS PACKAGE DISTRIBUTED IN 6 PARTS, TO KEEP EACH PART $! BELOW 30 BLOCKS $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. BUILD.COM;1 $! 2. MQIX.PAS;1 $! 3. MQIXH.FOR;1 $! 4. MQIXH.SCN;1 $! 5. MQIXM.MAR;1 $! $set="set" $set symbol/scope=(nolocal,noglobal) $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID")) $e="write sys$error ""%UNPACK"", " $w="write sys$output ""%UNPACK"", " $ if f$trnlnm("SHARE_LOG") then $ w = "!" $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $UNPACK: SUBROUTINE ! P1=filename, P2=checksum $ if f$search(P1) .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped." $ delete 'f'* $ exit $file_absent: $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'." $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped." $ delete 'f'* $ exit $dirok: $ w "-I-PROCESS, Processing file ''P1'." $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1' PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b)); LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION( BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1); IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE; MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1; ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")= 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF"; POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r); ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1; COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE, "output_file"));ENDPROCEDURE;Unpacker;QUIT; $ delete/nolog 'f'* $ CHECKSUM 'P1' $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT $ e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ ENDSUBROUTINE $START: $ create 'f' X$ PASCAL MQIX X$ FORTRAN MQIXH X$ MACRO MQIXM X$! X$ LINK/NOTRACE MQIX,MQIXM,MQIXH,UTIL/LIB X$ DELETE/NOCONFIRM *.OBJ;* X$ EXIT $ CALL UNPACK BUILD.COM;1 476647730 $ create 'f' X`7B$S-`7D X`7B X X`09`09Program`09: Multi USer Qix`20 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: Jan 1983 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 MQix(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_R `09= 24; `7B PLaying Board 40 * 23 `7D X`09Screen_Dim_C`09= 40; X`09Len_Of_Buff`09= 1920; `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_R,1..Screen_Dim_C`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 `09Ch_on`09`09, X`09Head_Sym`09: Player_Responce; `7B What Symbol is THe Head `7D X `09Cal`09`09, 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_R`09, `7B Where initaially Players St Vart `7D X Init_pos_C , `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_R`09`09, `7B What Dir Each Playe Is Moving X C Voord `7D X`09Move_C`09`09, `7B "" "" Y Coord `7D X`09Head_R`09`09, `7B Where The Head Is For Each Player V X Coord `7D X`09Head_C`09 `09, `7B "" "" Y Coord `7D X Rand`09`09: Positions; 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 Cursor_R`09, X Cursor_C`09, 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 Area_75_Per`09, X `09Area_Filled`09, X`09Num_players , `7B How Many people are Playing ` V7D X`09Max_Player_Number : integer; `7B The Highest PLayers V Number who is Playing `7D X`09Quit`09`09, `7B Has The PLayer Quit (not playing ) V or is He Playing `7D X `09Can_Create`09, X`09Creating`09: Died_Type; `7B Has The PLayer Died ( Died If He h Vas Quit ) `7D X`09Back_space`09, X`09Line_Feed`09, X`09Up_Line`09`09, X`09Esc`09`09: Char; `7B esc For escape sequences `7D X`09Seed`09`09: Real; `7B Seed for random number generaotor ` V7D X Time_Now`09: Packed array `5B1..11`5D Of Char; 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 X procedure Write_5( ch1,ch2,ch3,ch4,ch5 : CHar); X `20 X Begin X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch1; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch2; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch3; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch4; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch5; X end; X `20 X X X procedure Write_4( ch1,ch2,ch3,ch4 : CHar); X `20 X Begin X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch1; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch2; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch3; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch4; X end; X `20 X X X procedure Write_3( ch1,ch2,ch3 : CHar); X `20 X Begin X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch1; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch2; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch3; X end; X `20 X X X procedure Write_2( ch1,ch2 : CHar); X `20 X Begin X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch1; X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch2; X end; X `20 X X X procedure Write_1( ch1 : CHar); X `20 X Begin X TT_len := TT_len + 1; X TT_Buff`5BTT_len`5D := Ch1; X end; X `20 X X X procedure at(R,C:Integer;ch : char ); X `20 X Begin`20 X If ( Abs(R-Cursor_R) <= 2 ) and ( Abs(C-Cursor_C) <= 2 ) Then Begin`20 X`09 Case ( R - Cursor_R )*5 + ( C - Cursor_C ) of`20 X`09 `7B Up , -2, 0 `7D -10 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Up ,LEft -2,-1 `7D -11 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Up ,LEft -2,-2 `7D -12 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Up ,Right -2, 1 `7D -9 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Up ,Right -2, 2 `7D -8 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Up ,LEft -1,-2 `7D -7 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Up ,LEft -1,-1 `7D -6 : write_4(Esc,'A',chr(8),Ch); X`09 `7B Up , -1, 0 `7D -5 : write_3(Esc,'A',ch); X`09 `7B Up ,Right -1, 1 `7D -4 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Up ,Right -1, 2 `7D -3 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B ,Left 0,-2 `7D -2 : write_3(chr(8),chr(8),ch); X`09 `7B ,Left 0,-1 `7D -1 : write_2(chr(8),ch); X`09 `7B , 0, 0 `7D 0 : write_1(ch);`20 X`09 `7B ,Right 0, 1 `7D 1 : write_3(Esc,'C',ch); X`09 `7B ,Right 0, 2 `7D 2 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Down,Left 1,-2 `7D 3 : write_4(Chr(10),Chr(8),chr(8),ch); X`09 `7B Down,Left 1,-1 `7D 4 : write_3(Chr(10),Chr(8),ch); X`09 `7B Down 1, 0 `7D 5 : Write_2(Chr(10),ch); X`09 `7B Down,Right 1, 1 `7D 6 : Write_4(Chr(10),Esc,'C',ch); X`09 `7B Down,Right 1, 2 `7D 7 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Down,Left 2,-2 `7D 8 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Down,Left 2,-1 `7D 9 : write_4(Chr(10),chr(10),Chr(8),ch); X`09 `7B Down 2, 0 `7D 10 : Write_3(Chr(10),chr(10),ch); X`09 `7B Down,Right 2, 1 `7D 11 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 `7B Down,Right 2, 2 `7D 12 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch V); X`09 end; X end else Begin X`09 Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch); X end; X Cursor_R := R; X Cursor_C := C + 1; X If C >= 40 Then`20 X`09 Cursor_C := 999; X end; X X X Procedure new_Screen_Char( R,C : Integer ); `20 X X var Count : Integer; X X Begin X`09 Count := 0; `20 X`09 If r-1 > 0 then`20 X`09 If Screen`5Br-1,c`5D in `5B'$','l','w','k','t','n','u','x'`5D Then`20 X`09 Count := Count + 1; X`09 If c - 1 > 0 then`20 X`09 If screen`5Br,c-1`5D in `5B'$','l','w','t','n','m','v','q'`5D Then X`09 Count := Count + 2; X`09 If c + 1 <= screen_Dim_C then`20 X`09 If Screen`5Br,c+1`5D in `5B'$','w','k','n','u','v','j','q'`5D Then`2 V0 X`09 Count := Count + 4; X`09 If r +1 <= Screen_Dim_R then`20 X`09 If Screen`5Br+1,c`5D in `5B'$','t','n','u','m','v','j','x'`5D Then`20 X`09 Count := Count + 8; X`09 Case Count Of`20 X`09 0`09: Screen`5BR,C`5D := ' ';`20 X`09 1,8,9 : Screen`5BR,C`5D := 'x'; X`09 2,4,6 : Screen`5BR,C`5D := 'q'; X`09 3`09: Screen`5BR,C`5D := 'j'; X`09 5`09: Screen`5BR,C`5D := 'm'; X`09 7`09: Screen`5BR,C`5D := 'v'; X`09 10`09: Screen`5BR,C`5D := 'k'; X`09 11`09: Screen`5BR,C`5D := 'u'; X`09 12`09: Screen`5BR,C`5D := 'l'; X`09 13`09: Screen`5BR,C`5D := 't'; X`09 14`09: Screen`5BR,C`5D := 'w'; X`09 15`09: Screen`5BR,C`5D := 'n' X`09 end `7B case `7D; X end; X X X XProcedure Help_Screen;extern; X XFunction pos( R,C : Integer ): CHar; X X`7B Write Char at Pos X,Y in Buffer `7D X XBegin X Write(Esc,'Y',Chr(31+R),Chr(31+C)); X pos := Chr(0); Xend; 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 ; var Play : `5BREADONLY`5D Integer V ); X`09`09`09`09`09`09`09`09`09extern; XProcedure Score_Set( VAR Player: `5BREADONLY`5D INTEGER; X`09`09`09`09VAR Score,Games_PLayed,wins : INTEGER); extern; XProcedure Score_Get( Var Player : `5BREADONLY`5D INTEGER; X`09`09`09`09VAR Score,Games_Played,wins : Integer );extern; X XProcedure Snake_Start(var Whos_PLaying : Integer ; var Rand : Positions );Ex Vtern; 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 XFunction Mth$Random(var Seed : real):Real;extern; X XProcedure Draw_Scores; X XConst Len_Scale = 50; X XVar I,num_on_table,play,Top_play,Total_Num_Games: Integer; X This_Score,`09Max_score , Score_Ratio : Real; X X XBegin X Time(Time_Now); X Num_on_Table := 0; X Writeln(Esc,'<',Esc,'`5B0m',Esc,'`5B?2l'); X Write(esc,'H',Esc,'J',Esc,'G'); X Write(' Player User Name Score Game '); X If ( Time_Now`5B1`5D = '2' ) Then Begin X If ( Time_Now`5B2`5D >= '2' ) Then Begin X Time_Now`5B1`5D := '1'; X Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) - 2); X end Else begin X Time_Now`5B1`5D := ' '; X Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) + 8); X end; X Write(Time_Now:5); X Writeln(' pm'); X End Else Begin X If (( Time_Now`5B1`5D = '1' ) and ( Time_Now`5B2`5D > '2' )) THen Begi Vn X Time_Now`5B1`5D := ' '; X Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) - 2); X Write(Time_Now:5); X Writeln(' pm'); X end Else Begin X If Time_Now`5B1`5D = '0' Then`20 X Time_Now`5B1`5D := ' '; X Write(Time_Now:5); X If Time_Now`5B2`5D = '2' Then`20 X Writeln(' pm') X else X Writeln(' am'); X end; X end; X writeln; X Max_score := -99999.0; 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 := (Score`5Bplay`5D+ Games_won`5Bplay`5D*10) / (Game`5Bp Vlay`5D)**(0.9); X If This_score > Max_score Then Begin X Top_Play := Play; +-+-+-+-+-+-+-+- END OF PART 1 +-+-+-+-+-+-+-+-