Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/demos/cat.sim
There are 4 other files named cat.sim in the archive. Click here to see a list.
00050	OPTIONS(/l);
00100	BEGIN
00150	EXTERNAL CHARACTER PROCEDURE getch, fetchar;
00200	EXTERNAL INTEGER PROCEDURE trmop, gettab, checkreal, checkint;
00250	EXTERNAL PROCEDURE echo, abort, outchr, depchar, forceout, outstring;
00300	EXTERNAL BOOLEAN PROCEDURE meny, tmpout;
00350	EXTERNAL TEXT PROCEDURE storbokstav, scanto, tmpin;
00400	EXTERNAL CLASS termty;
00450	EXTERNAL CLASS vista;
00500	
00550	vista CLASS boardvista(boardwidth, boardheight);
00600	INTEGER boardwidth, boardheight;
00650	BEGIN
00700	  INTEGER boardwidthm1, boardheightm1;
00750	  PROCEDURE make_board;
00800	    COMMENT
00850	    ======================================================
00900	    =======;
00950	    COMMENT: Will make the whole screen blank. If
01000	    boardheight
01050	    and boardwidth are greater than zero,
01100	    a board of this size
01150	    is written on the screen;
01200	  BEGIN
01250	    INTEGER h, v;
01300	    sysout.outimage;
01350	    blank_the_screen;
01400	    IF boardwidth > 0 AND boardheight > 0 THEN
01450	    BEGIN
01500	      COMMENT type screen border;
01550	      home_the_cursor;
01600	      FOR h:= -1 STEP 1 UNTIL boardwidth DO
01650	      outchar('-');
01700	      FOR v:= 1 STEP 1 UNTIL boardheight DO
01750	      BEGIN
01800	        set_char_on_screen('!',0,v);
01850	        set_char_on_screen('!',boardwidth+1,v);
01900	      END;
01950	      move_the_cursor_to(0,boardheight+1);
02000	      FOR h:= -1 STEP 1 UNTIL boardwidth DO
02050	      outchar('-');
02100	    END;
02150	    home_the_cursor; breakoutimage;
02200	  END;
02250	  boardwidthm1:= boardwidth-1;
02300	  boardheightm1:= boardheight-1;
02350	END;
02400	
02450	INSPECT NEW boardvista(78, 16, sysin, sysout, FALSE, 0,
02500	NOTEXT, NOTEXT, 20, 8) DO
02550	BEGIN
02600	  simulation BEGIN
02650	    INTEGER numberofdeadrats, numberofsavedrats, exith,
02700	    u;
02750	    INTEGER numberofratholes;
02800	    INTEGER playtime, number_of_fillers,
02850	    sysin_strip_length;
02900	    INTEGER avoidingdistance;
02950	    REAL real_time_step, terminal_speed,
03000	    rat_intelligence, ratfactor;
03050	    TEXT blanks6;
03100	    BOOLEAN direction_ordered;
03150	    CHARACTER starter, direction;
03200	    REF(rat) therat;
03250	    REF(cat) thecat;
03300	
03350	    PROCEDURE setratfactor;
03400	    BEGIN
03450	      IF ratfactor < 0.5 THEN ratfactor:= 0.5 ELSE
03500	      IF ratfactor >= 0.96 THEN ratfactor:= 0.96;
03550	      ratfactor:= 0.005*(rat_intelligence+40);
03600	      IF numberofratholes >= 0 THEN
03650	      BEGIN
03700	        move_the_cursor_to(45,4);
03750	        outtext("Rat intelligence: ");
03800	        outfix(rat_intelligence,0,4);
03850	        home_the_cursor;
03900	      END;
03950	    END;
04000	
04050	
04100	    PROCEDURE
04150	    put_question_in_lower_left_corner(question);
04200	    VALUE question; TEXT question;
04250	    BEGIN
04300	      move_the_cursor_to(0,boardheight+4);
04350	      outtext(question);
04400	      outimage; outtext(blanks6); outimage;
04450	      outtext(blanks6);
04500	      move_the_cursor_to(0,boardheight+5);
04550	    END;
04600	
04650	    process CLASS animal;
04700	    BEGIN INTEGER v, h, vnew, hnew;
04750	    END;
04800	
     
