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

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

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

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

Q&A

解決済

1回答

1593閲覧

オセロの白が表示されない・・・

sobue

総合スコア329

Java

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

0グッド

1クリップ

投稿2016/03/19 14:36

編集2016/03/19 14:43

package reversi;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.MouseInputListener;

public class MainPanel extends JPanel implements MouseInputListener, Observer {

static final int SIZE = 50; static final int W = SIZE * 8; static final int H = SIZE * 8; GameState state = new GameState(); RandomCPU cpu = new RandomCPU(); public MainPanel() { // TODO 自動生成されたコンストラクター・スタブ setPreferredSize(new Dimension(W, H)); addMouseListener(this); state.addObserver(this); } public void paintComponent(java.awt.Graphics g) { g.setColor(Color.LIGHT_GRAY); g.fillRect(0, 0, W, H); g.setColor(Color.BLACK); for (int i = 0; i < 8; i++) { g.drawLine(0, i * SIZE, W, i * SIZE); g.drawLine(i * SIZE, 0, i * SIZE, H); } g.setColor(Color.DARK_GRAY); for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) { if (state.data[x][y] == 1) { if (state.data[x][y] == 1) { g.setColor(Color.BLACK); g.fillOval(x * SIZE, y * SIZE, SIZE, SIZE); } else if (state.data[x][y] == -1) { g.setColor(Color.WHITE); g.fillOval(x * SIZE, y * SIZE, SIZE, SIZE); } } } g.setColor(Color.RED); g.drawString("TURN = " + state.turn, 10, 30); g.drawString("PLAYER = " + state.player, 10, 50); g.drawString("DISCARDING = " + state.black + ":", 10, 70); } } @Override public void mouseClicked(MouseEvent e) { // TODO 自動生成されたメソッド・スタブ } @Override public void mousePressed(MouseEvent e) { // TODO 自動生成されたメソッド・スタブ int x = e.getX(); int y = e.getY(); x /= SIZE; y/=SIZE; System.out.println("(x+y);=("+x+","+y+")"); if (state.put(x, y)==false){ JOptionPane.showMessageDialog(this, "Can't put this areal"); } if(state.turn==60){ JOptionPane.showMessageDialog(this, "End"); }else if(state.checkPass()==true){ state.player*=-1; JOptionPane.showMessageDialog(this, "Pass! Next turn is "+state.player); } //CPUのターン if(state.player == cpu.color){ int action[] = cpu.decide(state); if(action[0] != -1) state.put(action[0], action[1]); //盤面が埋まったら終了 if(state.turn == 60){ JOptionPane.showMessageDialog(this, "End!"); } //パスチェック else if( state.checkPass() == true ){ JOptionPane.showMessageDialog(this, "Pass! Next turn is "+state.turn); } } } @Override public void mouseReleased(MouseEvent e) { // TODO 自動生成されたメソッド・スタブ } @Override public void mouseEntered(MouseEvent e) { // TODO 自動生成されたメソッド・スタブ } @Override public void mouseExited(MouseEvent e) { // TODO 自動生成されたメソッド・スタブ } @Override public void mouseDragged(MouseEvent e) { // TODO 自動生成されたメソッド・スタブ } @Override public void mouseMoved(MouseEvent e) { // TODO 自動生成されたメソッド・スタブ } @Override public void update(Observable o, Object arg) { // TODO 自動生成されたメソッド・スタブ repaint(); }

}

package reversi;

import java.util.Observable;

public class GameState extends Observable {
int data[][];
int turn;
int player;
int black;
int white;

public GameState() { // TODO 自動生成されたコンストラクター・スタブ data = new int[8][8]; data[3][3] = 1; data[3][4] = -1; data[4][3] = -1; data[4][4] = 1; turn = 0; player = 1; black = 2; white = 2; } public boolean put(int x, int y) { if (data[x][y] != 0) { return false; } return false; } public boolean reverse(int x, int y, boolean doReverse) { int dir[][] = { { 1, 1 }, { 0, -1 }, { 1, -1 }, { -1, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } }; boolean reversed = false; for (int i = 0; i < 8; i++) { int x0 = x + dir[i][0]; int y0 = y + dir[i][1]; if (isOut(x0, y0) == true) { continue; } int nextState = data[x0][y0]; if (nextState == player) { System.out.println("NEXT state is player: " + x0 + "," + y0); continue; } else if (nextState == 0) { System.out.println("NEXT state is null:" + x0 + "," + y0); } else { System.out.println("NEXT state is null:" + x0 + "," + y0); } int j = 2; while (true) { int x1 = x + (dir[i][0] * j); int y1 = y + (dir[i][1 * j]); if (isOut(x1, y1) == true) { break; } if (data[x1][y1] == player) { System.out.println("Player cell: " + x1 + "," + y1); if (doReverse) { for (int k = 1; k < j; k++) { int x2 = x + (dir[i][0 * k]); int y2 = y + (dir[i][1 * k]); data[x2][y2] *= -1; System.out.println("reverse" + x2 + "," + y2); } } reversed = true; break; } if (data[x1][y1] == 0) { break; } j++; } } return reversed; } public boolean canReverse(int x, int y) { return reverse(x, y, false); } public boolean isOut(int x, int y) { if (x < 0 || y < 0 || x >= 8 || y >= 8) { return true; } return false; } public boolean checkPass() { for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) { if (data[x][y] != 0) { continue; } if (canReverse(x, y) == true) { return false; } } } return true; } public void countDisc() { black = 0; white = 0; for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) { if (data[x][y] == 1) { black++; } else if (data[x][y] == -1) { white++; } } } }

}
上記のコードでオセロを作ったのですが、白が表示されなくて困っています。初期表示から表示されなくてさらに置かれていないような状態にもなっています。変数などやロジックについてもこの方が・・・・というのがあれば一緒にお願いします。

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

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

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

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

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

swordone

2016/03/19 15:04

コード部分をマークアップしてください。
sobue

2016/03/19 15:07

if (state.put(x, y) == false) { JOptionPane.showMessageDialog(this, "Can't put this areal"); } のメッセージが出て駒が置けません
swordone

2016/03/19 15:11

この質問に書き込む時の話をしています。コードのマークアップ機能があるので、それを使ってこの画面でのコードを見やすく編集してください、という意味です。
guest

回答1

0

ベストアンサー

白が出ないのは余計な判定があるから MainPanel の 以下を直してみて。
×

java

1 for (int y = 0; y < 8; y++) { 2 3 for (int x = 0; x < 8; x++) { 4 5 if (state.data[x][y] == 1) { 6 if (state.data[x][y] == 1) { 7 g.setColor(Color.BLACK); 8 g.fillOval(x * SIZE, y * SIZE, SIZE, SIZE); 9 } else if (state.data[x][y] == -1) { 10 g.setColor(Color.WHITE); 11 g.fillOval(x * SIZE, y * SIZE, SIZE, SIZE); 12 } 13 } 14 } 15 }

java

1 for (int y = 0; y < 8; y++) { 2 3 for (int x = 0; x < 8; x++) { 4 5 if (state.data[x][y] == 1) { 6 g.setColor(Color.BLACK); 7 g.fillOval(x * SIZE, y * SIZE, SIZE, SIZE); 8 } else if (state.data[x][y] == -1) { 9 g.setColor(Color.WHITE); 10 g.fillOval(x * SIZE, y * SIZE, SIZE, SIZE); 11 } 12 } 13 }

投稿2016/03/19 14:52

編集2016/03/19 14:53
lib

総合スコア446

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

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

sobue

2016/03/19 15:02

白は出ましたが・・・どこにも駒が置けないですorz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問