REVERSI by Jの字

再生

 白黒の石をはさんでひっくり返す、「リバーシ」ゲームの投稿だ。
 有名なルールなので、さすがに説明の必要はないだろう。実行するとランダムで先攻・後攻が決まるので、あとは石を置きたい場所にタッチしてゲームを進めていこう。

私が作りました

Jの字

中学生の頃、PC98で作ろうと思って挫折したリバーシのプログラムですが、今やってみるとあっさり作れてしまったあたりに自分自身の進歩が見られます。
先読みしていないのであまり強くありませんがテンポ良くプレイできるのでそれなりに楽しめると思います


 CHECK POiNT 

ワンパク
か、勝てねェ! これがコンピューターの頭脳か、ガッデム!

神崎
えぇと、比較的シンプルな処理だからリバーシのコツを知っていれば勝てると思うんだけど……

博士
ふむ。盤面を全コマサーチして、それぞれ取れるコマの数とマスの重み(重要度)を比較しているのじゃな。
作者の言う通り、数手先を読んでいるわけではないが逆に「1手読み」の処理としてはおおいに参考になるじゃろう。

インテリ
先読みをして強くするにはどうすればいいか、考えてみるのも面白いよ。かなり奥の深い世界だから、みんなもこれをベースにいじってみたらどうかな。

