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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

2267閲覧

オセロプログラミングで正常に動かない部分があります ※コード貼り付けの為長文になっています

omikuji

総合スコア60

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

1クリップ

投稿2015/10/21 06:57

当方プログラミング初心者です。度々こちらで質問させて頂いております。
オセロの土台の部分は出来ているのですが、引っくり返すときに正常にひっくり返るときと全く違うところがひっくり返ってしまうことがあります。
一応全文のプログラムを貼り付けましたが、問題の部分はcheckRev()メソッドにあると思っています。
コメントもほとんどつけておらず非常に読みづらいプログラムだと思いますが、可能であれば誤りを指摘していただけるとありがたいです。

他に情報の補足が必要であれば質問してください。

package othello;

public class Main {

public static void main(String[] args){ Board b = new Board(); Piece p = new Piece(); p.pieceSetting(); b.putPiece(); }

}

package othello;

import javax.swing.JButton;

public class Piece extends JButton{

static int[][] p = new int[10][10]; public static final int OFFMAP =-1; //盤外 public static final int NULL = 0; //コマが無いマス public static final int BLACK = 1; public static final int WHITE = 2; static int turn = BLACK; public void pieceSetting(){ for(int i=0; i<100; i++) { int x = i%10; int y = i/10; if(x==0 || x== 9 || y==0 || y==9) { p[x][y] = OFFMAP; } else { p[x][y] = NULL; } } p[4][4] = BLACK; p[5][5] = BLACK; p[4][5] = WHITE; p[5][4] = WHITE; // 初期配置 } public static void checkRev(int sx, int sy){ int mx = -1; int my = -2; int revX = sx; int revY = sy; for(int i=0; i<9; i++) { if(mx == 0 && my == -1) { my = my + 2; } else if(my != 1) { my++; } else { mx++; my = -1; } while(p[sx+mx][sy+my] != turn && p[sx+mx][sy+my] > 0) { sx = sx+mx; sy = sy+my; } if(p[sx+mx][sy+my] == turn){ while(p[revX+mx][revY+my] != turn && p[revX+mx][revY+my] > 0) { p[revX+mx][revY+my] = turn; revX = revX+mx; revY = revY+my; } } } }

}

package othello;

import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Board implements ActionListener{

Piece[][] pButton; JFrame frame = new JFrame("Othello"); JPanel panel = new JPanel(); JButton[][] b = new JButton[8][8]; public Board(){ frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(680,700); panel.setLayout(null); panel.setBackground(Color.WHITE); frame.add(panel); pButton = new Piece[8][8]; for(int i=0; i<64; i++) { int x = i/8; int y = i%8; pButton[x][y] = new Piece(); pButton[x][y].setSize(80,80); pButton[x][y].setBounds(x*80+10, y*80+10, 80, 80); pButton[x][y].setMargin(new Insets(0,0,0,0)); pButton[x][y].setBackground(Color.GRAY); pButton[x][y].setFont(new Font("MSゴシック", Font.PLAIN, 60)); pButton[x][y].setActionCommand(String.valueOf(i)); //ボタン判別に利用 pButton[x][y].addActionListener(this); panel.add(pButton[x][y]); } } public void actionPerformed(ActionEvent e) { String str = e.getActionCommand(); System.out.println(str); int data = Integer.parseInt(str); int x = data/8; int y = data%8; Piece.p[x+1][y+1] = Piece.turn; Piece.checkRev(x+1,y+1); putPiece(); if(Piece.turn == Piece.BLACK){ Piece.turn = Piece.WHITE; }else{ Piece.turn = Piece.BLACK; } } public void putPiece(){ for(int i=0; i<100; i++) { int x = i/10; int y = i%10; if(Piece.p[x][y] == Piece.BLACK) { pButton[x-1][y-1].setText("●"); } else if(Piece.p[x][y] == Piece.WHITE) { pButton[x-1][y-1].setText("○"); } } }

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

反転自体以外にも、なにも反転できない場合でも次の手番になってしまうなどの
動きや、設計についても気になりますが、
ひとまず、問題と思われる箇所を指摘します。

lang

1 for(int i=0; i<9; i++)

ここは、i<8では?

また、このforループでは、
sxとsyがループの途中で変わってしまうので、
次のループで、変わった位置からスタートしてしまいます。
引数のsx、syを保存しておいて、ループの最初で保存したものに
戻す処理が必要と思います。
あわせて、revX、revYも戻す必要がありますね。

具体的な修正結果が必要であれば、
コメントいただければ、追記します。

投稿2015/10/21 11:02

eripong

総合スコア1546

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

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

omikuji

2015/10/21 12:20

ありがとうございます。 ひとまず自分で直してみます。どうしても修正できないようだったらもう一度コメントさせて頂きます。
omikuji

2015/10/21 13:14

ありがとうございます。解決しました。 ご指摘のなにも反転できない場合の動きであったり、すでにコマが置いてあるマスをクリックできてしまうなどのエラー処理はまだ出来ていませんがとりあえず引っくり返す動作はうまく行きました。 わかりづらいプログラム・長文だったにも関わらず丁寧な指摘ありがとうございました!
eripong

2015/10/21 13:15

お、良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問