マルバツ

  • 投稿日:
  • by
  • カテゴリ:

紙と鉛筆とがあれば遊べた、〇と×を交互に並べて三目を作る、マルバツゲームです。

盤面は3x3の9マスで、プレイヤーとコンピュータが交互に〇と×をあいているマスに埋めていきます。

横着して、プレイヤーは先手後手にかかわらず〇、コンピュータは×をそれぞれ用います。

先手後手はランダムに決まります。右の様に、縦横斜めのいずれかで三目並べれば勝利です。逆に相手に並べられたら負けです。

自分の番で、左右と上下のカーソルキーを使って、横のカーソル'^'と縦のカーソル'<' をそれぞれ動かして、置きたい場所でスペースキーを押すと、〇を書いてコンピュータに順番を渡します。もちろん既に埋まっている場所には書けません。

ご存じのように、少しでも賢ければ、このゲームは大抵引き分けになります。ただ、コンピュータは、それほど賢くないので、うまくやれば勝てるかもしれません。また、そんなに賢くはないですが、自分の勝てる目、相手が勝ちそうな目は的確に埋めてきますので、油断していると負けます。

つまり、そこそこ暇つぶしにはなる、と、いうことです。

1 CLS:CLV:SRND TICK():C=2*RND(2)-1:LC0,0:?" | | ":?"-+-+-":?" | | ":?"-+-+-":?" | | "
2 IFC=(N%2)*2-1I=0:GOTO4ELSEJ=-1
3 LCX*2,5:?"^":LC5,Y*2:?"<":O=X+3*Y:K=INKEY():IF!KCONTELSEIFK=32AND![O][O]=-C:LC2*X,2*Y:?"O":GOTO8ELSEH=(K=29)+2*(K=28):V=(K=31)+2*(K=30):LCX*2,5:?" ":LC5,Y*2:?" ":X=(X+H)%3:Y=(Y+V)%3:CONT
4 IFABS([I]+[I+3]+[I+6])=2J=I+![I+3]*3+![I+6]*6:GOTO8ELSEI=I+1:IFI<3CONTELSEI=0
5 IFABS([I]+[I+1]+[I+2])=2J=I+![I+1]+![I+2]*2:GOTO8ELSEI=I+3:IFI<9CONT
6 IFABS([0]+[4]+[8])=2J=![4]*4+![8]*8:GOTO8ELSEIFABS([2]+[4]+[6])=2J=![2]*2+![4]*4+![6]*6:GOTO8
7 J=RND(9):IF[J]CONT
8 I=0:IFJ>=0[J]=C:LC2*(J%3),2*(J/3):?"X"
9 W=[I]+[I+3]+[I+6]:IFABS(W)=3GOTO13ELSEI=I+1:IFI<3CONTELSEI=0
10 W=[I]+[I+1]+[I+2]:IFABS(W)=3GOTO13ELSEI=I+3:IFI<9CONT
11 W=[0]+[4]+[8]:IFABS(W)=3GOTO13ELSEW=[2]+[4]+[6]:IFABS(W)=3GOTO13
12 IFN=8LC0,6:?"DRAW":ENDELSEN=N+1:GOTO2
13 LC0,6:IFC*W>0?"COM WIN!"ELSE?"YOU WIN!"

変数

  • C    コンピュータの番手 -1が先手で1が後手
  • H    ユーザカーソルの横方向の移動用
  • I    盤面の評価用ポインタ
  • J    コンピュータの指し手
  • K    キー変数
  • N    番手
  • O    ユーザ指し手チェック用ポインタ
  • V    ユーザカーソルの縦方向移動用
  • W    三目チェック
  • X    ユーザのカーソル位置
  • Y    ユーザのカーソル位置
  • [0]:~[8]    盤面(-1先手/1後手/0あき)

プログラム

  • 1行目は初期化です。先手後手を決め、盤面を表示します。
  • 2行目は番手のチェックです。コンピュータの番なら4行目に飛ばします。
  • ユーザの入力処理です。カーソルを動かし、〇を書きます。〇を書いたら三目チェック(8行目)に行きますH, Vは1または2をとります。1または-1ではありません。これはリング状のポインター移動ではよくあるやり方です。
  • 4~7行目はコンピュータの思考ルーチンwです。ここをいじると強くも弱くもなります。
  • 8~11行目は三目判定です。三目成立なら13行目の勝ち負け判定へ進みます。
  • 12行目は番手を進める処理です。引き分けチェックもしています。
  • 13行目はどっちが勝ったのかをチェックしています。