プログラムリスト

  1. CLEAR
  2. PNLTYPE”OFF”
  3. GPAGE 1
  4. DIM VN(20,20),VW(64),P$(3)
  5. W=22:P$(1)=”アナタ”:P$(2)=”COM”
  6. ’===オモミツ゛ケ
  7. FOR I=0 TO 31
  8.  READ X
  9.  VW(I)=X*X:VW(63-I)=X*X
  10. NEXT
  11. DATA 1,6,3,4,4,3,6,1
  12. DATA 6,9,5,5,5,5,9,6
  13. DATA 3,5,4,6,6,4,5,3
  14. DATA 4,5,6,1,1,6,5,4
  15. ’===コ゛ハ゛ン
  16. @START
  17. ENDFLG=0:GCLS 10:BGMPLAY 16
  18. FOR I=0 TO 8
  19.  X=I*W+8
  20.  GLINE 8,X,8*W+8,X,14
  21.  GLINE X,8,X,8*W+8,14
  22. NEXT
  23. GBOX 3,3,253,189,5
  24. GPAINT 5,5,11
  25. ’===イシ
  26. FOR I=1 TO 8
  27.  FOR J=1 TO 8
  28.   VN(I,J)=0
  29.  NEXT
  30. NEXT
  31. VN(4,4)=1:VN(5,5)=1
  32. VN(4,5)=2:VN(5,4)=2
  33. P=1:GOSUB @DRAW:CLS
  34. ’===タイトル
  35. COLOR  5:?,,”┌─┐          ”
  36. COLOR  4:?,,”│ │         ●”
  37. COLOR 15:?,,”├┬┘┌─│┌┬─┌┌─┬”
  38. COLOR  9:?,,”││ ├─││├─│└┐│”
  39. COLOR 11:?,,”┘└─┴─└┘└─┴─┘┴”
  40. ’===センコウコウコウ
  41. I=RND(2)+1:?”センテ:”+P$(I)
  42. IF I==2 GOTO @COM
  43. ’===ニュウリョクマチ
  44. @TOUCH
  45.  IF TCHTIME<5 GOTO @TOUCH
  46.  X=FLOOR((TCHX-8)/W)+1
  47.  Y=FLOOR((TCHY-8)/W)+1
  48.  ’***オケルハ゛ショカ カクニン
  49.  FLG=0:GOSUB @GET
  50.  IF HK==0 GOTO @TOUCH
  51.  ’***オイタ
  52.  BEEP 7
  53.  FLG=1:GOSUB @GET
  54.  VN(X,Y)=1:GOSUB @DRAW
  55.  IF ENDFLG==1 GOTO @KEKKA
  56. ’===テキノハ゛ン
  57. @COM
  58.  P=2:EP=-1:ES=100000
  59.  FOR E=0 TO 63
  60.   X=E%8+1:Y=FLOOR(E/8)+1
  61.   FLG=0:P=2:GOSUB @GET
  62.   ER=(RND(10)+6)*HK*VW(E)
  63.   IF ER>0 AND ES>ER THEN EP=E:ES=ER
  64.  NEXT
  65.  PF=0
  66.  IF EP==-1 THEN ?”COM:PASS”:PF=1:GOTO @CANPUT
  67.  X=EP%8+1:Y=FLOOR(EP/8)+1
  68.  FLG=1:GOSUB @GET
  69.  BEEP 11
  70.  GOSUB @DRAW
  71.  IF ENDFLG==1 GOTO @KEKKA
  72. ’===オクトコロアル?
  73. @CANPUT
  74.  P=1:EP=-1:FLG=0
  75.  FOR X=1 TO 8
  76.   FOR Y=1 TO 8
  77.    GOSUB @GET
  78.    IF HK>0 THEN EP=1
  79.   NEXT
  80.  NEXT
  81.  IF EP==-1 AND PF==1 GOTO @KEKKA
  82.  IF EP==-1 THEN ?”アナタ:PASS”:GOTO @COM
  83. GOTO @TOUCH
  84. ’===ケッカ
  85. @KEKKA
  86.  COLOR 0:I=(V1<V2)+1
  87.  BGMPLAY 4+I
  88.  ?P$(I);”ノカチ ” V1;”-”;V2
  89.  ?”TOUCH SCREEN TO START”
  90. @KEKKA2
  91.  IF TCHTIME>5 GOTO @START
  92. GOTO @KEKKA2
  93. ’===イシナラヘ゛ル
  94. @DRAW
  95.  V1=0:V2=0
  96.  FOR I=1 TO 8
  97.   FOR J=1 TO 8
  98.    TP=VN(I,J)
  99.    IF TP>0 THEN GOSUB @DRAW1
  100.    IF TP==1 THEN V1=V1+1
  101.    IF TP==2 THEN V2=V2+1
  102.   NEXT
  103.  NEXT
  104.  COLOR 16-P*3
  105.  ?P$(P);”:”;X;”-”;Y
  106.  IF V1*V2==0  THEN ENDFLG=1
  107.  IF V1+V2==64 THEN ENDFLG=1
  108. RETURN
  109. ’===イシヲカク
  110. @DRAW1
  111.  GX=I*W-3:GY=J*W-3
  112.  GCIRCLE GX,GY,9,13,180,360
  113.  GCIRCLE GX,GY-1,9,14+TP
  114.  GPAINT  GX,GY-1,14+TP
  115. RETURN
  116. ’===トレルコスウ/トル
  117. @GET
  118.  HK=0
  119.  IF X<1 OR 8<X OR Y<1 OR 8<Y THEN RETURN
  120.  IF FLG==0 AND VN(X,Y)!=0 THEN RETURN
  121.  FOR I=-1 TO 1
  122.   FOR J=-1 TO 1
  123.    TX=X:TY=Y:G=0
  124.    IF I==0 AND J==0 GOTO @G2
  125.    @G1
  126.     TX=TX+I:TY=TY+J
  127.     IF VN(TX,TY)==0 THEN G=0:GOTO @G2
  128.     IF VN(TX,TY)==P GOTO @G2
  129.     G=G+1:GOTO @G1
  130.    @G2
  131.     IF G>0 AND FLG==1 THEN GOSUB @RVS
  132.     HK=HK+G
  133.   NEXT
  134.  NEXT
  135. RETURN
  136. ’===ウラカ゛エシ
  137. @RVS
  138.  IF TX==X AND TY==Y THEN RETURN
  139.  TX=TX-SGN(TX-X):TY=TY-SGN(TY-Y)
  140.  VN(TX,TY)=P
  141. GOTO @RVS