よしなしごと.log

へたれSEの雑記帳

OXゲームバッチver1.0

windowsバッチでOXゲームを作りました。

三目並べともいうらしいですね。こういう↓二人で順番に印付けていって印が3つ並んだら勝ちのゲームです。

OXO

XOX

XXO

メイン処理、プレイヤーが手を選択する処理、COM側の手を決定する処理、勝敗判定、の4ファイル。1ファイルにまとめたかったけど力不足ですた。

※改善したいポイント※
  • プレイヤーが誤入力すると破綻する
  • ソースコードの美しさ無視
  • for文で短く書ける…と思われるところをべた書きしてる
  • COMに戦略がない。相手の勝ちを邪魔するどころか自分がリーチでも勝ちに行かない。ただ確率で印付けるだけ。なのでCOMがとても弱い。

メモ帳にコピペして全部のファイルを同じ場所に保存、「OXGAME.bat」をダブルクリックするとゲーム出来ます。出来るはず。出来なかったらこっそり直します。

OXGAME.bat

@echo off
setlocal
setlocal ENABLEDELAYEDEXPANSION

rem OXゲームバッチ

rem 変数を定義
set COM=0
set PLAY=0
set O=0
set X=0
set NUM=0
set VAL=0
set VALABC=4
set VAL123=4
set COMVALABC=0
set COMVAL123=0
set COMVAL=0
set PLAYVAL=0
set JUDGE=0
set A1=-
set A2=-
set A3=-
set B1=-
set B2=-
set B3=-
set C1=-
set C2=-
set C3=-
set SEL1=A1
set SEL2=A2
set SEL3=A3
set SEL4=B1
set SEL5=B2
set SEL6=B3
set SEL7=C1
set SEL8=C2
set SEL9=C3

rem 先行/後攻決定
echo OXゲームをするよ!
echo 最初に先行・後攻を決めよう!
echo コインを投げるよ!表ならあなたが先行ね!
echo (ピンッ!)(効果音)
set NUM=%RANDOM%
set /a VAL=%NUM%%%2
if %VAL% equ 0 (
  echo コインは裏でした。
  echo あなたは後攻、印はXね!
  set COM=f
  set PLAY=s
  set O=COM
  set X=PLAY
) else (
  echo コインは表でした。
  echo あなたは先行、印はOね!
  set COM=s
  set PLAY=f
  set O=PLAY
  set X=COM
)
call :lbla

rem ★PLAY先行★
if %PLAY%==f (
rem 1手目(PLAY1)
  call PLAYDEC.bat
  call :lbla
rem 2手目(COM1)
  call COMDEC.bat
  call :lbla
rem 3手目(PLAY2)
  call PLAYDEC.bat
  call :lbla
rem 4手目(COM2)
  call COMDEC.bat
  call :lbla
rem 5手目(PLAY3)
  call PLAYDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem 6手目(COM3)
  call COMDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem 7手目(PLAY4)
  call PLAYDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem 8手目(COM4)
  call COMDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem 9手目(PLAY5)
  call PLAYDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem ★COM先行★
) else if %COM%==f (
rem 1手目(COM1)
  call COMDEC.bat
  call :lbla
rem 2手目(PLAY1)
  call PLAYDEC.bat
  call :lbla
rem 3手目(COM2)
  call COMDEC.bat
  call :lbla
rem 4手目(PLAY2)
  call PLAYDEC.bat
  call :lbla
rem 5手目(COM3)
  call COMDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem 6手目(PLAY3)
  call PLAYDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem 7手目(COM4)
  call COMDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem 8手目(PLAY4)
  call PLAYDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
rem 9手目(COM5)
  call COMDEC.bat
  call :lbla
  call JUDGE.bat
  if !JUDGE! equ 1 goto endoffile
)

 

:endoffile
endlocal
pause
exit

:lbla
echo ====
echo ABC
echo 1!A1!!B1!!C1!
echo 2!A2!!B2!!C2!
echo 3!A3!!B3!!C3!
echo ====

 

 

 

PLAYDEC.bat

@echo off