04850	
04900	
04950	    animal CLASS rat;
05000	    BEGIN
05050	      INTEGER i; BOOLEAN dead;
05100	
05150	      INTEGER PROCEDURE clever_gives_positive;
05200	      clever_gives_positive:= IF draw(ratfactor,
05250	      u) THEN 1 ELSE -1;
05300	
05350	      jumpin:
05400	      h:= randint(1,boardwidth,u);
05450	      v:= randint(1,boardheight,u);
05500	      IF get_char_from_screen(h,
05550	      v) NE ' ' THEN GOTO jumpin;
05600	      WHILE NOT dead DO
05650	      BEGIN
05700	        set_char_on_screen(' ',h,v);
05750	        IF h = 0 OR h > boardwidth THEN
05800	        BEGIN
05850	          rat_intelligence:= rat_intelligence-42;
05900	          setratfactor;
05950	          numberofsavedrats:= numberofsavedrats+1;
06000	          move_the_cursor_to(boardwidth+7,boardheight+2);
06050	          start_blink;
06100	          move_the_cursor_to(numberofsavedrats+boardwidth+7,
06150	          boardheight+2);
06200	          outchar('o'); stop_blink;
06250	
06300	          thecat.eat:= 1; GOTO out;
06350	        END;
06400	        IF h = 1 AND v = exith AND numberofratholes >=
06450	        1 THEN h:= h-1 ELSE
06500	        IF h = boardwidth AND v = exith AND
06550	        numberofratholes >= 2
06600	        THEN h:= h+1 ELSE
06650	        BEGIN
06700	          hnew:= h + clever_gives_positive
06750	          * (IF numberofratholes <= 0 THEN
06800	          (IF h > boardwidth//2 THEN -1 ELSE 1)
06850	          ELSE IF numberofratholes <= 1 THEN -1
06900	          ELSE IF h > thecat.h THEN 1 ELSE IF h <
06950	          thecat.h THEN -1
07000	          ELSE ((IF h > boardwidth//2 THEN 1 ELSE -1)
07050	          * (IF h = 1 OR h = boardwidth THEN -1 ELSE
07100	          1)));
07150	          IF abs(v-thecat.v)+abs(h-thecat.h) <=
07200	          avoidingdistance THEN
07250	          vnew:= v + clever_gives_positive
07300	          * (IF v > thecat.v THEN 1 ELSE -1)
07350	          ELSE
07400	          vnew:= v + clever_gives_positive
07450	          * (IF v > exith THEN -1 ELSE 1);
07500	          IF get_char_from_screen(hnew, vnew) = ' ' THEN
07550	          BEGIN
07600	            h:= hnew; v:= vnew;
07650	          END ELSE
07700	          IF get_char_from_screen(hnew,vnew) = '|' THEN
07750	          BEGIN
07800	            hnew:= h;
07850	            IF get_char_from_screen(hnew,
07900	            vnew) = ' ' THEN
07950	            v:= vnew;
08000	          END ELSE
08050	          BEGIN
08100	            vnew:= v;
08150	            IF get_char_from_screen(hnew,
08200	            vnew) = ' ' THEN
08250	            h:= hnew;
08300	          END;
08350	
08400	        END;
08450	        set_char_on_screen('o',h,v);
08500	        IF h >= 0 THEN hold(1.0);
08550	        cause_real_time_delay((IF direction_ordered
08600	        THEN 2 ELSE 1)
08650	        *number_of_fillers);
08700	      END;
08750	      out:
08800	      ACTIVATE thecat DELAY 0;
08850	    END rat;
08900	
     
08950	
09000	
09050	    animal CLASS cat;
09100	    BEGIN
09150	      INTEGER eat;
09200	      v:= boardheight/2; h:= boardwidth/2;
09250	      GOTO jump;
09300	      WHILE TRUE DO
09350	      BEGIN
09400	        set_char_on_screen(' ',h,v);
09450	        jump:
09500	        IF (IF direction_ordered THEN direction = up OR
09550	        direction = down
09600	        ELSE draw(0.5,u)) THEN
09650	        BEGIN COMMENT move vertically;
09700	          IF (IF direction_ordered THEN direction = up
09750	          ELSE v > therat.v)
09800	          THEN vnew:= v-1 ELSE vnew:= v+1;
09850	          hnew:= h;
09900	        END ELSE
09950	        BEGIN COMMENT move horizontally;
10000	          IF (IF direction_ordered THEN direction =
10050	          left ELSE h > therat.h)
10100	          THEN hnew:= h-1 ELSE hnew:= h+1;
10150	          vnew:= v;
10200	        END;
10250	        IF get_char_from_screen(hnew,vnew) = '-'
10300	        OR get_char_from_screen(hnew,vnew) = '|'
10350	        OR hnew = 0 OR hnew = boardwidth+1 THEN
10400	        BEGIN
10450	          IF NOT direction_ordered THEN GOTO jump
10500	          ELSE
10550	          BEGIN
10600	            hnew:= h; vnew:= v;
10650	          END;
10700	        END;
10750	
10800	        h:= hnew; v:= vnew;
10850	        IF get_char_from_screen(h,v) = 'o' THEN
10900	        BEGIN
10950	          therat.dead:= TRUE;
11000	          numberofdeadrats:= numberofdeadrats+1;
11050	          eat:= 1;
11100	          rat_intelligence:= rat_intelligence+25;
11150	          setratfactor;
11200	          move_the_cursor_to(boardwidth+7,0);
11250	          start_blink; outtext("Dead rats:"); stop_blink;
11300	          set_char_on_screen('o',
11350	          boardwidth+8+mod(numberofdeadrats-1,10),
11400	          1+((numberofdeadrats-1)//10));
11450	        END;
11500	        set_char_on_screen('&',h,v);
11550	        hold(1.0);
11600	        IF NOT direction_ordered THEN
11650	        cause_real_time_delay(number_of_fillers);
11700	        IF eat > 0 THEN
11750	        BEGIN
11800	          eat:= eat-1; IF eat = 0 THEN
11850	          BEGIN
11900	            therat:- NEW rat; ACTIVATE therat DELAY 0.5;
11950	            set_char_on_screen(' ',boardwidth+7,0);
12000	            outtext(" Dead rats:");
12050	          END;
12100	        END ELSE
12150	        BEGIN
12200	        END;
12250	      END;
12300	    END cat;
     
12350	
12400	
12450	    blanks6:- blanks(6);
12500	    INSPECT sysout DO INSPECT sysin DO
12550	    BEGIN
12600	      cancel_display;
12650	      outtext("Answer RETURN to get default values");
12700	      outtext(" on preliminary questions!");
12750	      outimage; outimage;
12800	      numberofratholes:= -1;
12850	      outtext("Input start random integer: ");
12900	      breakoutimage; inimage;
12950	      u:= IF sysin.image.strip.length = 0 THEN 87697
13000	      ELSE inint;
13050	      outtext(
13100	      "Input initial rat intelligence quotient: ");
13150	      breakoutimage; inimage;
13200	      rat_intelligence:= IF sysin.image.strip.length =
13250	      0 THEN 80 ELSE inreal;
13300	      outtext(
13350	      "Input distance at which rat is afraid of cat: ");
13400	      breakoutimage; inimage;
13450	      avoidingdistance:= IF sysin.image.strip.length =
13500	      0 THEN 2 ELSE inint;
13550	      outtext("Input number of ratholes, 0, 1 or 2: ");
13600	      breakoutimage; inimage;
13650	      numberofratholes:= IF sysin.image.strip.length =
13700	      0 THEN 2 ELSE inint;
13750	      outtext(
13800	      "Input wanted real step time in seconds: ");
13850	      breakoutimage; inimage;
13900	      real_time_step:= IF sysin.image.strip.length = 0
13950	      THEN 0.15 ELSE inreal;
14000	      outtext(
14050	      "Input terminal speed in characters/second: ");
14100	      breakoutimage; inimage;
14150	      terminal_speed:= IF sysin.image.strip.length = 0
14200	      THEN 240 ELSE inreal;
14250	      number_of_fillers:= real_time_step*terminal_speed;
14300	      resume_display;
14350	    END;
14400	
14450	    make_board;
14500	    exith:= boardheight//2+1;
14550	    IF numberofratholes > 0 THEN set_char_on_screen(' ',
14600	    0,exith);
14650	    IF numberofratholes > 1 THEN set_char_on_screen(' ',
14700	    boardwidth+1,exith);
14750	    home_the_cursor;
14800	    move_the_cursor_to(boardwidth+8,0);
14850	    outtext("Dead rats:"); stop_blink;
14900	    setratfactor;
14950	    move_the_cursor_to(boardwidth+8,boardheight);
15000	    outtext("Safe rats:");
15050	    move_the_cursor_to(boardwidth+7,boardheight+2);
15100	    start_blink;
15150	    move_the_cursor_to(75,boardheight+2);
15200	    stop_blink;
15250	    home_the_cursor;
15300	    thecat:- NEW cat; ACTIVATE thecat DELAY 0.5;
15350	    therat:- NEW rat; ACTIVATE therat;
15400	    hold(1.25);
15450	    WHILE TRUE DO
15500	    BEGIN
15550	      randomquestion:
15600	      put_question_in_lower_left_corner
15650	      ("Do you want random cat walk?                    ");
15700	      IF inyes THEN
15750	      BEGIN
15800	        put_question_in_lower_left_corner
15850	        ("Give number of play steps:                     ");
15900	        playtime:= inint;
15950	        IF playtime < 0 THEN
16000	        BEGIN
16050	          playtime:= -playtime;
16100	          restore_the_whole_screen;
16150	        END;
16200	        hold(playtime);
16250	      END ELSE COMMENT ordered cat walk;
16300	      BEGIN
16350	        put_question_in_lower_left_corner
16400	        ("Give direction of cat movement:                      "
16450	        "");
16500	        WHILE TRUE DO
16550	        BEGIN
16600	          getdirection:
16650	          move_the_cursor_to(thecat.h,thecat.v); breakoutimage;
16700	          direction:= insingle(FALSE);
16750	          direction_ordered:= controlchar AND ( direction = up
16800	          OR
16850	          direction = down
16900	          OR direction = left OR direction = right);
16950	          IF NOT direction_ordered THEN
17000	          BEGIN
17050	            IF direction = '!' THEN GOTO exit ELSE
17100	            IF direction = altmode THEN GOTO
17150	            randomquestion
17200	            ELSE
17250	            BEGIN
17300	              restore_the_whole_screen;
17350	              GOTO getdirection;
17400	            END;
17450	          END;
17500	          hold(1.0);
17550	        END;
17600	      END;
17650	    END;
17700	
17750	
17800	  END comment simulation;
17850	END comment inspect vista;
17900	exit:
17950	END;