質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

1609閲覧

Java オセロ隣接しているところに置く事と勝敗判定

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/07/21 13:37

課題で出た基礎的なコードを応用しているため、とても遠回りなコードになっていると思われます。

javaでオセロを作っているのですが、隣接されているところ以外も駒が置けるようになってしまっています。
どのようにすれば隣接しているところだけ置けるようにすることができるでしょうか?
また、最終的に駒数を数えて勝敗を判定したいのですが、どのようなアプローチをすればよいでしょうか?

今回が初めての質問ゆえに、至らぬところがあるかもしれませんがよろしくお願いします。

html

1package b132; 2 3import java.util.Scanner; 4 5public class MyClass { 6 7 static int BOARD_SIZE = 8; 8 static String[] STONE_STR = {"□", "●", "○"}; 9 static int[][] board = new int[BOARD_SIZE][BOARD_SIZE]; 10 11 // 盤面の表示 12 static void print_board() { 13 System.out.print(" "); 14 for(int j = 1; j <= board[0].length; j++) { 15 System.out.printf("%2d", j); 16 } 17 System.out.println(""); // 改行のみ 18 for(int i = 0; i < board.length; i++) { 19 System.out.print((i + 1) + " "); 20 for(int j = 0; j < board[i].length; j++) { 21 System.out.print(STONE_STR[board[i][j]]); 22 } 23 System.out.println(""); // 改行のみ 24 } 25 26 } 27 28 // 入力位置が盤面の外かどうかを判定 29 static boolean is_out_board(int num_v, int num_h) { 30 if((num_v < 0) || (num_v >= BOARD_SIZE) || (num_h < 0) || (num_h >= BOARD_SIZE)) { 31 return true; 32 } 33 return false; 34 } 35 36 public static void main(String[] args) { 37 int num_v, num_h; 38 int num_hand = 1; //手数 39 int num_play = 1; 40 41 Scanner scan = new Scanner(System.in); 42 //初期位置の設定 43 board[3][4] = 1; 44 board[4][3] = 1; 45 board[3][3] = 2; 46 board[4][4] = 2; 47 48 print_board(); 49 while(true) { 50 System.out.println(STONE_STR[num_play] + "の番です"); 51 System.out.println("どこに置きますか?(" + num_hand + "手目)"); 52 System.out.print("縦:"); 53 num_v = scan.nextInt() - 1; 54 System.out.print("横:"); 55 num_h = scan.nextInt() - 1; 56 System.out.println(""); // 改行のみ 57 58 // 位置が縦横ともに負の値の場合は終了 59 if((num_v == -1) && (num_h == -1)) { 60 System.out.println("終了します"); 61 break; 62 } 63 // 盤面の外には置けない 64 if(is_out_board(num_v, num_h)) { 65 System.out.println("そこには置けません"); 66 continue; 67 } 68 // 石を置く 69 if(STONE_STR[board[num_v][num_h]].equals("□")) { 70 board[num_v][num_h] = num_play; 71 //左上の判定 72 if(num_v > 1 && num_h >1) { 73 if(board[num_v-1][num_h-1] != num_play) { 74 for(int i = 2; true; i++) { 75 //駒がないとき 76 if(num_v - i < 0 || num_h -i < 0 || STONE_STR[board[num_v- i][num_h - i]].equals("□")) { 77 break; 78 }//自分の駒のとき 79 else if (board[num_v-i][num_h-i] == num_play) { 80 //ひっくり返す 81 for(int j = 1; j < i; j++) { 82 board[num_v -j][num_h -j] = num_play; 83 } 84 break; 85 } 86 } 87 } 88 } 89 //真上の判定 90 if(num_v >1) { 91 if(board[num_v-1][num_h] != num_play) { 92 for(int i = 2; true; i++) { 93 //駒がないとき 94 if(num_v - i < 0 || STONE_STR[board[num_v- i][num_h]].equals("□")) { 95 break; 96 }//自分の駒のとき 97 else if (board[num_v-i][num_h] == num_play) { 98 //ひっくり返す 99 for(int j = 1; j < i; j++) { 100 board[num_v -j][num_h] = num_play; 101 } 102 break; 103 } 104 } 105 } 106 } 107 //右上の判定 108 if(num_v >1 && num_h < 6) { 109 if(board[num_v-1][num_h+1] != num_play) { 110 for(int i = 2; true; i++) { 111 //駒がないとき 112 if(num_v - i < 0 || num_h + i > 7 || STONE_STR[board[num_v- i][num_h + i]].equals("□")) { 113 break; 114 }//自分の駒のとき 115 else if (board[num_v-i][num_h+i] == num_play) { 116 //ひっくり返す 117 for(int j = 1; j < i; j++) { 118 board[num_v -j][num_h + j] = num_play; 119 } 120 break; 121 } 122 } 123 } 124 } 125 //右の判定 126 if(num_h <6) { 127 if(board[num_v][num_h+1] != num_play) { 128 for(int i = 2; true; i++) { 129 //駒がないとき 130 if(num_h + i > 7 || STONE_STR[board[num_v][num_h + i]].equals("□")) { 131 break; 132 }//自分の駒のとき 133 else if (board[num_v][num_h+i] == num_play) { 134 //ひっくり返す 135 for(int j = 1; j < i; j++) { 136 board[num_v][num_h + j] = num_play; 137 } 138 break; 139 } 140 } 141 } 142 } 143 //右下の判定 144 if(num_v <6 && num_h <6) { 145 if(board[num_v+1][num_h+1] != num_play) { 146 for(int i = 2; true; i++) { 147 //駒がないとき 148 if(num_v + i > 7 || num_h + i > 7 || STONE_STR[board[num_v + i][num_h + i]].equals("□")) { 149 break; 150 }//自分の駒のとき 151 else if (board[num_v+i][num_h+i] == num_play) { 152 //ひっくり返す 153 for(int j = 1; j < i; j++) { 154 board[num_v +j][num_h + j] = num_play; 155 } 156 break; 157 } 158 } 159 } 160 } 161 //真下の判定 162 if (num_v <6) { 163 if(board[num_v+1][num_h] != num_play) { 164 for(int i = 2; true; i++) { 165 //駒がないとき 166 if(num_v + i > 7 || STONE_STR[board[num_v + i][num_h]].equals("□")) { 167 break; 168 }//自分の駒のとき 169 else if (board[num_v+i][num_h] == num_play) { 170 //ひっくり返す 171 for(int j = 1; j < i; j++) { 172 board[num_v + j][num_h] = num_play; 173 } 174 break; 175 } 176 } 177 } 178 } 179 //左下の判定 180 if(num_v < 6 && num_h >1) { 181 if(board[num_v+1][num_h-1] != num_play) { 182 for(int i = 2; true; i++) { 183 //駒がないとき 184 if(num_v + i > 7 || num_h -i < 0 || STONE_STR[board[num_v + i][num_h - i]].equals("□")) { 185 break; 186 }//自分の駒のとき 187 else if (board[num_v + i][num_h -i] == num_play) { 188 //ひっくり返す 189 for(int j = 1; j < i; j++) { 190 board[num_v +j][num_h - j] = num_play; 191 } 192 break; 193 } 194 } 195 } 196 } 197 //左の判定 198 if(num_h > 1) { 199 if(board[num_v][num_h-1] != num_play) { 200 for(int i = 2; true; i++) { 201 //駒がないとき 202 if(num_h -i < 0 || STONE_STR[board[num_v][num_h - i]].equals("□")) { 203 break; 204 }//自分の駒のとき 205 else if (board[num_v][num_h - i] == num_play) { 206 //ひっくり返す 207 for(int j = 1; j < i; j++) { 208 board[num_v][num_h - j] = num_play; 209 } 210 break; 211 } 212 } 213 } 214 } 215 // 盤面を表示 216 print_board(); 217 }else { 218 // 既に駒がおいてある位置を指定した場合 219 System.out.println("そこは置けません。"); 220 continue; 221 } 222 // 白黒の切り替え 223 num_play = (num_play % 2) + 1; 224 num_hand++; 225 } 226 scan.close(); // データ読み込みの完了 227 } 228 229} 230

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

実際にオセロをやりながら考えましょう。
Daregadaさんの指摘通り、「最低1つ石を裏返せる」マスでなければ石を置けません。では、あなたは石が置けるか置けないかをどのようにして判断していますか?それがわかれば、プログラムにそれをさせればいいだけです。

投稿2020/07/22 03:15

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

新たに変数を作ることで解決しました。
お手数をおかけしました。

投稿2020/07/23 02:25

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

オセロで駒がおけるのは、「隣接した場所に駒があるマス」ではありません。
「そこに置くと、最低ひとつは相手の駒をひっくり返せるマス」です。
そのため、「どこにも駒が置けない」展開が生じます(パスをする)。
白黒とも、「どこにも駒が置けない」状態になると、(空いているマスがあっても)そこでゲームは終了になります。

投稿2020/07/21 14:22

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/22 02:31

そうなのですね、すみません勘違いしていました。 そういうことでしたら、ひっくり返す条件式のところに石を置く式を書くということであっていますか? また、パスする場合の式は石を置く条件式の最後に入れるのですか?それとも他に方法があるのでしょうか? お答えいただけると助かります。
Daregada

2020/07/22 02:40

いや、あなたのコードは読んでいないのでそこまでは付き合えない。 「隣接した場所に駒があるマス」のうち、「実際に駒を置いたときに相手の駒をひっくり返せるかどうか」のチェックを通ったマスだけが対象になるでしょう。 そのマスがひとつもないときには、パス(相手に手番を渡す)ことになります。 なお、おけるマスがひとつでもあれば、(どんなに置きたくない場所であっても)そこに駒を置かなければならない(自由にパスはできない)のがオセロのルールです。
退会済みユーザー

退会済みユーザー

2020/07/22 03:23

お答えいただきありがとうございます。 自分で考えなければならいないところを、余計に聞いてしまい申し訳ありませんでした。検討してみます。
guest

0

どのようにすれば隣接しているところだけ置けるようにすることができるでしょうか?

// 盤面の外には置けない
のコメント付近で、置いたマスの周囲に駒があるかチェックをすればいいです。

最終的に駒数を数えて勝敗を判定したいのですが、どのようなアプローチをすればよいでしょうか?

単純に実装するのであれば、手番が変わるときに、手番を数えて60手目が打ち終わったときや、盤の内容を確認して空きが無ければ終了とすれば良いでしょう。
その際にコマの数を数えれば勝敗の判定ができます。

投稿2020/07/21 14:19

Kaleidoscope

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/22 02:25

回答ありがとうございます。 置いたマスの周囲にコマがあるかの確認は8方向すべて確認する形でいいのでしょうか?それとも他のもっと良い方法があるのでしょうか? お答えいただけると助かります。
Kaleidoscope

2020/07/22 11:05

他の方の回答の通り厳密なルールとしては正しくないですが、 とりあえずの「なんちゃってオセロ」を作る場合としては上記回答になります。 周囲の確認は8方向確認するのが手っ取り早い実装でしょうね。 正式なルールに則って作る場合、終了条件は盤面が埋まった場合だけでなく、両者がパス(置ける場所がない)場合も含まれます。
退会済みユーザー

退会済みユーザー

2020/07/23 02:19

お答えいただきありがとうございます。 検討してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問