00000000: 20 70 72 6F 67 72 61 6D 20 6E 69 6D 20 28 69 6E | program nim (in|
00000010: 70 75 74 2C 20 6F 75 74 70 75 74 29 3B 0D 63 6F |put, output);.co|
00000020: 6E 73 74 20 20 20 6E 72 6F 77 73 20 3D 20 32 35 |nst nrows = 25|
00000030: 3B 0D 20 20 20 20 20 20 20 20 64 65 6C 61 79 20 |;. delay |
00000040: 3D 20 31 30 30 30 3B 0D 20 20 20 20 20 20 20 20 |= 1000;. |
00000050: 63 6F 69 6E 20 3D 20 31 36 38 3B 0D 76 61 72 20 |coin = 168;.var |
00000060: 20 20 20 20 70 69 6C 65 20 3A 20 61 72 72 61 79 | pile : array|
00000070: 20 5B 31 2E 2E 33 5D 20 6F 66 20 30 2E 2E 6E 72 | [1..3] of 0..nr|
00000080: 6F 77 73 3B 0D 20 20 20 20 20 20 20 20 6D 6F 76 |ows;. mov|
00000090: 65 20 20 3A 20 72 65 63 6F 72 64 0D 20 20 20 20 |e : record. |
000000A0: 20 20 20 20 20 20 20 20 20 20 20 20 6E 74 61 6B | ntak|
000000B0: 65 6E 2C 20 70 69 6C 65 6E 6F 20 3A 20 69 6E 74 |en, pileno : int|
000000C0: 65 67 65 72 3B 0D 20 20 20 20 20 20 20 20 65 6E |eger;. en|
000000D0: 64 3B 0D 20 20 20 20 20 20 20 20 69 20 3A 20 69 |d;. i : i|
000000E0: 6E 74 65 67 65 72 3B 0D 20 20 20 20 20 20 20 20 |nteger;. |
000000F0: 6B 65 79 20 3A 20 63 68 61 72 3B 0D 66 75 6E 63 |key : char;.func|
00000100: 74 69 6F 6E 20 67 61 6D 65 6F 76 65 72 20 3A 20 |tion gameover : |
00000110: 62 6F 6F 6C 65 61 6E 3B 0D 62 65 67 69 6E 20 67 |boolean;.begin g|
00000120: 61 6D 65 6F 76 65 72 20 3A 3D 20 28 70 69 6C 65 |ameover := (pile|
00000130: 20 5B 31 5D 20 2B 20 70 69 6C 65 20 5B 32 5D 20 | [1] + pile [2] |
00000140: 2B 20 70 69 6C 65 20 5B 33 5D 20 3D 20 30 29 20 |+ pile [3] = 0) |
00000150: 65 6E 64 3B 0D 66 75 6E 63 74 69 6F 6E 20 61 73 |end;.function as|
00000160: 63 20 28 6E 20 3A 20 69 6E 74 65 67 65 72 29 20 |c (n : integer) |
00000170: 3A 20 63 68 61 72 3B 0D 62 65 67 69 6E 20 61 73 |: char;.begin as|
00000180: 63 20 3A 3D 20 63 68 72 20 28 6E 2B 6F 72 64 20 |c := chr (n+ord |
00000190: 28 27 30 27 29 29 20 65 6E 64 3B 0D 70 72 6F 63 |('0')) end;.proc|
000001A0: 65 64 75 72 65 20 64 69 73 70 6C 61 79 3B 0D 20 |edure display;. |
000001B0: 20 20 20 20 20 20 20 76 61 72 20 20 20 20 20 70 | var p|
000001C0: 2C 20 72 6F 77 2C 20 63 6F 6C 2C 20 66 69 72 73 |, row, col, firs|
000001D0: 74 63 6F 6C 20 3A 20 69 6E 74 65 67 65 72 3B 0D |tcol : integer;.|
000001E0: 20 20 20 20 20 20 20 20 62 65 67 69 6E 0D 20 20 | begin. |
000001F0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 | pa|
00000200: 67 65 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 |ge;. |
00000210: 20 20 20 20 66 6F 72 20 70 20 3A 3D 20 31 20 74 | for p := 1 t|
00000220: 6F 20 33 20 64 6F 0D 20 20 20 20 20 20 20 20 20 |o 3 do. |
00000230: 20 20 20 20 20 20 20 20 20 20 20 62 65 67 69 6E | begin|
00000240: 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |. |
00000250: 20 20 20 20 20 20 20 20 20 66 69 72 73 74 63 6F | firstco|
00000260: 6C 20 3A 3D 20 70 2A 31 30 3B 0D 20 20 20 20 20 |l := p*10;. |
00000270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000280: 20 20 20 66 6F 72 20 72 6F 77 20 3A 3D 20 30 20 | for row := 0 |
00000290: 74 6F 20 4E 52 4F 57 53 2D 31 20 64 6F 20 0D 20 |to NROWS-1 do . |
000002A0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000002B0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 | i|
000002C0: 66 20 70 69 6C 65 20 5B 70 5D 20 3E 3D 20 4E 52 |f pile [p] >= NR|
000002D0: 4F 57 53 2D 72 6F 77 20 74 68 65 6E 20 0D 20 20 |OWS-row then . |
000002E0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000002F0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000300: 20 20 66 6F 72 20 63 6F 6C 20 3A 3D 20 66 69 72 | for col := fir|
00000310: 73 74 63 6F 6C 2B 33 20 74 6F 20 66 69 72 73 74 |stcol+3 to first|
00000320: 63 6F 6C 2B 35 20 64 6F 0D 20 20 20 20 20 20 20 |col+5 do. |
00000330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000350: 20 76 64 75 20 28 72 6F 77 2C 20 63 6F 6C 20 2C | vdu (row, col ,|
00000360: 20 63 68 72 20 28 43 4F 49 4E 29 29 3B 0D 20 20 | chr (COIN));. |
00000370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 | if|
00000390: 20 70 69 6C 65 20 5B 70 5D 20 3E 3D 20 31 30 20 | pile [p] >= 10 |
000003A0: 74 68 65 6E 20 0D 20 20 20 20 20 20 20 20 20 20 |then . |
000003B0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000003C0: 20 20 20 20 20 20 76 64 75 20 28 4E 52 4F 57 53 | vdu (NROWS|
000003D0: 2D 31 2C 20 66 69 72 73 74 63 6F 6C 2C 20 61 73 |-1, firstcol, as|
000003E0: 63 20 28 70 69 6C 65 5B 70 5D 20 64 69 76 20 31 |c (pile[p] div 1|
000003F0: 30 29 29 3B 0D 20 20 20 20 20 20 20 20 20 20 20 |0));. |
00000400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000410: 20 20 20 20 20 76 64 75 20 28 4E 52 4F 57 53 2D | vdu (NROWS-|
00000420: 31 2C 20 66 69 72 73 74 63 6F 6C 2B 31 2C 61 73 |1, firstcol+1,as|
00000430: 63 28 70 69 6C 65 5B 70 5D 20 6D 6F 64 20 31 30 |c(pile[p] mod 10|
00000440: 29 29 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 |));. |
00000450: 20 20 20 20 20 20 20 20 65 6E 64 3B 0D 20 20 20 | end;. |
00000460: 20 20 20 20 20 65 6E 64 3B 20 28 2A 20 64 69 73 | end; (* dis|
00000470: 70 6C 61 79 20 2A 29 0D 70 72 6F 63 65 64 75 72 |play *).procedur|
00000480: 65 20 73 69 67 6E 6F 6E 3B 0D 20 20 20 20 20 20 |e signon;. |
00000490: 20 20 62 65 67 69 6E 0D 20 20 20 20 20 20 20 20 | begin. |
000004A0: 20 20 20 20 20 20 20 20 70 61 67 65 3B 0D 20 20 | page;. |
000004B0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 | wr|
000004C0: 69 74 65 6C 6E 20 28 27 20 20 20 20 20 20 20 20 |iteln (' |
000004D0: 20 20 20 20 20 20 20 20 20 20 2A 2A 2A 20 20 4E | *** N|
000004E0: 49 4D 20 20 2A 2A 2A 27 29 3B 0D 20 20 20 20 20 |IM ***');. |
000004F0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 | write|
00000500: 6C 6E 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 |ln;. |
00000510: 20 20 20 20 77 72 69 74 65 6C 6E 3B 0D 20 20 20 | writeln;. |
00000520: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 | wri|
00000530: 74 65 6C 6E 20 28 27 20 20 49 20 77 69 6C 6C 20 |teln (' I will |
00000540: 73 65 74 20 75 70 20 74 68 72 65 65 20 70 69 6C |set up three pil|
00000550: 65 73 20 6F 66 20 63 6F 69 6E 73 2E 27 29 3B 0D |es of coins.');.|
00000560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000570: 77 72 69 74 65 6C 6E 20 28 27 54 6F 20 6D 6F 76 |writeln ('To mov|
00000580: 65 2C 20 74 61 6B 65 20 61 6E 79 20 6E 75 6D 62 |e, take any numb|
00000590: 65 72 20 6F 66 20 63 6F 69 6E 73 20 61 77 61 79 |er of coins away|
000005A0: 27 29 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 |');. |
000005B0: 20 20 20 20 77 72 69 74 65 6C 6E 20 28 27 66 72 | writeln ('fr|
000005C0: 6F 6D 20 61 6E 79 20 70 69 6C 65 2E 20 20 54 68 |om any pile. Th|
000005D0: 65 20 70 6C 61 79 65 72 20 77 68 6F 20 63 6C 65 |e player who cle|
000005E0: 61 72 73 20 74 68 65 27 29 3B 0D 20 20 20 20 20 |ars the');. |
000005F0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 | write|
00000600: 6C 6E 20 28 27 73 63 72 65 65 6E 20 77 69 6E 73 |ln ('screen wins|
00000610: 2E 20 27 29 3B 0D 20 20 20 20 20 20 20 20 20 20 |. ');. |
00000620: 20 20 20 20 20 20 77 72 69 74 65 6C 6E 3B 0D 20 | writeln;. |
00000630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 | w|
00000640: 72 69 74 65 20 28 27 20 20 4E 6F 77 20 68 69 74 |rite (' Now hit|
00000650: 20 61 6E 79 20 6B 65 79 20 74 6F 20 73 74 61 72 | any key to star|
00000660: 74 20 3A 20 27 29 3B 0D 20 20 20 20 20 20 20 20 |t : ');. |
00000670: 20 20 20 20 20 20 20 20 77 68 69 6C 65 20 67 65 | while ge|
00000680: 74 6B 65 79 20 3D 20 63 68 72 20 28 30 29 20 64 |tkey = chr (0) d|
00000690: 6F 3B 0D 20 20 20 20 20 20 20 20 65 6E 64 3B 20 |o;. end; |
000006A0: 28 2A 20 73 69 67 6E 6F 6E 20 2A 29 0D 70 72 6F |(* signon *).pro|
000006B0: 63 65 64 75 72 65 20 68 69 73 6D 6F 76 65 3B 20 |cedure hismove; |
000006C0: 0D 20 20 20 20 20 20 20 20 76 61 72 20 20 20 20 |. var |
000006D0: 20 6F 6B 20 3A 20 62 6F 6F 6C 65 61 6E 3B 0D 20 | ok : boolean;. |
000006E0: 20 20 20 20 20 20 20 62 65 67 69 6E 0D 20 20 20 | begin. |
000006F0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 | wri|
00000700: 74 65 6C 6E 20 28 27 4E 6F 77 20 65 6E 74 65 72 |teln ('Now enter|
00000710: 20 79 6F 75 72 20 6D 6F 76 65 20 3A 27 29 3B 0D | your move :');.|
00000720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000730: 77 69 74 68 20 6D 6F 76 65 20 64 6F 20 72 65 70 |with move do rep|
00000740: 65 61 74 0D 20 20 20 20 20 20 20 20 20 20 20 20 |eat. |
00000750: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 | writ|
00000760: 65 6C 6E 3B 0D 20 20 20 20 20 20 20 20 20 20 20 |eln;. |
00000770: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 | wri|
00000780: 74 65 20 28 27 50 69 6C 65 20 28 31 20 74 6F 20 |te ('Pile (1 to |
00000790: 33 29 20 3F 20 27 29 3B 0D 20 20 20 20 20 20 20 |3) ? ');. |
000007A0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000007B0: 20 72 65 61 64 20 28 70 69 6C 65 6E 6F 29 3B 0D | read (pileno);.|
000007C0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000007D0: 20 20 20 20 20 20 20 20 6F 6B 20 3A 3D 20 70 69 | ok := pi|
000007E0: 6C 65 6E 6F 20 69 6E 20 5B 31 2E 2E 33 5D 3B 0D |leno in [1..3];.|
000007F0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000800: 20 20 20 20 20 20 20 20 69 66 20 6F 6B 20 74 68 | if ok th|
00000810: 65 6E 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 |en. |
00000820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 | b|
00000830: 65 67 69 6E 0D 20 20 20 20 20 20 20 20 20 20 20 |egin. |
00000840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000850: 20 20 20 20 20 77 72 69 74 65 20 28 27 4E 75 6D | write ('Num|
00000860: 62 65 72 20 74 6F 20 74 61 6B 65 20 61 77 61 79 |ber to take away|
00000870: 20 3F 20 27 29 3B 0D 20 20 20 20 20 20 20 20 20 | ? ');. |
00000880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000890: 20 20 20 20 20 20 20 72 65 61 64 20 28 6E 74 61 | read (nta|
000008A0: 6B 65 6E 29 3B 0D 20 20 20 20 20 20 20 20 20 20 |ken);. |
000008B0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000008C0: 20 20 20 20 20 20 6F 6B 20 3A 3D 20 6E 74 61 6B | ok := ntak|
000008D0: 65 6E 20 69 6E 20 5B 31 2E 2E 70 69 6C 65 20 5B |en in [1..pile [|
000008E0: 70 69 6C 65 6E 6F 5D 5D 3B 0D 20 20 20 20 20 20 |pileno]];. |
000008F0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000900: 20 20 20 20 20 20 65 6E 64 3B 0D 20 20 20 20 20 | end;. |
00000910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000920: 20 20 20 69 66 20 6E 6F 74 20 6F 6B 20 74 68 65 | if not ok the|
00000930: 6E 20 77 72 69 74 65 6C 6E 20 28 27 57 68 61 74 |n writeln ('What|
00000940: 20 3F 3F 27 29 3B 0D 20 20 20 20 20 20 20 20 20 | ??');. |
00000950: 20 20 20 20 20 20 20 75 6E 74 69 6C 20 6F 6B 3B | until ok;|
00000960: 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |. |
00000970: 20 77 69 74 68 20 6D 6F 76 65 20 64 6F 20 70 69 | with move do pi|
00000980: 6C 65 20 5B 70 69 6C 65 6E 6F 5D 20 3A 3D 20 70 |le [pileno] := p|
00000990: 69 6C 65 20 5B 70 69 6C 65 6E 6F 5D 2D 6E 74 61 |ile [pileno]-nta|
000009A0: 6B 65 6E 3B 0D 20 20 20 20 20 20 20 20 65 6E 64 |ken;. end|
000009B0: 3B 20 20 28 2A 20 6F 66 20 68 69 73 6D 6F 76 65 |; (* of hismove|
000009C0: 20 2A 29 0D 70 72 6F 63 65 64 75 72 65 20 6D 79 | *).procedure my|
000009D0: 6D 6F 76 65 3B 0D 76 61 72 20 20 20 20 20 62 69 |move;.var bi|
000009E0: 74 20 3A 20 61 72 72 61 79 20 5B 31 2E 2E 33 2C |t : array [1..3,|
000009F0: 20 31 2E 2E 34 5D 20 6F 66 20 62 6F 6F 6C 65 61 | 1..4] of boolea|
00000A00: 6E 3B 0D 20 20 20 20 20 20 20 20 70 61 72 69 74 |n;. parit|
00000A10: 79 20 3A 20 61 72 72 61 79 20 5B 31 2E 2E 34 5D |y : array [1..4]|
00000A20: 20 6F 66 20 62 6F 6F 6C 65 61 6E 3B 0D 20 20 20 | of boolean;. |
00000A30: 20 20 20 20 20 66 69 72 73 74 62 69 74 2C 20 78 | firstbit, x|
00000A40: 2C 20 69 2C 20 6A 20 3A 20 69 6E 74 65 67 65 72 |, i, j : integer|
00000A50: 3B 0D 20 20 20 20 20 20 20 20 62 65 67 69 6E 0D |;. begin.|
00000A60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000A70: 66 6F 72 20 69 20 3A 3D 20 31 20 74 6F 20 33 20 |for i := 1 to 3 |
00000A80: 64 6F 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 |do. |
00000A90: 20 20 20 20 20 20 20 62 65 67 69 6E 0D 20 20 20 | begin. |
00000AA0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000AB0: 20 20 20 20 20 78 20 3A 3D 20 70 69 6C 65 20 5B | x := pile [|
00000AC0: 69 5D 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 |i];. |
00000AD0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6F 72 20 | for |
00000AE0: 6A 20 3A 3D 20 34 20 64 6F 77 6E 74 6F 20 31 20 |j := 4 downto 1 |
00000AF0: 64 6F 20 0D 20 20 20 20 20 20 20 20 20 20 20 20 |do . |
00000B00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000B10: 20 20 20 20 62 65 67 69 6E 0D 20 20 20 20 20 20 | begin. |
00000B20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000B30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000B40: 20 20 62 69 74 20 5B 69 2C 6A 5D 20 3A 3D 20 6F | bit [i,j] := o|
00000B50: 64 64 20 28 78 29 3B 0D 20 20 20 20 20 20 20 20 |dd (x);. |
00000B60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000B70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000B80: 78 20 3A 3D 20 78 20 64 69 76 20 32 3B 0D 20 20 |x := x div 2;. |
00000B90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000BA0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6E | en|
00000BB0: 64 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 |d;. |
00000BC0: 20 20 20 20 20 20 20 65 6E 64 3B 0D 20 20 20 20 | end;. |
00000BD0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6F 72 20 | for |
00000BE0: 69 20 3A 3D 20 31 20 74 6F 20 34 20 64 6F 20 70 |i := 1 to 4 do p|
00000BF0: 61 72 69 74 79 20 5B 69 5D 20 3A 3D 20 0D 20 20 |arity [i] := . |
00000C00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000C10: 20 20 20 20 20 20 62 69 74 20 5B 31 2C 69 5D 20 | bit [1,i] |
00000C20: 3C 3E 20 28 62 69 74 20 5B 32 2C 69 5D 20 3C 3E |<> (bit [2,i] <>|
00000C30: 20 62 69 74 20 5B 33 2C 69 5D 29 3B 0D 20 20 20 | bit [3,i]);. |
00000C40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6D 6F 76 | mov|
00000C50: 65 2E 70 69 6C 65 6E 6F 20 3A 3D 20 31 3B 0D 20 |e.pileno := 1;. |
00000C60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6D | m|
00000C70: 6F 76 65 2E 6E 74 61 6B 65 6E 20 3A 3D 20 30 3B |ove.ntaken := 0;|
00000C80: 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |. |
00000C90: 20 77 69 74 68 20 6D 6F 76 65 20 64 6F 0D 20 20 | with move do. |
00000CA0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000CB0: 20 20 20 20 20 20 69 66 20 6E 6F 74 20 28 70 61 | if not (pa|
00000CC0: 72 69 74 79 20 5B 31 5D 20 6F 72 20 70 61 72 69 |rity [1] or pari|
00000CD0: 74 79 5B 32 5D 20 6F 72 20 70 61 72 69 74 79 20 |ty[2] or parity |
00000CE0: 5B 33 5D 20 6F 72 0D 20 20 20 20 20 20 20 20 20 |[3] or. |
00000CF0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000D00: 20 70 61 72 69 74 79 20 5B 34 5D 29 20 74 68 65 | parity [4]) the|
00000D10: 6E 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |n. |
00000D20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000D30: 20 20 62 65 67 69 6E 0D 20 20 20 20 20 20 20 20 | begin. |
00000D40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000D50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000D60: 77 68 69 6C 65 20 70 69 6C 65 20 5B 70 69 6C 65 |while pile [pile|
00000D70: 6E 6F 5D 20 3D 20 30 20 64 6F 20 70 69 6C 65 6E |no] = 0 do pilen|
00000D80: 6F 20 3A 3D 0D 20 20 20 20 20 20 20 20 20 20 20 |o :=. |
00000D90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000DA0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000DB0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 69 6C | pil|
00000DC0: 65 6E 6F 2B 31 3B 0D 20 20 20 20 20 20 20 20 20 |eno+1;. |
00000DD0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000DE0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 | i|
00000DF0: 66 20 70 69 6C 65 20 5B 70 69 6C 65 6E 6F 5D 20 |f pile [pileno] |
00000E00: 3D 20 31 20 74 68 65 6E 20 20 6E 74 61 6B 65 6E |= 1 then ntaken|
00000E10: 20 3A 3D 31 0D 20 20 20 20 20 20 20 20 20 20 20 | :=1. |
00000E20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000E30: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6C 73 | els|
00000E40: 65 20 6E 74 61 6B 65 6E 20 3A 3D 20 72 61 6E 64 |e ntaken := rand|
00000E50: 6F 6D 20 6D 6F 64 20 28 70 69 6C 65 0D 20 20 20 |om mod (pile. |
00000E60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000E70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000E80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000E90: 20 20 20 20 20 20 20 20 20 20 20 20 20 5B 70 69 | [pi|
00000EA0: 6C 65 6E 6F 5D 2D 31 29 2B 31 3B 0D 20 20 20 20 |leno]-1)+1;. |
00000EB0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000EC0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6E 64 0D | end.|
00000ED0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000EE0: 20 20 20 20 20 20 20 20 65 6C 73 65 20 62 65 67 | else beg|
00000EF0: 69 6E 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 |in. |
00000F00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000F10: 20 20 20 66 69 72 73 74 62 69 74 20 3A 3D 20 31 | firstbit := 1|
00000F20: 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |;. |
00000F30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000F40: 20 20 77 68 69 6C 65 20 6E 6F 74 20 70 61 72 69 | while not pari|
00000F50: 74 79 20 5B 66 69 72 73 74 62 69 74 5D 20 64 6F |ty [firstbit] do|
00000F60: 20 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | . |
00000F70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000F80: 20 20 20 20 20 20 20 20 20 20 66 69 72 73 74 62 | firstb|
00000F90: 69 74 20 3A 3D 20 66 69 72 73 74 62 69 74 20 2B |it := firstbit +|
00000FA0: 20 31 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 | 1;. |
00000FB0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000FC0: 20 20 20 20 77 68 69 6C 65 20 6E 6F 74 20 62 69 | while not bi|
00000FD0: 74 20 5B 70 69 6C 65 6E 6F 20 2C 20 66 69 72 73 |t [pileno , firs|
00000FE0: 74 62 69 74 5D 20 64 6F 0D 20 20 20 20 20 20 20 |tbit] do. |
00000FF0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001010: 20 70 69 6C 65 6E 6F 20 3A 3D 20 70 69 6C 65 6E | pileno := pilen|
00001020: 6F 20 2B 20 31 3B 0D 20 20 20 20 20 20 20 20 20 |o + 1;. |
00001030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001040: 20 20 20 20 20 20 20 66 6F 72 20 69 20 3A 3D 20 | for i := |
00001050: 66 69 72 73 74 62 69 74 20 74 6F 20 34 20 64 6F |firstbit to 4 do|
00001060: 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |. |
00001070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001080: 20 20 20 20 20 62 65 67 69 6E 0D 20 20 20 20 20 | begin. |
00001090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000010A0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000010B0: 20 20 20 78 20 3A 3D 20 31 3B 0D 20 20 20 20 20 | x := 1;. |
000010C0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000010D0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000010E0: 20 20 20 66 6F 72 20 6A 20 3A 3D 20 33 20 64 6F | for j := 3 do|
000010F0: 77 6E 74 6F 20 69 20 64 6F 20 78 20 3A 3D 20 78 |wnto i do x := x|
00001100: 2A 32 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 |*2;. |
00001110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001120: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 70 | if p|
00001130: 61 72 69 74 79 20 5B 69 5D 20 74 68 65 6E 0D 20 |arity [i] then. |
00001140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001160: 20 20 20 20 20 20 20 69 66 20 62 69 74 20 5B 70 | if bit [p|
00001170: 69 6C 65 6E 6F 2C 20 69 5D 20 74 68 65 6E 20 6E |ileno, i] then n|
00001180: 74 61 6B 65 6E 20 3A 3D 0D 20 20 20 20 20 20 20 |taken :=. |
00001190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000011A0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000011B0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000011C0: 20 6E 74 61 6B 65 6E 20 2B 20 78 0D 20 20 20 20 | ntaken + x. |
000011D0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000011E0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000011F0: 20 20 20 20 65 6C 73 65 20 6E 74 61 6B 65 6E 20 | else ntaken |
00001200: 3A 3D 20 6E 74 61 6B 65 6E 20 2D 20 78 3B 0D 20 |:= ntaken - x;. |
00001210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001230: 20 20 20 65 6E 64 3B 0D 20 20 20 20 20 20 20 20 | end;. |
00001240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001250: 65 6E 64 3B 0D 20 20 20 20 20 20 20 20 20 20 20 |end;. |
00001260: 20 20 20 20 20 77 69 74 68 20 6D 6F 76 65 20 64 | with move d|
00001270: 6F 20 70 69 6C 65 20 5B 70 69 6C 65 6E 6F 5D 20 |o pile [pileno] |
00001280: 3A 3D 20 70 69 6C 65 20 5B 70 69 6C 65 6E 6F 5D |:= pile [pileno]|
00001290: 20 2D 20 6E 74 61 6B 65 6E 3B 0D 20 20 20 20 20 | - ntaken;. |
000012A0: 20 20 20 65 6E 64 3B 20 28 2A 20 6F 66 20 6D 79 | end; (* of my|
000012B0: 6D 6F 76 65 20 2A 29 0D 62 65 67 69 6E 0D 20 20 |move *).begin. |
000012C0: 20 20 20 20 20 20 73 69 67 6E 6F 6E 3B 0D 20 20 | signon;. |
000012D0: 20 20 20 20 20 20 72 65 70 65 61 74 0D 20 20 20 | repeat. |
000012E0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6F 72 | for|
000012F0: 20 69 20 3A 3D 20 31 20 74 6F 20 33 20 64 6F 20 | i := 1 to 3 do |
00001300: 70 69 6C 65 20 5B 69 5D 20 3A 3D 20 72 61 6E 64 |pile [i] := rand|
00001310: 6F 6D 20 6D 6F 64 20 31 30 20 2B 20 36 3B 0D 20 |om mod 10 + 6;. |
00001320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 | d|
00001330: 69 73 70 6C 61 79 3B 0D 20 20 20 20 20 20 20 20 |isplay;. |
00001340: 20 20 20 20 20 20 20 20 72 65 70 65 61 74 0D 20 | repeat. |
00001350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001360: 20 20 20 20 20 20 20 68 69 73 6D 6F 76 65 3B 0D | hismove;.|
00001370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001380: 20 20 20 20 20 20 20 20 69 66 20 67 61 6D 65 6F | if gameo|
00001390: 76 65 72 20 74 68 65 6E 20 77 72 69 74 65 6C 6E |ver then writeln|
000013A0: 20 28 27 43 6F 6E 67 72 61 74 75 6C 61 74 69 6F | ('Congratulatio|
000013B0: 6E 73 2E 2E 2E 27 2C 0D 20 20 20 20 20 20 20 20 |ns...',. |
000013C0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000013D0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000013E0: 20 20 20 20 20 20 20 20 27 20 79 6F 75 20 77 69 | ' you wi|
000013F0: 6E 20 21 27 29 0D 20 20 20 20 20 20 20 20 20 20 |n !'). |
00001400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6C | el|
00001410: 73 65 20 62 65 67 69 6E 0D 20 20 20 20 20 20 20 |se begin. |
00001420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001430: 20 20 20 20 20 20 20 20 20 64 69 73 70 6C 61 79 | display|
00001440: 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |;. |
00001450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001460: 20 20 6D 79 6D 6F 76 65 3B 0D 20 20 20 20 20 20 | mymove;. |
00001470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001480: 20 20 20 20 20 20 20 20 20 20 66 6F 72 20 69 20 | for i |
00001490: 3A 3D 20 31 20 74 6F 20 64 65 6C 61 79 20 64 6F |:= 1 to delay do|
000014A0: 20 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 | ;. |
000014B0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000014C0: 20 20 20 64 69 73 70 6C 61 79 3B 0D 20 20 20 20 | display;. |
000014D0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000014E0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 | writ|
000014F0: 65 6C 6E 20 28 27 4D 79 20 6D 6F 76 65 20 77 61 |eln ('My move wa|
00001500: 73 27 2C 20 6D 6F 76 65 2E 6E 74 61 6B 65 6E 20 |s', move.ntaken |
00001510: 3A 20 33 2C 0D 20 20 20 20 20 20 20 20 20 20 20 |: 3,. |
00001520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001530: 20 20 20 20 20 20 20 20 20 20 20 20 20 27 20 66 | ' f|
00001540: 72 6F 6D 20 70 69 6C 65 27 2C 20 6D 6F 76 65 2E |rom pile', move.|
00001550: 70 69 6C 65 6E 6F 3A 32 29 3B 0D 20 20 20 20 20 |pileno:2);. |
00001560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001570: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 67 61 | if ga|
00001580: 6D 65 6F 76 65 72 20 74 68 65 6E 20 77 72 69 74 |meover then writ|
00001590: 65 6C 6E 20 28 27 2A 2A 2A 20 49 20 77 69 6E 2E |eln ('*** I win.|
000015A0: 27 29 3B 0D 20 20 20 20 20 20 20 20 20 20 20 20 |');. |
000015B0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000015C0: 20 20 20 20 77 72 69 74 65 6C 6E 3B 0D 20 20 20 | writeln;. |
000015D0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
000015E0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 | wri|
000015F0: 74 65 6C 6E 3B 0D 20 20 20 20 20 20 20 20 20 20 |teln;. |
00001600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001610: 20 20 65 6E 64 3B 0D 20 20 20 20 20 20 20 20 20 | end;. |
00001620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 | u|
00001630: 6E 74 69 6C 20 67 61 6D 65 6F 76 65 72 3B 0D 20 |ntil gameover;. |
00001640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 | w|
00001650: 72 69 74 65 20 28 27 41 6E 6F 74 68 65 72 20 67 |rite ('Another g|
00001660: 61 6D 65 20 3F 20 27 29 3B 0D 20 20 20 20 20 20 |ame ? ');. |
00001670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00001680: 20 20 77 68 69 6C 65 20 69 6E 70 75 74 5E 20 3D | while input^ =|
00001690: 20 27 20 27 20 64 6F 20 67 65 74 20 28 69 6E 70 | ' ' do get (inp|
000016A0: 75 74 29 3B 0D 20 20 20 20 20 20 20 20 20 20 20 |ut);. |
000016B0: 20 20 20 20 20 72 65 61 64 20 28 6B 65 79 29 3B | read (key);|
000016C0: 0D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |. |
000016D0: 20 77 68 69 6C 65 20 6E 6F 74 20 65 6F 6C 6E 20 | while not eoln |
000016E0: 64 6F 20 67 65 74 20 28 69 6E 70 75 74 29 3B 0D |do get (input);.|
000016F0: 20 20 20 20 20 20 20 20 75 6E 74 69 6C 20 6B 65 | until ke|
00001700: 79 20 3D 20 27 6E 27 3B 0D 70 61 67 65 3B 0D 65 |y = 'n';.page;.e|
00001710: 6E 64 2E 0D |nd.. |
PROGRAM NIM (INPUT, OUTPUT);.CONST NR
OWS = 25;. DELAY = 1000;.
COIN = 168;.VAR PILE : ARRAY [1..3]
OF 0..NROWS;. MOVE : RECORD.
NTAKEN, PILENO : INTEGER;.
END;. I : INTEGER;.
KEY : CHAR;.FUNCTION GAMEOVER : BOOLEAN;
.BEGIN GAMEOVER := (PILE [1] + PILE [2]
+ PILE [3] = 0) END;.FUNCTION ASC (N : I
NTEGER) : CHAR;.BEGIN ASC := CHR (N+ORD
('0')) END;.PROCEDURE DISPLAY;. V
AR P, ROW, COL, FIRSTCOL : INTEGER;.
BEGIN. PAGE;.
FOR P := 1 TO 3 DO.
BEGIN.
FIRSTCOL := P*10;.
FOR ROW := 0 TO NROWS-1 DO .
IF PILE [P] >= NR
OWS-ROW THEN .
FOR COL := FIRSTCOL+3 TO FIRST
COL+5 DO.
VDU (ROW, COL , CHR (COIN));.
IF PILE [P
] >= 10 THEN .
VDU (NROWS-1, FIRSTCOL, ASC (PILE[
P] DIV 10));.
VDU (NROWS-1, FIRSTCOL+1,ASC(PILE[P
] MOD 10));. END;.
END; (* DISPLAY *).PROCEDURE SIGNON
;. BEGIN. PAGE;.
WRITELN ('
*** NIM ***');. WRITE
LN;. WRITELN;.
WRITELN (' I WILL SET UP THREE PIL
ES OF COINS.');. WRITELN
('TO MOVE, TAKE ANY NUMBER OF COINS AWAY
');. WRITELN ('FROM ANY P
ILE. THE PLAYER WHO CLEARS THE');.
WRITELN ('SCREEN WINS. ');.
WRITELN;. W
RITE (' NOW HIT ANY KEY TO START : ');.
WHILE GETKEY = CHR (0) D
O;. END; (* SIGNON *).PROCEDURE H
ISMOVE; . VAR OK : BOOLEAN;.
BEGIN. WRITELN ('N
OW ENTER YOUR MOVE :');.
WITH MOVE DO REPEAT.
WRITELN;. WRI
TE ('PILE (1 TO 3) ? ');.
READ (PILENO);.
OK := PILENO IN [1..3];.
IF OK THEN.
BEGIN.
WRITE ('NUMBER TO TAKE AWAY
? ');. R
EAD (NTAKEN);.
OK := NTAKEN IN [1..PILE [PILENO]]
;. END;.
IF NOT OK THEN WRITEL
N ('WHAT ??');. UNTIL OK;
. WITH MOVE DO PILE [PILE
NO] := PILE [PILENO]-NTAKEN;. END
; (* OF HISMOVE *).PROCEDURE MYMOVE;.VA
R BIT : ARRAY [1..3, 1..4] OF BOOLEA
N;. PARITY : ARRAY [1..4] OF BOOL
EAN;. FIRSTBIT, X, I, J : INTEGER
;. BEGIN. FOR I :=
1 TO 3 DO. BEGIN.
X := PILE [I];.
FOR J := 4 DOWNTO 1
DO . BEGI
N.
BIT [I,J] := ODD (X);.
X := X DIV 2;.
END;.
END;. FOR
I := 1 TO 4 DO PARITY [I] := .
BIT [1,I] <> (BIT [2,I] <>
BIT [3,I]);. MOVE.PILENO
:= 1;. MOVE.NTAKEN := 0;
. WITH MOVE DO.
IF NOT (PARITY [1] OR PARI
TY[2] OR PARITY [3] OR.
PARITY [4]) THEN.
BEGIN.
WHILE PILE [PILE
NO] = 0 DO PILENO :=.
PIL
ENO+1;.
IF PILE [PILENO] = 1 THEN NTAKEN
:=1.
ELSE NTAKEN := RANDOM MOD (PILE.
[PILENO]-1)+1;.
END.
ELSE BEGIN.
FIRSTBIT := 1;.
WHILE NOT PARI
TY [FIRSTBIT] DO .
FIRSTBIT := FIRSTBIT +
1;. WHIL
E NOT BIT [PILENO , FIRSTBIT] DO.
PILENO
:= PILENO + 1;.
FOR I := FIRSTBIT TO 4 DO.
BEGIN.
X :=
1;.
FOR J := 3 DOWNTO I DO X := X*2;.
IF P
ARITY [I] THEN.
IF BIT [PILENO, I] THEN N
TAKEN :=.
NTAKEN + X.
ELSE
NTAKEN := NTAKEN - X;.
END;.
END;. WITH MOVE D
O PILE [PILENO] := PILE [PILENO] - NTAKE
N;. END; (* OF MYMOVE *).BEGIN.
SIGNON;. REPEAT.
FOR I := 1 TO 3 DO PILE [I] := RAND
OM MOD 10 + 6;. DISPLAY;.
REPEAT.
HISMOVE;.
IF GAMEOVER THEN WRITELN ('CONGRATULATIO
NS...',.
' YOU WIN !').
ELSE BEGIN.
DISPLAY;.
MYMOVE;.
FOR I := 1 TO DELAY DO
;. DISPL
AY;. WRIT
ELN ('MY MOVE WAS', MOVE.NTAKEN : 3,.
' F
ROM PILE', MOVE.PILENO:2);.
IF GAMEOVER THEN WRIT
ELN ('*** I WIN.');.
WRITELN;.
WRITELN;.
END;. U
NTIL GAMEOVER;. WRITE ('A
NOTHER GAME ? ');.
WHILE INPUT^ = ' ' DO GET (INPUT);.
READ (KEY);.
WHILE NOT EOLN DO GET (INPUT);.
UNTIL KEY = 'N';.PAGE;.END..
×
C64 Image
> CLICK IMAGE PREVIEW FOR FULL MODAL