home *** CD-ROM | disk | FTP | other *** search
- 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