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

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

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

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

Q&A

解決済

2回答

2447閲覧

javaのまるばつゲームのリセット方法とFontの変換

syachi

総合スコア3

Java

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

0グッド

0クリップ

投稿2021/11/19 15:49

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
javaで○×ゲームのコードを自分で改造するという課題で以下のように改造したいのですが、できません。
1,ゲーム終了後に盤面をもう一度クリックすると、再度ゲームが始まるようにする
2,"引き分け"などの文字を大きくする

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

java

1クラス1 2 3public class OXmodel { 4 private int brd[][]; 5 private int turn; 6 OXmodel() { 7 brd = new int[3][3]; 8 for(int y=0 ; y<3 ; y++) { 9 for(int x=0 ; x<3 ; x++) { 10 brd[y][x] = 0; 11 } 12 } 13 turn=1; 14 } 15 public int getCell(int x, int y) { return brd[y][x]; } 16 public void put(int x, int y) { 17 if (judge() != -1) return; 18 if ((0<=x)&&(x<3)&&(0<=y)&&(y<3)&&(brd[y][x]==0)) { 19 brd[y][x]=turn; 20 turn=3-turn; 21 } 22 } 23 public int judge() { 24 for(int i=0 ; i<3 ; i++) { 25 if ((brd[i][0]!=0)&& 26 (brd[i][0]==brd[i][1])&&(brd[i][1]==brd[i][2])) { 27 return brd[i][0]; 28 } 29 if ((brd[0][i]!=0)&& 30 (brd[0][i]==brd[1][i])&&(brd[1][i]==brd[2][i])) { 31 return brd[0][i]; 32 } 33 } 34 if (brd[1][1]!=0) { 35 if ((brd[0][0]==brd[1][1])&&(brd[2][2]==brd[1][1])) { 36 return brd[1][1]; 37 } 38 if ((brd[2][0]==brd[1][1])&&(brd[0][2]==brd[1][1])) { 39 return brd[1][1]; 40 } 41 } 42 int c=0; 43 for(int y=0 ; y<3 ; y++) { 44 for(int x=0 ; x<3 ; x++) { 45 if (brd[y][x]==0) { c++; } 46 } 47 } 48 if (c == 0) return 0; 49 return -1; 50 } 51 52} 53 54クラス2 55 56import java.awt.Canvas; 57import java.awt.Color; 58import java.awt.Graphics; 59import java.awt.Font; 60 61public class OXview extends Canvas{ 62 private OXmodel model; 63 OXview(OXmodel model) { 64 setSize(400,400); 65 this.model = model; 66 } 67 @Override 68 public void paint(Graphics g) { 69 g.setColor(Color.white); 70 g.fillRect(0,0,400,400); 71 g.setColor(Color.black); 72 for(int i=0 ; i<2 ; i++) { 73 g.drawLine(20,140+i*120,380,140+i*120); 74 g.drawLine(140+i*120,20,140+i*120,380); 75 } 76 for(int y=0 ; y<3 ; y++) { 77 for(int x=0 ; x<3 ; x++) { 78 int bx=x*120+20, by=y*120+20; 79 int c = model.getCell(x, y); 80 if (c == 1) { 81 g.setColor(Color.red); 82 g.drawOval(bx+20,by+20,80,80); 83 } else if (c == 2) { 84 g.setColor(Color.blue); 85 g.drawLine(bx+20,by+20,bx+100,by+100); 86 g.drawLine(bx+20,by+100,bx+100,by+20); 87 } 88 } 89 } 90 int j = model.judge(); 91 92 if (j == 0) { 93 g.setColor(Color.black); 94 g.drawString("引き分け",100,100); 95 } else if (j == 1) { 96 g.setColor(Color.black); 97 g.drawString("〇の勝ち",100,100); 98 } else if (j == 2) { 99 g.setColor(Color.black); 100 g.drawString("×の勝ち",100,100); 101 } 102 } 103} 104 105クラス3 106 107import java.awt.event.MouseEvent; 108import java.awt.event.MouseListener; 109import javax.swing.JFrame; 110 111public class OX implements MouseListener { 112 private OXmodel model; 113 private OXview view; 114 OX() { 115 model = new OXmodel(); 116 view = new OXview(model); 117 JFrame frame = new JFrame(); 118 frame.add(view); 119 view.addMouseListener(this); 120 frame.pack(); 121 frame.setVisible(true); 122 view.repaint(); 123 } 124 public void mouseClicked(MouseEvent e) { 125 int bx=e.getX(),by=e.getY(); 126 if ((20<=bx)&&(bx<380)&&(20<=by)&&(by<380)) { 127 int x=(bx-20)/120, y=(by-20)/120; 128 model.put(x,y); 129 view.repaint(); 130 } 131 } 132 public void mousePressed(MouseEvent e) {} 133 public void mouseReleased(MouseEvent e) {} 134 public void mouseExited(MouseEvent e) {} 135 public void mouseEntered(MouseEvent e) {} 136 137 public static void main(String[] args) { 138 new OX(); 139 } 140} 141 142

