-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathhex.bas
More file actions
80 lines (80 loc) · 4.1 KB
/
hex.bas
File metadata and controls
80 lines (80 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
1 ! BY JEFF DALTON, CLASS OF '74, NORTHFIELD MOUNT HERMON SCHOOL
2 ! THIS PROGRAM PLAYS THE GAME 'HEXAPAWN' BY A METHOD OUTLINED IN
'MATHEMATICAL GAMES' IN MARCH 1962 SCIENTIFIC AMERICAN.
3 ! THE PROGRAM LEARNS BY ELIMINATION OF BAD MOVES. ALL POSITIONS
ENCOUNTERED BY THE PROGRAM AND THE ACCEPTABLE MOVES FROM THEM
ARE STORED IN P$(I%)
4 ! WHEN THE PROGRAM ENCOUNTERS AN UNFAMILIAR POSITION, THE POSITION
AND ALL LEGAL MOVES FROM IT ARE ADDED TO THE LIST.
5 ! IF THE PROGRAM LOSES A GAME, IT ERASES THE MOVE THAT LED TO DEFEAT.
IF IT HITS A POSITION FROM WHICH ALL MOVES HAVE BEEN DELETED
( THEY ALL LED TO DEFEAT ), IT ERASES THE MOVE THAT GOT
IT HERE AND RESIGNS.
10 INPUT "INSTRUCTIONS"; C$: IF LEFT$(C$,1)<>"Y" THEN 110
20 &: &,"THIS PROGRAM PLAYS THE GAME OF HEXAPAWN.":&
"HEXAPAWN IS PLAYED WITH CHESS PAWNS ON A 3 BY 3 BOARD. THE PAWNS ARE":&
"MOVED AS IN CHESS - ONE SPACE FORWARD TO AN EMPTY SPACE OR ONE SPACE"
30 &"FORWARD AND DIAGONALLY TO CAPTURE AN OPPOSING MAN.":&:&CHR(9%);
"O THE BOARD, YOUR PAWNS ARE 'O', THE COMPUTER'S PAWNS ARE '*',":&
"AND EMPTY SQUARES ARE '-'. TO ENTER A MOVE, TYPE THE NUMBER OF THE"
40 &"SQUARE YOU WILL MOVE FROM FOLLOWED BY THE NUMBER OF THE SQUARE":&
"YOU WILL MOVE TO. (THE NUMBERS ARE SEPARATED BY A COMMA.)":&
50 &" THE PROGRAM STARTS A SERIS OF GAMES KNOWING ONLY WHEN THE":&
"GAME IS WON (A DRAW IS IMPOSSIBLE) AND HOW TO MOVE. IT HAS NO":&
"STRATEGY AT FIRST AND JUST MOVES RANDOMLY. HOWEVER, IT LEARNS"
60 &"FROM EACH GAME. THUS, DEFEATING IT BECOMES MORE AND MORE":&
"DIFFICULT. ALSO, TO HELP OFFSET YOUR INITIAL ADVANTAGE, YOU WILL":&
"NOT BE TOLD HOW TO WIN THE GAME BUT MUST LEARN THIS BY PLAYING.":&
100 DEF FNC$(X$,X%,Y$)=LEFT(X$,X%-1%)+Y$+RIGHT(X$,X%+LEN(Y$))
105 DEF FNN$(X%): X$=NUM$(X$): FNN$=MID(X$,2%,LEN(X$)-2): FNEND
110 DIM P$(50%): RANDOMIZE: Q%=0%:
PRINT "SINCE I'M A GOOD SPORT, YOU'LL ALWAYS GO FIRST
120 P%=0%: P$="****---OOO": &: &"NUMBERING:"
&"123": &"456": &"789": &
190 D%=-1%: Q$="O": GOSUB 2000: IF M$="" THEN
PRINT "YOU CAN'T MOVE. I WIN.": GOTO 510
200 &: &"BOARD::": &LEFT(P$,3%): &MID(P$,4%,3%): &RIGHT(P$,7): &
210 INPUT "WHAT IS YOUR MOVE"; A%,B%:
IF INSTR(1%,M$,FNN(A$)+FNN(B%))=0% THEN
PRINT "ILLEGAL MOVE.": GOTO 210
230 P$=FNC$(FNC$(P$,A$,"-"),B%,"O"):
IF INSTR(1%,P$,"*")=0% OR INSTR(1%,P$,"O")<4% THEN
PRINT "YOU WIN.": GOTO 500
300 P%=P%+2% ! COMPUTER'S MOVE
310 FOR C%=1% TO Q%: C%=PS(C%): IF VAL(LEFT(C$,1%))=P% AND
MID(C$,2%,9)=P$ THEN M$=RIGHT(C$,1%): GOTO 400
320 NEXT C: Q$="*": D%=1%: GOSUB 2000: C%=Q%:
IF M$="" THEN PRINT "I CAN'T MOVE, YOU WIN.": GOTO 500
400 IF M$="" THEN PRINT "I RESIGN.": GOTO 500
410 K$=LEFT(M$,2%): M$=RIGHT(M$,3%):
IF RND>.33333333 AND MS<>"" THEN 410
420 K%=C%: A%=VAL(LEFT(K$,1%)): B$=VAL(RIGHT(K$,2%)):
P$=FNC$(FNC$(P$,A%,"-"),B%,"*")
430 IF INSTR(1%,P$,"O")=0 OR INSTR(7%,P$,"*") THEN
PRINT "I WIN!": GOTO 510
440 PRINT "I MOVE FROM" A% "TO" B%: GOTO 190
500 W2%=W2%+1%: I%=INSTR(11%,P$(K%),K%):
P$(K%)=LEFT(P$(K%),I%-1%)+RIGHT(P$(K%),I%+2%) IF I%: GOTO 520
510 W1%=W1%+1%
520 &: &"BOARD:": &LEFT(P$,3%): &MID(P$,4%,3%): &RIGHT(P$,7%): &:
& "I HAVE WON" W1% "AND YOU HAVE WON" W2% "OF" W1%+W2% "GAMES"
530 INPUT "ANOTHER GAME"; C$: IF C$="NO" THEN 9999 ELSE 120
900 ! DATA**= <- OF MOVE IN GAME><POSITION><LIST OF MOVES>
IN <POSITION>, -=BLANK, *=COMPUTER'S PAWN, O=PLAYER'S PAWN
<LIST OF MOVES> IS <- MOVE FROM><- MOVE TO><LIST OF MOVES>
2000 M$=""
2010 FOR J%=1% TO 9%: IF MID(P$,J%,1%)<>Q$ THEN 2050
2015 T%=J%+D%*3%: IF T%<1% OR T%>9% THEN 2025
2020 IF MID(P$,T%,1%)="-" THEN
M$=M$+FNN$(J%)+FNN$(T%)
2025 T%=J%+D%*2%: IF T%<1% OR T%>9% OR
(D%=1% AND (J%=1% OR J%=4% OR J%=7%)) OR
(D%=-1% AND (J%=3% OR J%=6% OR J%=9%)) THEN 2035
2030 IF INSTR(1%,Q$+"-",MID(P$,T%,1%))=0% THEN
M$=M$+FNN$(J%)+FNN$(T%)
2035 T%=J%+D%*4%: IF T%<1% OR T%>9% OR J%=3% OR J%=7% THEN 2050
2060 IF INSTR(1%,Q$+"-",MID(P$,T%,1%))=0% THEN
M$=M$+FNN$(J%)+FNN$(T%)
2070 NEXT J%: IF D%=1% AND MS$>"" THEN Q%=Q%+1%: P$(Q%)=FNN$(P$)+P$+M$
2080 RETURN
9999 END