今回の目標
一手先まで読んで返してもらいます。
今までのプログラムを組み合わせただけなので簡単な紹介だけしかしません。
なお今回も、プログラムの色を変えるため拡張子を「.c」と表記してますがProcessingです。
ここから本編
copyb
盤面をコピーするだけ。
one_hand.c
void copyb(int[][] now){
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
now[i][j] = board[i][j];
}
mousePressed
前回と違い、自分が置いた後にコンピュータが置き返すようになりました。
自分が置いた後、
- 相手が置けるなら、相手のターン
- 相手が置けない場合、
- 自分が置けるならもう一度自分のターン
- 自分も置けないならゲーム終了
という動作をしています。
one_hand.c
void mousePressed(){
int line = (mouseY - COLT / 2) / COLT;
int col = (mouseX - COLT / 2) / COLT;
if (check(line, col, player)){
put(board, line, col);
printb();
if (check_all(!player)){
turn = !turn;
turn_print("");
computer();
}else{
if (check_all(player)) turn_print("not place. again, ");
else count_last();
}
}
}
think
C言語の時とほぼ同じです。
one_hand.c
void think(){
int i, j, num = 0;
int score, max_score = - SIZE * SIZE;
int[] line = new int[SIZE << 1], col = new int[SIZE << 1];
int[][] board_leaf = new int[SIZE][SIZE];
for (i = 0; i < SIZE; i++){
for (j = 0; j < SIZE; j++){
if (check(i, j, !player)){
copyb(board_leaf);
put(board_leaf, i, j);
score = count(board_leaf);
if (score > max_score){
num = 0;
line[0] = i;
col[0] = j;
max_score = score;
}else if (score == max_score){
num++;
line[num] = i;
col[num] = j;
}
}
}
}
if (num != 0) {
num = int(random(num + 1));
line[0] = line[num];
col[0] = col[num];
}
put(board, line[0], col[0]);
}
computer
コンピュータが置くときの関数です。
mousePressedと同様、次のターンで、
- 相手が置けるなら、相手のターン
- 相手が置けない場合、
- 自分が置けるならもう一度自分のターン
- 自分も置けないならゲーム終了
という動作をしています。
mousePressedでのput関数がthink関数に変わり、「相手は置けないけど自分は置ける」とき、computer関数が追加されています。
one_hand.c
void computer(){
think();
printb();
if (check_all(player)){
turn = !turn;
turn_print("");
}else{
if (check_all(!player)){
turn_print("not place. again, ");
computer();
}
else count_last();
}
}
フルバージョン
実際にやってみた
負け越しました。
次回は
nhand行きたいと思います。
次回