プログラミングの題材として、四色碁を作ってみようかと思います。
四色碁とは
豆腐の角さんが考えた四人対戦の囲碁です。四人の中で一番地が多いことを目指います。囲碁のルールがわかっていれば、誰でも楽しむことができます。
石の取り方
まず一色のカラーでしか石をとることはできません。相手の赤をとるためには必ず一色のカラー、つまりこの場合であれば青で囲う必要があります。
なので緑がこう打っても、赤はとられません。石の逃げ道は3に増えました。
中の石がどんなカラーでも、周囲を一色で囲めばすべて取ることができます。
ソースコード
説明の図はProcessingで作成しました。今回はここまでです。
sketch.pde
Board board;
void setup()
{
size(880, 880);
board = new Board();
board.initGame();
}
void draw()
{
background(255, 255, 203);
board.display();
}
Board.pde
class Board {
int cellSize = 80;
ArrayList<ArrayList> cells = new ArrayList();
Board() {
for (int i=1; i <= 9; i++) {
ArrayList<Cell> row = new ArrayList();
for (int j=1; j <= 9; j++) {
row.add(new Cell(j, i ));
}
cells.add(row);
}
}
void initGame() {
getCellAt(4, 3).putStone( Cell.GREEN);
getCellAt(3, 4).putStone( Cell.BLUE);
getCellAt(4, 4).putStone( Cell.PINK);
getCellAt(5, 4).putStone( Cell.BLUE);
getCellAt(4, 5).putStone( Cell.BLUE);
}
Cell getCellAt(int col, int row) {
if(col < 0 || col > 7 || row < 0 || row > 7){
return null;
}
return (Cell)cells.get(row).get(col);
}
void display() {
for (ArrayList row : cells) {
for (Object c : row) {
Cell cell = (Cell) c;
cell.display();
}
}
}
}
Cell.pde
class Cell {
static final int SIZE = 80;
static final int GREEN = 1;
static final int YELLOW = 2;
static final int PINK = 3;
static final int BLUE = 4;
static final int GHOST = 14;
int x;
int y;
int stone = 0;
int size = SIZE;
Cell(int x, int y) {
this.x = x;
this.y = y;
}
int getCol() {
return this.x;
}
int getRow() {
return this.y;
}
boolean hasStone() {
return (this.stone != 0);
}
int getScore() {
return this.stone;
}
void display() {
stroke(0);
fill(210, 185, 80);
rect(x * size, y * size, size, size);
if (this.stone != 0) {
if ( this.stone == GREEN)
{
fill(#49b675);
} else if ( this.stone == YELLOW)
{
fill(#FFE374);
} else if ( this.stone == PINK)
{
fill(#EF9CB5);
} else if ( this.stone == BLUE)
{
fill(#0044FD);
}else{
fill(#FFFFFF,200);
}
stroke(0);
ellipse(x * size, y * size, size * 0.9, size * 0.9);
}
}
boolean putStone(int stoneColor)
{
this.stone = stoneColor;
return true;
}
}