rem PLAY側選択
if !A1!==O set SEL1=-
if !A2!==O set SEL2=-
if !A3!==O set SEL3=-
if !B1!==O set SEL4=-
if !B2!==O set SEL5=-
if !B3!==O set SEL6=-
if !C1!==O set SEL7=-
if !C2!==O set SEL8=-
if !C3!==O set SEL9=-
if !A1!==X set SEL1=-
if !A2!==X set SEL2=-
if !A3!==X set SEL3=-
if !B1!==X set SEL4=-
if !B2!==X set SEL5=-
if !B3!==X set SEL6=-
if !C1!==X set SEL7=-
if !C2!==X set SEL8=-
if !C3!==X set SEL9=-

if %PLAY%==f (
  echo Oを付ける場所を選んでください。
  set /p PLAYVAL=!SEL1!/!SEL2!/!SEL3!/!SEL4!/!SEL5!/!SEL6!/!SEL7!/!SEL8!/!SEL9!を入力してください:
  set !PLAYVAL!=O
  echo PLAYがO印を書きました。
) else if %COM%==f (
  echo Xを付ける場所を選んでください。
  set /p PLAYVAL=!SEL1!/!SEL2!/!SEL3!/!SEL4!/!SEL5!/!SEL6!/!SEL7!/!SEL8!/!SEL9!を入力してください:
  set !PLAYVAL!=X
  echo PLAYがX印を書きました。
)

 

 

COMDEC.bat

@ echo off

rem COM側選択
:lblb
set NUM=%RANDOM%
set /a VALABC=!NUM!%%3
if !VALABC! equ 0 set COMVALABC=A
if !VALABC! equ 1 set COMVALABC=B
if !VALABC! equ 2 set COMVALABC=C
set NUM=%RANDOM%
set /a VAL123=!NUM!%%3
if !VAL123! equ 0 set COMVAL123=1
if !VAL123! equ 1 set COMVAL123=2
if !VAL123! equ 2 set COMVAL123=3
set COMVAL=!COMVALABC!!COMVAL123!
if !COMVAL!==O (
  set COMBAL=-
  goto lblb
) else if !COMVAL!==X (
  set COMBAL=-
  goto lblb
)

if %COM%==f (
  set !COMVAL!=O
  echo COMがO印を書きました。
) else if %PLAY%==f (
  set !COMVAL!=X
  echo COMがX印を書きました。
)

 

 

JUDGE.bat

@ echo off

rem 勝敗判定

rem Oの勝ち
if !A1!==O (
  if !A2!==O (
    if !A3!==O (
      echo %O%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
  if !B1!==O (
    if !C1!==O (
      echo %O%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
  if !B2!==O (
    if !C3!==O (
      echo %O%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)
if !B1!==O (
  if !B2!==O (
    if !B3!==O (
      echo %O%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)
if !C1!==O (
  if !C2!==O (
    if !C3!==O (
      echo %O%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
  if !B2!==O (
    if !A3!==O (
      echo %O%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)
if !A2!==O (
  if !B2!==O (
    if !C2!==O (
      echo %O%の勝ちです。
      echo ゲームを終了します。
     set JUDGE=1
    )
  )
)
if !A3!==O (
  if !B3!==O (
    if !C3!==O (
      echo %O%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)

rem Xの勝ち
if !A1!==X (
  if !A2!==X (
    if !A3!==X (
      echo %X%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
  if !B1!==X (
    if !C1!==X (
      echo %X%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
  if !B2!==X (
    if !C3!==X (
      echo %X%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)
if !B1!==X (
  if !B2!==X (
    if !B3!==X (
      echo %X%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)
if !C1!==X (
  if !C2!==X (
    if !C3!==X (
      echo %O%の勝ちです。
      echo ゲームを終了します。
     set JUDGE=1
    )
  )
  if !B2!==X (
    if !A3!==X (
      echo %X%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)
if !A2!==X (
  if !B2!==X (
    if !C2!==X (
      echo %X%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)
if !A3!==X (
  if !B3!==X (
    if !C3!==X (
      echo %X%の勝ちです。
      echo ゲームを終了します。
      set JUDGE=1
    )
  )
)