0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コンピュータとオセロ対戦8 ~クリック1hand~

Last updated at Posted at 2021-09-24

前回

今回の目標

一手先まで読んで返してもらいます。
今までのプログラムを組み合わせただけなので簡単な紹介だけしかしません。
なお今回も、プログラムの色を変えるため拡張子を「.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

前回と違い、自分が置いた後にコンピュータが置き返すようになりました。
自分が置いた後、

  1. 相手が置けるなら、相手のターン
  2. 相手が置けない場合、
  3. 自分が置けるならもう一度自分のターン
  4. 自分も置けないならゲーム終了

という動作をしています。

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と同様、次のターンで、

  1. 相手が置けるなら、相手のターン
  2. 相手が置けない場合、
  3. 自分が置けるならもう一度自分のターン
  4. 自分も置けないならゲーム終了

という動作をしています。
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行きたいと思います。
次回

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?