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

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

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

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

Q&A

解決済

2回答

2500閲覧

オセロの駒が置けません

sobue

総合スコア329

Java

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

0グッド

0クリップ

投稿2016/03/19 15:19

編集2016/03/19 15:51

java

1package reversi; 2 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.event.MouseEvent; 6import java.util.Observable; 7import java.util.Observer; 8 9import javax.swing.JOptionPane; 10import javax.swing.JPanel; 11import javax.swing.event.MouseInputListener; 12 13public class MainPanel extends JPanel implements MouseInputListener, Observer { 14 15 static final int SIZE = 50; 16 static final int W = SIZE * 8; 17 static final int H = SIZE * 8; 18 19 GameState state = new GameState(); 20 RandomCPU cpu = new RandomCPU(); 21 22 public MainPanel() { 23 // TODO 自動生成されたコンストラクター・スタブ 24 setPreferredSize(new Dimension(W, H)); 25 addMouseListener(this); 26 27 state.addObserver(this); 28 29 } 30 31 public void paintComponent(java.awt.Graphics g) { 32 g.setColor(Color.LIGHT_GRAY); 33 g.fillRect(0, 0, W, H); 34 35 g.setColor(Color.BLACK); 36 for (int i = 0; i < 8; i++) { 37 g.drawLine(0, i * SIZE, W, i * SIZE); 38 g.drawLine(i * SIZE, 0, i * SIZE, H); 39 40 } 41 g.setColor(Color.DARK_GRAY); 42 43 for (int y = 0; y < 8; y++) { 44 45 for (int x = 0; x < 8; x++) { 46 47 if (state.data[x][y] == 1) { 48 g.setColor(Color.BLACK); 49 g.fillOval(x * SIZE, y * SIZE, SIZE, SIZE); 50 } else if (state.data[x][y] == -1) { 51 g.setColor(Color.WHITE); 52 g.fillOval(x * SIZE, y * SIZE, SIZE, SIZE); 53 54 } 55 } 56 57 g.setColor(Color.RED); 58 g.drawString("TURN = " + state.turn, 10, 30); 59 g.drawString("PLAYER = " + state.player, 10, 50); 60 g.drawString("DISCARDING = " + state.black + ":", 10, 70); 61 } 62 63 } 64 65 @Override 66 public void mouseClicked(MouseEvent e) { 67 // TODO 自動生成されたメソッド・スタブ 68 69 } 70 71 @Override 72 public void mousePressed(MouseEvent e) { 73 // TODO 自動生成されたメソッド・スタブ 74 int x = e.getX(); 75 int y = e.getY(); 76 77 x /= SIZE; 78 y /= SIZE; 79 System.out.println("(x+y);=(" + x + "," + y + ")"); 80 81 if (state.put(x, y) == false) { 82 JOptionPane.showMessageDialog(this, "Can't put this areal"); 83 } 84 if (state.turn == 60) { 85 JOptionPane.showMessageDialog(this, "End"); 86 87 } else if (state.checkPass() == true) { 88 state.player *= -1; 89 JOptionPane.showMessageDialog(this, "Pass! Next turn is " + state.player); 90 } 91 92 // CPUのターン 93 if (state.player == cpu.color) { 94 95 int action[] = cpu.decide(state); 96 if (action[0] != -1) 97 state.put(action[0], action[1]); 98 99 // 盤面が埋まったら終了 100 if (state.turn == 60) { 101 JOptionPane.showMessageDialog(this, "End!"); 102 } 103 // パスチェック 104 else if (state.checkPass() == true) { 105 JOptionPane.showMessageDialog(this, "Pass! Next turn is " + state.turn); 106 } 107 } 108 } 109 110 @Override 111 public void mouseReleased(MouseEvent e) { 112 // TODO 自動生成されたメソッド・スタブ 113 114 } 115 116 @Override 117 public void mouseEntered(MouseEvent e) { 118 // TODO 自動生成されたメソッド・スタブ 119 120 } 121 122 @Override 123 public void mouseExited(MouseEvent e) { 124 // TODO 自動生成されたメソッド・スタブ 125 126 } 127 128 @Override 129 public void mouseDragged(MouseEvent e) { 130 // TODO 自動生成されたメソッド・スタブ 131 132 } 133 134 @Override 135 public void mouseMoved(MouseEvent e) { 136 // TODO 自動生成されたメソッド・スタブ 137 138 } 139 140 @Override 141 public void update(Observable o, Object arg) { 142 // TODO 自動生成されたメソッド・スタブ 143 repaint(); 144 } 145 146} 147 148 149package reversi; 150 151import java.util.Observable; 152 153public class GameState extends Observable { 154 int data[][]; 155 int turn; 156 int player; 157 int black; 158 int white; 159 160 public GameState() { 161 // TODO 自動生成されたコンストラクター・スタブ 162 data = new int[8][8]; 163 data[3][3] = 1; 164 data[3][4] = -1; 165 data[4][3] = -1; 166 data[4][4] = 1; 167 168 turn = 0; 169 player = 1; 170 black = 2; 171 white = 2; 172 } 173 174 public boolean put(int x, int y) { 175 if (data[x][y] != 0) { 176 return false; 177 } 178 179 return false; 180 181 } 182 183 public boolean reverse(int x, int y, boolean doReverse) { 184 int dir[][] = { { 1, 1 }, { 0, -1 }, { 1, -1 }, 185 { -1, 0 }, { 1, 0 }, 186 { -1, 1 }, { 0, 1 }, { 1, 1 } 187 188 }; 189 boolean reversed = false; 190 for (int i = 0; i < 8; i++) { 191 int x0 = x + dir[i][0]; 192 int y0 = y + dir[i][1]; 193 if (isOut(x0, y0) == true) { 194 continue; 195 } 196 int nextState = data[x0][y0]; 197 if (nextState == player) { 198 System.out.println("NEXT state is player: " + x0 + "," + y0); 199 continue; 200 } else if (nextState == 0) { 201 System.out.println("NEXT state is null:" + x0 + "," + y0); 202 } else { 203 System.out.println("NEXT state is null:" + x0 + "," + y0); 204 } 205 206 int j = 2; 207 while (true) { 208 209 int x1 = x + (dir[i][0] * j); 210 int y1 = y + (dir[i][1 * j]); 211 if (isOut(x1, y1) == true) { 212 break; 213 214 } 215 if (data[x1][y1] == player) { 216 System.out.println("Player cell: " + x1 + "," + y1); 217 218 if (doReverse) { 219 for (int k = 1; k < j; k++) { 220 int x2 = x + (dir[i][0 * k]); 221 int y2 = y + (dir[i][1 * k]); 222 data[x2][y2] *= -1; 223 System.out.println("reverse" + x2 + "," + y2); 224 } 225 } 226 reversed = true; 227 break; 228 } 229 if (data[x1][y1] == 0) { 230 break; 231 232 } 233 j++; 234 } 235 } 236 return reversed; 237 } 238 239 public boolean canReverse(int x, int y) { 240 return reverse(x, y, false); 241 } 242 243 public boolean isOut(int x, int y) { 244 if (x < 0 || y < 0 || x >= 8 || y >= 8) { 245 return true; 246 } 247 return false; 248 249 } 250 251 public boolean checkPass() { 252 for (int y = 0; y < 8; y++) { 253 for (int x = 0; x < 8; x++) { 254 255 if (data[x][y] != 0) { 256 continue; 257 } 258 if (canReverse(x, y) == true) { 259 return false; 260 261 } 262 } 263 } 264 return true; 265 } 266 267 public void countDisc() { 268 black = 0; 269 white = 0; 270 271 for (int y = 0; y < 8; y++) { 272 for (int x = 0; x < 8; x++) { 273 if (data[x][y] == 1) { 274 black++; 275 } else if (data[x][y] == -1) { 276 white++; 277 278 } 279 } 280 } 281 } 282} 283

上記のコードで

java

1if (state.put(x, y) == false) { 2 JOptionPane.showMessageDialog(this, "Can't put this areal"); 3 }

この部分のエラー表示が出て駒が置けません。
Eclipseにてブレークポイントを置いてみましたが、なぜか引っかからずに特定できません。
よろしくお願いします。

下記追加コードです

java

1package reversi; 2import java.util.*; 3 4public class RandomCPU { 5 6 int color; //BLACK or WHITE 7 8 public RandomCPU(){ 9 color = -1; 10 } 11 12 int[] decide(GameState state){ 13 14 ArrayList<int[]> array = new ArrayList<int[]>(); 15 16 //盤面の空マスを置けるかチェック 17 for(int y=0; y<8; y++){ 18 for(int x=0; x<8; x++){ 19 20 //すでに駒があるときはパス 21 if(state.data[x][y] != 0) 22 continue; 23 24 //置けるマスのとき、候補として記憶 25 if(state.canReverse(x, y) == true){ 26 int pos[] = {x,y}; 27 array.add(pos); 28 } 29 30 } 31 } 32 33 //ランダム選択 34 if(array.size() <= 0){ 35 int pos[] = {-1, -1}; 36 return pos; 37 } 38 Random rnd = new Random(); 39 int index = rnd.nextInt(array.size()); 40 41 return array.get(index); 42 } 43 44} 45 46 47package reversi; 48 49import javax.swing.*; 50 51public class othello extends JFrame { 52 53 public othello() { 54 setTitle("Othello"); 55 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 56 57 MainPanel panel = new MainPanel(); 58 getContentPane().add(panel); 59 pack(); 60 } 61 62 public static void main(String[] args){ 63 64 othello othello= new othello(); 65 othello.setVisible(true); 66 67 } 68 69} 70

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

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

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

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

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

heignamerican

2016/03/19 15:27 編集

> この部分のエラー表示が出て駒が置けません。 どんなエラーが表示されましたか? > Eclipseにてブレークポイントを置いてみましたが Eclipse から実行すると、デバッグで一時停止できなくてもスタックトレースは見られると思います。ここは何が表示されましたか? (自分で試そうと思ったのですが、RandomCPU が含まれておらず実行できませんでした)
guest

回答2

0

ベストアンサー

自色は黒ですかね?

どこをクリックしても、画面にアラートが出た後に以下のような例外が出てます

int y1 = y + (dir[i][1 * j]);

ここで配列のインデックスをはみ出してアクセスしているようですね。
(ちゃんとコード読んでないので、i と j どっち側が問題かは分かってないです)

スタックトレースはちゃんと読みましょう。重要な情報が詰まっています

例外↓

(x+y);=(3,5)

NEXT state is null:1,1
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2
at reversi.GameState.reverse(GameState.java:62)
at reversi.GameState.canReverse(GameState.java:92)
at reversi.GameState.checkPass(GameState.java:110)
at reversi.MainPanel.mousePressed(MainPanel.java:87)
(以下略)

投稿2016/03/19 16:00

heignamerican

総合スコア94

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

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

0

下記どちらもfalseを返していますが、あっていますか?
GameState#put()です。

Java

1public boolean put(int x, int y) { 2 if (data[x][y] != 0) { 3 return false; // オセロのコマが置いてあればfalse 4 } 5 return false; // オセロのコマが置いてなくてもfalse(多分trueでは?) 6}

これだと下記if()文が必ず実行されてしまいますね。

Java

1if (state.put(x, y) == false) { 2 // ここが必ず実行されてしまう 3 JOptionPane.showMessageDialog(this, "Can't put this areal"); 4}

投稿2016/03/19 15:32

編集2016/03/19 15:40
Odacchi

総合スコア907

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

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

sobue

2016/03/19 15:45 編集

メッセージは解決しましたが・・・・駒が置けないのは変わりません。
Odacchi

2016/03/19 15:58 編集

putメソッドの中身を書く必要があるかと思います。 今のままでは何もputしていません。ただtrueかfalseを返しているだけです。 public boolean put(int x, int y) { if (data[x][y] != 0) { return false; // オセロのコマが置いてあればfalse } data[x][y] = player; // しっかり読んでないのでわかりませんが、そのターンのユーザーのコマである1か-1をいれるという処理を入れてください。 return true; }
sobue

2016/03/19 16:00

public boolean put(int x, int y) { if (data[x][y] != 0) { return false; } if (reverse(x, y, true) == false) { return false; } data[x][y] = player; player *= -1; turn++; countDisc(); setChanged(); notifyObservers(); return true; } と記入しています。がダメでした
Odacchi

2016/03/19 16:07 編集

オセロの流れ的にちょっと違和感がありました。 下記いかがですか? public boolean put(int x, int y) { if (data[x][y] != 0 || !canReverse(x,y)) { // putしたい場所にすでにコマがある or 置けても何も反転できなければfalseを返す。 return false; } data[x][y] = player; // playerのコマを置く reverse(x, y, true); // コマの反転処理 player *= -1; // ターン変更 turn++; // ターンをすすめる countDisc(); setChanged(); notifyObservers(); return true; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問