課題で出た基礎的なコードを応用しているため、とても遠回りなコードになっていると思われます。
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
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。