home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpmug
/
cpmug026.ark
/
OTHELLO.FOR
< prev
next >
Wrap
Text File
|
1984-04-29
|
12KB
|
413 lines
INTEGER B(10,10),DIR(30,8),CHT(8)
INTEGER MOVEI,MOVEJ
DIMENSION DRSPON(4),IAA(8),JAA(8),MOVESI(30)
+,MOVESJ(30),LC(30),NFLIP(30)
COMMON /OCOMMN/ OC
DATA DRSPON/'YES','NO','Y','N'/
DATA IAA/-1,-1,-1,0,1,1,1,0/
DATA JAA/-1,0,1,1,1,0,-1,-1/
DATA CHT/'A','B','C','D','E','F','G','H'/
JFLAG=0
22 DO 10 I=1,10
DO 10 J=1,10
B(I,J)=0
IF(I.EQ.1.OR.I.EQ.10)B(I,J)=100
10 IF(J.EQ.1.OR.J.EQ.10)B(I,J)=100
B(5,5)=1
B(5,6)=-1
B(6,5)=-1
B(6,6)=1
WRITE(1,601)
601 FORMAT(////////////////////////,
+1X,'"OTHELLO" - DO YOU WISH TO GO FIRST ?'
+,/,1X,'YOU ARE "X" IF YOU ARE FIRST. ')
READ(1,876)RESPON
876 FORMAT(A3)
OC=1
IF(RESPON.EQ.DRSPON(2))GOTO 11
IF(RESPON.EQ.DRSPON(4))GOTO 11
CALL HANDIC(OC,B,DRSPON,NHD)
NM=NHD
CALL BOARDP(B,NM,NHD)
8 IF(NM.EQ.60)GOTO 15
CALL MOVEG(B,-OC,NM,MOVESI,MOVESJ,DIR,LC,JAA,IAA,
+IM,NOMVE,NFLIP)
IF(IM.EQ.0)GOTO 12
WRITE(1,713)
713 FORMAT(46X,'WHAT IS YOUR MOVE ? ')
IF(JFLAG.GT.0)GOTO 14
WRITE(1,714)
714 FORMAT(1X,'EXAMPLE - UPPER LEFT CORNER IS A1 ')
JFLAG=1.
14 READ(1,678)MOVEI,MOVEJ
678 FORMAT(A1,I1)
MOVEI=MOVEI-1HA+2
MOVEJ=MOVEJ+1
DO 9 I=1,IM
IF(MOVESI(I).EQ.MOVEI.AND.MOVESJ(I).EQ.MOVEJ)GOTO 13
9 CONTINUE
WRITE(1,701)
701 FORMAT(1X,'MOVE INVALID. PLEASE RE-ENTER. ')
GOTO 14
13 NM=NM+1
CALL BOARDC(MOVESI,MOVESJ,I,IAA,JAA,B,-OC,DIR,LC)
CALL BOARDP(B,NM,NHD)
GOTO 2
11 OC=-1
CALL HANDIC(OC,B,DRSPON,NHD)
B(5,7)=1
B(5,6)=1
NM=NHD+1
CALL BOARDP(B,NM,NHD)
GOTO 8
12 WRITE(1,756)
756 FORMAT(1X,'I SEE NO MOVE FOR YOU, SO I WILL MOVE IF I CAN')
2 IF(NM.EQ.60)GOTO 15
CALL MOVEG(B,OC,NM,MOVESI,MOVESJ,DIR,LC,JAA,IAA,
+IM,NOMVE,NFLIP)
IF(IM.EQ.0)GOTO 20
CALL MOVEE(B,OC,NM,MOVESI,MOVESJ,NFLIP,DIR,LC,IM,IF,IAA,JAA)
MOVEI=MOVESI(IF)-2+1HA
MOVEJ=MOVESJ(IF)-1
WRITE(1,603)MOVEI,MOVEJ
603 FORMAT(46X,'MY MOVE IS : ',A1,I1)
CALL BOARDC(MOVESI,MOVESJ,IF,IAA,JAA,B,OC,DIR,LC)
NM=NM+1
CALL BOARDP(B,NM,NHD)
GOTO 8
20 WRITE(1,602)
602 FORMAT(1X,'DO YOU HAVE A MOVE? ')
READ(1,876)RESPON
IF(RESPON.EQ.DRSPON(1))GOTO 8
IF(RESPON.EQ.DRSPON(3))GOTO 8
IF(IM.NE.0)GOTO 2
15 CALL COUNT(B,OC,NOC)
CALL COUNT(B,-OC,NC)
IF(NOC.LE.NC)GOTO 900
WRITE(1,610)
610 FORMAT(/,1X,'CONGRATULATIONS, YOU PLAYED WELL AND HAVE WON.'
+,1X,'THANK YOU FOR A FINE GAME.')
GOTO 920
900 IF(NOC.EQ.NC)GOTO 910
WRITE(1,611)
611 FORMAT(/,1X,'YOU PLAYED WELL; HOWEVER, YOUR LUCK WAS BAD AND'
+,1X,'I HAVE WON. THANK YOU FOR A FINE GAME.')
GOTO 920
910 WRITE(1,612)
612 FORMAT(/,1X,'YOU PLAYED WELL AND WE HAVE TIED. I WAS LUCKY.'
+,1X,'THANK YOU FOR A FINE GAME.')
920 WRITE(1,613)
613 FORMAT(/,1X,'DO YOU WISH TO PLAY AGAIN? ')
READ(1,876)RESPON
IF(RESPON.EQ.DRSPON(1))GOTO 22
IF(RESPON.EQ.DRSPON(3))GOTO 22
STOP
END
SUBROUTINE MOVEG(B,OC,NM,MOVESI,MOVESJ,DIR,LC,JAA,IAA,IM
+,NOMVE,NFLIP)
INTEGER B(10,10),DIR(30,8)
DIMENSION MOVESI(30),MOVESJ(30),LC(30),NFLIP(30)
+,IAA(1),JAA(1)
COMMON /OCOMMN/ OCA
DO 1 I=1,30
LC(I)=0
1 NFLIP(I)=0
IM=0
DO 20 I=2,9
DO 20 J=2,9
IF(B(I,J).NE.0)GOTO 20
IC=0
DO 5 L=1,8
IA=IAA(L)
JA=JAA(L)
IAT=I+IA
JAT=J+JA
IF(B(IAT,JAT).NE.OC)GOTO 5
IV=1
4 IV=IV+1
MVI=I+IV*IA
MVJ=J+IV*JA
IF(B(MVI,MVJ).EQ.0)GOTO 5
IF(B(MVI,MVJ).EQ.100)GOTO 5
IF(B(MVI,MVJ).EQ.OC)GOTO 4
IF(IC.EQ.1)GOTO 12
IM=IM+1
IC=1
12 NFLIP(IM)=NFLIP(IM)+IV
LC(IM)=LC(IM)+1
LDX=LC(IM)
DIR(IM,LDX)=L
5 CONTINUE
IF(IC.EQ.0)GOTO 20
MOVESI(IM)=I
MOVESJ(IM)=J
20 CONTINUE
IF(IM.GT.0)GOTO 30
IF(OCA.NE.OC)GOTO 30
WRITE(1,100)
100 FORMAT(1X,'I HAVE NO MOVE AND MUST PASS.')
30 RETURN
END
SUBROUTINE BOARDP(B,NM,NHD)
DIMENSION OUT(3),POUT(10,10)
INTEGER B(10,1),CHT(8)
COMMON /OCOMMN/ OCA
DATA OUT/'O','-','X'/
DATA CHT/'A','B','C','D','E','F','G','H'/
NMP=NM-NHD
TOC=OCA
CALL COUNT(B,TOC,NOC)
TOC=0-TOC
CALL COUNT(B,TOC,NC)
WRITE(1,100)NMP,NOC,NC
100 FORMAT(6X,'BOARD POSITION AFTER ',I2,' MOVES'
+,' YOU HAVE ',I2,' PIECES, I HAVE ',I2,/)
WRITE(1,101)
101 FORMAT(24X,' 1 2 3 4 5 6 7 8')
DO 9 I=2,9
DO 9 J=2,9
IS=B(I,J)+2
9 POUT(I,J)=OUT(IS)
DO 10 I=2,9
I1=I-1
10 WRITE(1,104)CHT(I1),(POUT(I,J),J=2,9)
104 FORMAT(24X,A1,2X,8(A1,1X))
RETURN
END
SUBROUTINE COUNT(B,OC,NOC)
INTEGER B(10,1)
NOC=0
DO 10 I=2,9
DO 10 J=2,9
IF(B(I,J).NE.OC)GOTO 10
NOC=NOC+1
10 CONTINUE
RETURN
END
SUBROUTINE BOARDC(MOVESI,MOVESJ,IF,IAA,JAA,B,OC,DIR,LC)
INTEGER B(10,10),DIR(30,8)
DIMENSION MOVESI(30),MOVESJ(30),IAA(1),JAA(1),LC(30)
MI=MOVESI(IF)
MJ=MOVESJ(IF)
B(MI,MJ)=-OC
NDIR=LC(IF)
DO 40 I=1,NDIR
L=DIR(IF,I)
IA=IAA(L)
JA=JAA(L)
IV=0
31 IV=IV+1
MVI=MI+IV*IA
MVJ=MJ+IV*JA
IF(B(MVI,MVJ).EQ.-OC)GOTO 40
B(MVI,MVJ)=-OC
GOTO 31
40 CONTINUE
RETURN
END
SUBROUTINE MOVEE(B,OC,NM,MOVESI,MOVESJ,NFLIP,DIR,LC
+,IM,IF,IAA,JAA)
INTEGER B(10,1),DIR(30,1),BT(10,10),BTT(10,10),DIRB(20,8)
+,BTTS(9,9,20),DIRBB(20,8)
DIMENSION MOVESI(1),MOVESJ(1),LC(1),NFLIP(1),MBI(20),MBJ(20)
+,LCB(20),NFLIPB(30),IAA(1),JAA(1),IY(24),JY(24)
+,IMID(24),JMID(24),ID(24),JD(24),NCORNI(4),NCORNJ(4)
+,MBBI(20),MBBJ(20),LCBB(20),NFLIB(30)
DATA NCORNI,NCORNJ/2,2,9,9,2,9,9,2/
DATA ID,JD/3,4,5,6,7,8,6*9,8,7,6,5,4,3,12*2,3,4,5,6,7,8
+,6*9,8,7,6,5,4,3/
DATA IY,JY/5,1,3,8,1,6,9,1,9,9,1,9,6,1,8,3,1,5,2,1,2,2,1,2
+,2,1,2,2,1,2,5,1,3,8,1,6,9,1,9,9,1,9,6,1,8,3,1,5/
DATA IMID,JMID/4,1,4,7,1,7,9,1,9,9,1,9,7,1,7,4,1,4,2,1,2
+,2,1,2,2,1,2,2,1,2,4,1,4,7,1,7,9,1,9,9,1,9,7,1,7,4,1,4/
ICO=0
IF=1
IF(NM.EQ.59)GOTO 20
10 DO 12 I=1,IM
MI=MOVESI(I)
MJ=MOVESJ(I)
IF(MI.NE.3.AND.MI.NE.8)GOTO 13
IF(MJ.NE.3.AND.MJ.NE.8)GOTO 13
IF(MI.EQ.3.AND.MJ.EQ.3)IC=1
IF(MI.EQ.3.AND.MJ.EQ.8)IC=2
IF(MI.EQ.8.AND.MJ.EQ.8)IC=3
IF(MI.EQ.8.AND.MJ.EQ.3)IC=4
NCI=NCORNI(IC)
NCJ=NCORNJ(IC)
IF(B(NCI,NCJ).EQ.0)NFLIP(I)=NFLIP(I)-50
13 IF(MI.NE.2.AND.MI.NE.9)GOTO 11
IF(MJ.NE.2.AND.MJ.NE.9)GOTO 11
ICO=ICO+1
NFLIP(I)=NFLIP(I)+60
11 IF(MI.LE.3.OR.MI.GE.8)GOTO 2
IF(MJ.LE.3.OR.MJ.GE.8)GOTO 2
NFLIP(I)=NFLIP(I)+10
GOTO 12
2 ND=LC(I)
DO 5 J=1,ND
L=DIR(I,J)
IA=IAA(L)
JA=JAA(L)
IV=1
4 IV=IV+1
MVI=MI+IV*IA
MVJ=MJ+IV*JA
IF(B(MVI,MVJ).EQ.OC)GOTO 4
6 IV=IV+1
MVI=MI+IV*IA
MVJ=MJ+IV*JA
IF(B(MVI,MVJ).EQ.OC)GOTO 8
IF(B(MVI,MVJ).NE.-OC)GOTO 5
GOTO 6
8 MIT=MI-IA
MJT=MJ-JA
IF(B(MIT,MJT).NE.0)GOTO 5
NFLIP(I)=NFLIP(I)-5
GOTO 12
5 CONTINUE
12 CONTINUE
DO 32 I=1,IM
NSUBO=0
MI=MOVESI(I)
MJ=MOVESJ(I)
IC=0
DO 33 K=1,10
DO 33 J=1,10
33 BT(K,J)=B(K,J)
LL=0
DO 56 J=1,24
IPP=ID(J)
JPP=JD(J)
IF(MOVESI(I).NE.IPP.OR.MOVESJ(I).NE.JPP)GOTO 56
LL=J
56 CONTINUE
CALL BOARDC(MOVESI,MOVESJ,I,IAA,JAA,BT,OC,DIR,LC)
CALL MOVEG(BT,-OC,NM,MBI,MBJ,DIRB,LCB,JAA,IAA,IM1
+,NOMVE,NFLIPB)
IF(IM1.NE.0)GOTO 63
NFLIP(I)=NFLIP(I)+100
GOTO 32
63 DO 36 J=1,IM1
DO 34 K=1,10
DO 34 L=1,10
34 BTT(K,L)=BT(K,L)
CALL BOARDC(MBI,MBJ,J,IAA,JAA,BTT,-OC,DIRB,LCB)
IF(LL.EQ.0)GOTO 38
IC=1
IZ=IY(LL)
JZ=JY(LL)
IF(B(IZ,JZ).NE.-OC)GOTO 41
MK=JMID(LL)
ML=IMID(LL)
IF(B(ML,MK).EQ.0)NSUBO=90
41 IF(BTT(MI,MJ).NE.OC)GOTO 38
NFLIP(I)=NFLIP(I)-40
IC=2
38 CONTINUE
CALL COUNT(BTT,-OC,NOC)
IF(NOC.GT.0)GOTO 42
NFLIP(I)=NFLIP(I)-200
GOTO 32
42 DO 37 K1=2,9
DO 37 K2=2,9
37 BTTS(K1,K2,J)=BTT(K1,K2)
DO 100 IL=2,9
DO 100 JL=2,9
IF(BTT(IL,JL).EQ.0)GOTO 100
IF(BTT(IL,JL).EQ.OC)GOTO 100
DO 90 IZ=1,8
IV=0
80 IV=IV+1
ILL=IL+IV*IAA(IZ)
JLL=JL+IV*JAA(IZ)
IF(BTT(ILL,JLL).EQ.0)GOTO 36
IF(BTT(ILL,JLL).EQ.100)GOTO 36
IF(BTT(ILL,JLL).NE.OC)GOTO 80
90 CONTINUE
100 CONTINUE
95 CALL MOVEG(BTT,OC,NM,MBBI,MBBJ,DIRBB,LCBB,JAA,IAA,IM2
+,NOMVE,NFLIB)
IF(IM2.EQ.0)GOTO 103
DO 102 IL=1,IM2
IF(MBBI(IL).NE.2.OR.MBBI(IL).NE.9)GOTO 102
IF(MBBJ(IL).NE.2.OR.MBBJ(IL).NE.9)GOTO 102
GOTO 36
102 CONTINUE
103 NFLIP(I)=NFLIP(I)-190
36 CONTINUE
IF(IC.NE.1)GOTO 35
DO 50 K=1,24
IQ=ID(K)
JQ=JD(K)
IF(MI.EQ.IQ.AND.MJ.EQ.JQ)GOTO 50
IF(B(IQ,JQ).NE.-OC)GOTO 50
DO 54 K1=1,IM1
54 IF(BTTS(IQ,JQ,K1).EQ.OC)NFLIP(I)=NFLIP(I)-8
50 CONTINUE
NFLIP(I)=NFLIP(I)+25-NSUBO
35 DO 60 K=1,4
KC1=NCORNI(K)
KC2=NCORNJ(K)
IF(B(KC1,KC2).NE.0)GOTO 60
DO 61 K1=1,IM1
61 IF(BTTS(KC1,KC2,K1).EQ.OC)NFLIP(I)=NFLIP(I)-55
IF(ICO.LE.1)GOTO 60
IF(MI.EQ.KC1.AND.MJ.EQ.KC2)GOTO 60
DO 62 K1=1,IM1
62 IF(BTTS(KC1,KC2,K1).EQ.OC)NFLIP(I)=NFLIP(I)-20
60 CONTINUE
32 CONTINUE
NFLIPM=-800
DO 15 I=1,IM
IF(NFLIP(I).LT.NFLIPM)GOTO 15
NFLIPM=NFLIP(I)
IF=I
15 CONTINUE
20 RETURN
END
SUBROUTINE HANDIC(OC,B,DRSPON,NHD)
DIMENSION DRSPON(1)
INTEGER B(10,1)
NHD=0
WRITE(1,608)
608 FORMAT(1X,'DO YOU WISH TO BE GIVEN A HANDICAP? ')
READ(1,876)RESPON
876 FORMAT(A3)
IF(RESPON.EQ.DRSPON(1))GOTO 7
IF(RESPON.EQ.DRSPON(3))GOTO 7
WRITE(1,610)
610 FORMAT(1X,'DO YOU WISH TO GIVE ME A HANDICAP? ')
READ(1,876)RESPON
IF(RESPON.EQ.DRSPON(2))GOTO 146
IF(RESPON.EQ.DRSPON(4))GOTO 146
NAH=-OC
WRITE(1,609)
609 FORMAT(1X,'HOW MANY CORNERS? (1-4) ')
607 READ(1,678)NHD
678 FORMAT(I1)
IF(NHD.LT.1.OR.NHD.GT.4)GOTO 607
CALL HANDI(B,NHD,NAH,OC)
CALL BOARDP(B,0,0)
GOTO 146
7 NAH=OC
WRITE(1,609)
606 READ(1,678)NHD
IF(NHD.LT.1.OR.NHD.GT.4)GOTO 606
CALL HANDI(B,NHD,NAH,OC)
146 WRITE(1,147)
147 FORMAT(/////////////////////////)
100 RETURN
END
SUBROUTINE HANDI(B,NHD,NAH,OC)
INTEGER B(10,1)
INTEGER NCORNI(4),NCORNJ(4)
DATA NCORNI,NCORNJ/2,2,9,9,2,9,9,2/
SIGN=-1.0
IF(NAH.EQ.OC)SIGN=1.0
DO 10 I=1,NHD
I1=NCORNI(I)
I2=NCORNJ(I)
10 B(I1,I2)=SIGN*OC
RETURN
END