試したこと

1についてOXmodelクラスのgetCellメソッドにおいて、
if (judge() != -1) return;

if (judge() != -1)
for(int y1=0 ; y1<3 ; y1++) {
for(int x1=0 ; x1<3 ; x1++) {
brd[y1][x1] = 0;
と書いたところ、盤面がりセットされると同時に次のマスが書かれてしまうので、1ターン開けてから始まるようにしたいです。

2についてjava.awt.Font クラスと、GraphicsクラスのsetFontメソッドを使って書きたいのですが、
g.setColor(Color.black);
g.setFont(Font ~);
g.drawString("引き分け",100,100);
と書いたところエラーが出ました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2021/11/19 16:12

コードのマークダウンはファイル毎に分けて頂けますか。コピペの際に修正が必要になり、修正で間違えてしまうと現象が再現できなくなる可能性があります。 > ~ 1ターン開けてから ~ 「ターン」とは何のことでしょう。 > ~ エラーが出ました。 エラーの詳細をご提示ください。
jimbe

2021/11/19 16:37

Swing(JFrame) と AWT(Canvas) のコンポーネントを混在しての使用は危険ですので避けた方が良いと思います。
TN8001

2021/11/19 21:58

> g.setFont(Font ~); 肝心のところを省略しないでください。 > と書いたところエラーが出ました。 エラーが出たのならエラー文を記載してください。
BeatStar

2021/11/19 23:26

エラーメッセージを読みましょう。 エラーメッセージは罵倒ではなく、「コンパイラ等からのメッセージ」です。
guest

回答2

0

ベストアンサー

いろいろ弄っていたらこんななりました。

java

1package teratail_java.q370179; 2 3import java.awt.BorderLayout; 4 5import javax.swing.*; 6 7public class OX extends JFrame { 8 public static void main(String[] args) { 9 new OX().setVisible(true); 10 } 11 12 OX() { 13 super("OX"); 14 setDefaultCloseOperation(EXIT_ON_CLOSE); 15 16 JPanel backpanel = new JPanel(new BorderLayout()); 17 backpanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); 18 add(backpanel); 19 20 backpanel.add(new OXview(new OXmodel())); 21 22 pack(); 23 } 24}

java

1package teratail_java.q370179; 2 3import java.awt.Color; 4import java.awt.Graphics; 5 6enum Cell { 7 SPACE("引き分け") { 8 void draw(Graphics g, int x, int y, int size) {} 9 }, 10 CIRCLE("〇の勝ち") { 11 void draw(Graphics g, int x, int y, int size) { 12 g.setColor(Color.RED); 13 g.drawOval(x,y,size,size); 14 } 15 }, 16 CROSS("×の勝ち"){ 17 void draw(Graphics g, int x, int y, int size) { 18 g.setColor(Color.BLUE); 19 g.drawLine(x,y,x+size,y+size); 20 g.drawLine(x,y+size,x+size,y); 21 } 22 }; 23 24 private String result; 25 Cell(String result) { 26 this.result = result; 27 } 28 abstract void draw(Graphics g, int x, int y, int size); 29 Cell next() { return this == CIRCLE ? CROSS : CIRCLE; } 30 String getResult() { return result; } 31}

java

1package teratail_java.q370179; 2 3import java.awt.*; 4import java.awt.event.MouseEvent; 5import java.awt.event.MouseListener; 6 7import javax.swing.*; 8 9public class OXview extends JPanel { 10 private static final int SIZE = 120; 11 12 private class OXMouseListener implements MouseListener { 13 @Override 14 public void mouseClicked(MouseEvent e) { 15 //System.out.println("mouseClicked: "+e); 16 if(startLabel.isVisible()) { 17 start(); 18 return; 19 } 20 21 int x = e.getX() / SIZE; 22 int y = e.getY() / SIZE; 23 if(model.get(x,y) != Cell.SPACE) return; 24 Cell winner = model.set(x,y); 25 repaint(); 26 27 if(winner != null) end(winner); 28 } 29 30 @Override 31 public void mousePressed(MouseEvent e) {} 32 @Override 33 public void mouseReleased(MouseEvent e) {} 34 @Override 35 public void mouseExited(MouseEvent e) {} 36 @Override 37 public void mouseEntered(MouseEvent e) {} 38 } 39 40 private JLabel startLabel, resultLabel; 41 private OXmodel model; 42 43 OXview(OXmodel model) { 44 super(null); 45 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 46 setPreferredSize(new Dimension(SIZE*3,SIZE*3)); 47 setMinimumSize(getPreferredSize()); 48 setBackground(Color.white); 49 addMouseListener(new OXMouseListener()); 50 51 this.model = model; 52 53 startLabel = createLabel("CLICK TO (RE)START !", Color.RED, true); 54 resultLabel = createLabel("", Color.BLACK, false); 55 56 add(Box.createVerticalGlue()); 57 add(startLabel); 58 add(Box.createVerticalGlue()); 59 add(resultLabel); 60 add(Box.createVerticalGlue()); 61 } 62 63 private JLabel createLabel(String text, Color color, boolean visible) { 64 JLabel label = new JLabel(text); 65 label.setMaximumSize(new Dimension(Short.MAX_VALUE, (int)label.getMaximumSize().getHeight())); 66 label.setHorizontalAlignment(SwingConstants.CENTER); 67 label.setFont(label.getFont().deriveFont(30f)); 68 label.setForeground(color); 69 label.setVisible(visible); 70 return label; 71 } 72 73 private void start() { 74 startLabel.setVisible(false); 75 resultLabel.setVisible(false); 76 model.clear(); 77 repaint(); 78 } 79 80 private void end(Cell winner) { 81 startLabel.setVisible(true); 82 resultLabel.setText(winner.getResult()); 83 resultLabel.setVisible(true); 84 repaint(); 85 } 86 87 @Override 88 public void paintComponent(Graphics g) { 89 super.paintComponent(g); 90 91 g.setColor(Color.black); 92 for(int i=0 ; i<2 ; i++) { 93 g.drawLine(0,SIZE+i*SIZE,SIZE*3,SIZE+i*SIZE); 94 g.drawLine(SIZE+i*SIZE,0,SIZE+i*SIZE,SIZE*3); 95 } 96 97 for(int y=0 ; y<3 ; y++) { 98 for(int x=0 ; x<3 ; x++) { 99 int bx = x*SIZE, by = y*SIZE; 100 model.get(x, y).draw(g, bx+10, by+10, SIZE-20); 101 } 102 } 103 } 104}

java

1package teratail_java.q370179; 2 3public class OXmodel { 4 private Cell brd[][] = new Cell[3][3]; 5 private Cell turn; 6 7 OXmodel() { 8 clear(); 9 } 10 11 void clear() { 12 for(int y=0 ; y<3 ; y++) { 13 for(int x=0 ; x<3 ; x++) { 14 brd[y][x] = Cell.SPACE; 15 } 16 } 17 turn = Cell.CIRCLE; 18 } 19 20 Cell get(int x, int y) { 21 return brd[y][x]; 22 } 23 24 Cell set(int x, int y) { 25 brd[y][x] = turn; 26 turn = turn.next(); 27 return judge(); 28 } 29 30 private Cell judge() { 31 for(int i=0 ; i<3 ; i++) { 32 if(brd[i][0]!=Cell.SPACE && brd[i][0]==brd[i][1] && brd[i][1]==brd[i][2]) { 33 return brd[i][0]; 34 } 35 if(brd[0][i]!=Cell.SPACE && brd[0][i]==brd[1][i] && brd[1][i]==brd[2][i]) { 36 return brd[0][i]; 37 } 38 } 39 40 if(brd[1][1]!=Cell.SPACE) { 41 if(brd[0][0]==brd[1][1] && brd[2][2]==brd[1][1]) { 42 return brd[1][1]; 43 } 44 if(brd[2][0]==brd[1][1] && brd[0][2]==brd[1][1]) { 45 return brd[1][1]; 46 } 47 } 48 49 for(int y=0 ; y<3 ; y++) { 50 for(int x=0 ; x<3 ; x++) { 51 if(brd[y][x] == Cell.SPACE) return null; //勝負はまだついていない 52 } 53 } 54 return Cell.SPACE; //引き分け 55 } 56}

投稿2021/11/19 20:31

jimbe

総合スコア13209

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

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

syachi

2021/11/20 02:28

とても分かりやすかったです。 ありがとうございました!
syachi

2021/11/20 03:49

すいません。 盤面に表示される○と☓を太くするにはどのように書いたら良いですか?
jimbe

2021/11/20 07:31 編集

マルバツは Cell の各 draw メソッドで書いていますので、 g を使って太くしてください。 [【Java】図形等の線幅や線の形を変更する](https://nompor.com/2017/12/04/post-1532/ )
guest

0

ゲーム終了後に盤面をもう一度クリックすると、再度ゲームが始まるようにする

「マウスクリック時にゲームが終了していたら初期化する」ように動けば良いのだと思うので、
修正すべきは、クリックしたときの処理である OX.mouseClicked() です。

盤面 (OXmodel) の初期化処理を追加することになると思いますが、
これは、OXmodel のコンストラクタの中身と一緒ですよね?

そこで、初期化処理メソッドを新たに作成してコンストラクタの中身を移し、
コンストラクタと mouseClicked() の両方から呼ぶようにします。

mouseClicked() の方は、冒頭に if 文で処理を追加します。
ゲームが終了しているかどうかを判定できるメソッドは、既にどこかに作ってありますよね。
初期化後は、"〇の勝ち"とか表示されないように、return 文でメソッドを終了させます。

以上をまとめると、こうなります:

Java

1public class OXmodel { 2 3 OXmodel() { 4 init(); 5 } 6 7 public void init() { 8 // コンストラクタの中身 9 } 10} 11 12public class OX implements MouseListener { 13 14 public void mouseClicked(MouseEvent e) { 15 16 if (ゲームが終了している) { 17 model.init(); 18 view.repaint(); 19 return; 20 } 21 22 // 元々あった処理 23 ・・・・・・ 24 ・・・・・・ 25 } 26}

"引き分け" などの文字を大きくする

Graphics.getFont() でデフォルトフォントを取得し、deriveFont(float size) するのが良いと思います。

g.setFont(g.getFont().deriveFont(20.0f));

蛇足

質問の内容とは関係ありませんが、現在の作りでは、ウィンドウを×ボタンで閉じても、アプリケーションが終了しないと思います。OX クラスのコンストラクタに、以下の1行を追加したほうが良いと思います。

Java

1 OX() { 2 ・・・・・・ 3 JFrame frame = new JFrame(); 4 ・・・・・・ 5 frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // <- この行 6 frame.setVisible(true); 7 ・・・・・・ 8 }

投稿2021/11/19 18:33

momodx

総合スコア185

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問