一向に鎮火しません。 → C#で、、、
原因の一端は僕にあります。ごめんなさい。 _o/L
正常ルートに戻りそうもないし、スレ主も逃げ出したみたいだから:
using System;
using System.Collections.Generic;
using System.Drawing;
namespace Othello {
enum Piece { none, Black, White };
class Board {
private Piece[,] board_;
private readonly int N = 8;
// コンストラクタ
public Board() { board_ = new Piece[N,N];
for ( int x = 0; x < N; ++x ) {
for ( int y = 0; y < N; ++y ) {
board_[x,y] = Piece.none;
}
}
board_[2,2] = Piece.Black;
board_[3,3] = Piece.Black;
board_[2,3] = Piece.White;
board_[3,2] = Piece.White;
}
// (x,y)はボードの上か?
private bool onBoard(int x, int y) {
if ( x < 0 || x >= N ) return false;
if ( y < 0 || y >= N ) return false;
return true;
}
// (x,y)に色pの駒を置いたとき(dx,dy)方向に何枚反転できるか?
// dx, dy : -1/0/1 のいずれか
private int flippablePieces(Piece p,
int x, int y, int dx, int dy) {
// (x,y)に駒があったらダメ
if ( board_[x,y] != Piece.none ) return 0;
int result = 0;
// x,yのそれぞれをdx,dyだけ変化させ、
// そこがボード上であり空マスでない間
while ( onBoard(x+=dx,y+=dy) &&
board_[x,y] != Piece.none ) {
// 置いた駒と同色ならそこまでの反転数を返す
if ( board_[x,y] == p ) { return result; }
// 置いた駒と異なるなら、反転数+1
else { ++result; }
}
return 0;
}
// (x,y)に色pの駒を置いたとき何枚反転できるか?
public int flippablePieces(Piece p, int x, int y) {
int result = 0;
// 8方向について調べ、結果を積算
for ( int dx = -1; dx <= 1; ++dx ) {
for ( int dy = -1; dy <= 1; ++dy ) {
result += flippablePieces(p,x,y,dx,dy);
}
}
return result;
}
// (x,y)に置かれたpが(dx,dy)方向の敵コマを反転する
private int putPiece(Piece p,
int x, int y, int dx, int dy ) {
List<Point> flips = new List<Point>();
flips.Add(new Point(x,y));
while ( onBoard(x+=dx,y+=dy) &&
board_[x,y] != Piece.none ) {
if ( board_[x,y] == p ) { break; }
else { flips.Add(new Point(x,y)); }
}
if ( board_[x,y] == p ) {
foreach ( Point pt in flips ) board_[pt.X,pt.Y] = p;
}
return flips.Count-1;
}
// (x,y)に置かれたpが8方向の敵コマを反転する
public int putPiece(Piece p, int x, int y) {
int result = 0;
for ( int dx = -1; dx <= 1; ++dx ) {
for ( int dy = -1; dy <= 1; ++dy ) {
result += putPiece(p,x,y,dx,dy);
}
}
return result;
}
// ボード上のpと同色の駒を数える
public int countPieces(Piece p) {
int result = 0;
foreach ( Piece item in board_ ) {
if ( item == p ) ++result;
}
return result;
}
public void dump() {
for ( int x = 0; x < N; ++x ) {
for ( int y = 0; y< N; ++y ) {
switch ( board_[x,y] ) {
case Piece.none: Console.Write(" "); break;
case Piece.Black: Console.Write("●"); break;
case Piece.White: Console.Write("○"); break;
}
}
Console.WriteLine();
}
}
}
}