program IshiOki4; {$APPTYPE CONSOLE} uses SysUtils; type TBangou = 0..69; // マスの通し番号 TYouso = (Kara,Kuro,Siro,Dame); // マスに入る要素 TBan = array [TBangou] of TYouso; // 5×8を一回り大きくした盤 TPlayer = Kuro..Siro; // 選手 const Kigou : array [TYouso] of String[2] // 要素を書く記号 = (' ','●','○','・'); Aite : array [TPlayer] of TPlayer // 相手 = (Siro,Kuro); // Aite[Kuro]=Siro // Aite[Siro]=Kuro var {全体で使う変数} Ban : TBan; // 盤 KaraNoKazu : Integer; // 空マスの数 procedure BanSyokika; {盤を初期化する} var N,G,R : TBangou; begin for N := 0 to 69 do begin Ban[N] := Dame; end; for G := 1 to 5 do for R := 1 to 8 do begin Ban[G*10+R] := Kara; end; KaraNoKazu := 5*8; end; {BanSyokika} procedure YousoWoKaku(N : TBangou); {Ban[N] の要素を書く} begin Write(Kigou[Ban[N]]); end; {YousoWoKaku} procedure BanWoKaku; {盤を書く} var Gyou,Retu : TBangou; begin WriteLn('   -1 -2 -3 -4 -5 -6 -7 -8 '); WriteLn('  ┌─┬─┬─┬─┬─┬─┬─┬─┐'); for Gyou := 1 to 5 do begin Write(Gyou:3, '-│'); for Retu := 1 to 8 do begin YousoWoKaku(Gyou*10+Retu); Write('│'); end; WriteLn; if Gyou < 5 then WriteLn('  ├─┼─┼─┼─┼─┼─┼─┼─┤'); end; WriteLn('  └─┴─┴─┴─┴─┴─┴─┴─┘'); end; {BanWoKaku} function HitoNoTe(Player : TPlayer) : TBangou; {どこに置くか人に訊く} var N : TBangou; begin Write('どこに置きますか [11〜58] ? '); ReadLn(N); while not (N in [11..58]) or (Ban[N] <> Kara) do begin WriteLn('そこには置けません'); Write('どこに置きますか [11〜58] ? '); ReadLn(N); end; Result := N; end; {HitoNoTe} procedure KaraNaraDameNi(N : TBangou); {Ban[N] が空だったらだめに変える} begin if Ban[N] = Kara then begin Ban[N] := Dame; Dec(KaraNoKazu); end; end; {KaraNaraDameni} procedure IshiWoOku(N : TBangou; IShi : TYouso); {石を置く} begin Ban[N] := Ishi; Dec(KaraNoKazu); KaraNaraDameni(N-10); KaraNaraDameni(N-1); KaraNaraDameni(N+1); KaraNaraDameni(N+10); end; {IshiWoOku} function SenteKaGoteKa : TPlayer; {コンピュータを先手にするか後手にするか訊く} var YesNo : String; begin Write('コンピュータが先手でいいですか [y(yes) / y以外(no)] ? '); ReadLn(YesNo); if YesNo = 'y' then Result := Kuro else Result := Siro; end; {SenteKaGoteKa} function ComputerNoTe(Player : TPlayer) : TBangou; {ランダムに空マスを選ぶ} var R,N : TBangou; begin R := Random(KaraNoKazu)+1; // 1〜空マスの数 の乱数 N := 10; repeat // R番目の空マスが見つかるまで探す Inc(N); if Ban[N] = Kara then Dec(R); until R = 0; WriteLn(N, 'に置きます'); Result := N; end; {ComputerNoTe} procedure Game; {1ゲーム実行} var Basyo : TBangou; Tesuu : Integer; // 手数,何手目か Teban : TPlayer; // 手番,置く番の選手 Computer : TPlayer; // コンピュータが演ずる選手 begin BanSyokika; // 盤を初期設定する BanWoKaku; // 盤を書く Computer := SenteKaGoteKa; // 先手後手を決める Tesuu := 0; // 手数を0に初期設定する Teban := Siro; // 手番を○(後手)にする repeat Inc(Tesuu); // 手数を1増やす Teban := Aite[Teban]; // 手番を交代する Write(Tesuu:2, '手目:'); WriteLn(Kigou[Teban], 'の番です'); if Teban = Computer then Basyo := ComputerNoTe(Teban) // コンピュータが場所を選ぶ else Basyo := HitoNoTe(Teban); // 人が場所を選ぶ IshiWoOku(Basyo,Teban); // 石を置く BanWoKaku; until KaraNoKazu = 0; if Teban = Computer then WriteLn('あなたの負けです') else WriteLn('あなたの勝ちです'); end; {Game} var {Main だけで使う変数} YesNo : String; begin {Main} Randomize; repeat Game; Write('終了しますか [y(Yes) / y以外(No)] ? '); ReadLn(YesNo); until YesNo = 'y'; end. // end. 以下は無視されます.