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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

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

Q&A

解決済

3回答

3199閲覧

JAVAにて9×9の盤面のマス目にに順番をつける

yuki_java

総合スコア1

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

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

2グッド

1クリップ

投稿2021/09/04 18:32

編集2021/09/05 06:39

前提・実現したいこと

まず、私はプログラミングを独学ではじめ、なかなか理解できず、とにかく触って慣れていこうと思い、ネット上の様々な情報を切り貼りし、
現在、昔 段ボールで作ったすごろくゲームの再現に取り組んでいます。
そこで9×9のマス目の盤面において、以下のようにマスに番号を付け、1から、サイコロででた目xだけ進んで1+xにたどり着くという状況を作りたいです。
|73|74|75|76|77|78|79|80|81|
____________________________
|72|43|44|45|46|47|48|49|50|
____________________________
|71|42|21|22|23|24|25|26|51|
____________________________
|70|41|20| 7| 8| 9|10|27|52|
____________________________
|69|40|19| 6| 1| 2|11|28|53|
____________________________
|68|39|18| 5| 4| 3|12|29|54|
____________________________
|67|38|17|16|15|14|13|30|55|
___________________________
|66|37|36|35|34|33|32|31|56|
___________________________
|65|64|63|62|61|60|59|58|57|

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

エラーはありません。ですが上記の通り全くの初心者であり、できる限りネットを駆使して検索をかけたものの答えが出ず、どうすれば思い道理になるのかが全く見当がつかないため、見識のある方々に伺おうと思った次第です。
具体的には下記の(250,300,50,50)を一番目として四角にそれぞれ番号を付けたいです。

該当のソースコード

Java

1public class C{ 2 public static void main(String[] args) { 3 GameWindow gw = new GameWindow("マス目",550,600); 4 gw.add(new DrawCanvas()); 5 gw.setVisible(true); 6 } 7} 8 9class DrawCanvas extends JPanel{ 10 g.drawRect(250,300,50,50);//四角1 11 g.drawRect(300,300,50,50);//四角2 12 g.drawRect(300,350,50,50);//四角3 13 . 14 . 15 . 16 . 17}

試したこと

マス目の座標を変数で置き、マス目に番号を振るクラスを別で設けようとしたり、ネットで情報を探りましたが、有効な手段は見つけられませんでした。

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

ツールのバージョンは把握できていませんが、jdk16のことかと思います

TN8001, perfectibility👍を押しています

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

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

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

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

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

dodox86

2021/09/04 19:32

tetatailへの質問投稿は初めてとお見受けしてのコメントです。まず、コードはそのまま貼り付けてしまうと強力に見づらく、読みづらく、それだけで閲覧、回答する方々は読む気が失せるものです。teratailでは「マークダウン記法」と言うものが使えるので、それを使ってください。 [質問するときのヒント] https://teratail.com/help/question-tips [3-8. テンプレートを利用しましょう] https://teratail.com/help/question-tips#questionTips3-8 具体的には例えばJavaのコードなら```Java~```で括ります。 ```Java public class Main { // Hoge } ``` これをちゃんとすれば回答が付きやすくなります。 現状の質問内容は読みづらいのでご提示のコードは読んでいませんが(<こう思う方々は私だけではないと思います) 9x9の盤面なら9行9列で表せられるので、行と列を意識すれば比較的簡単に直列の番号を与えることができます。ネットを検索しまくって答えを得るのも良いですが、自分でも考えてみましょう。
hoshi-takanori

2021/09/04 22:39

力作ですね。ですが、いきなり 9x9 を扱うのは辛そうなので、まず 3x3 か 5x5 くらいの単純なやつ (または一直線のほうがいいかも…) で練習した方が良い気がします。 また、if(b!=5&c!=5) { のところですが、2 つの条件を「かつ」で結ぶのは & じゃなくて && ですね。 https://eng-entrance.com/java-cal-case
swordone

2021/09/05 01:50

@hoshi-takanori いや、&でも「かつ」で結ばれます。短絡評価か否かの違いです。
jimbe

2021/09/05 03:31

力作というか力業となってしまうのは最初は仕方無い所でしょうね。(^_^;
yuki_java

2021/09/05 06:44

ソースコード全文写していたものを一部だけにしました。また、&の部分は自分のノートを見返したときに「AかつB」は&&だと書いていたので修正しました。 私自身も初心者ながらこれはなかなかの力業だなと思うものです。
jimbe

2021/09/05 09:55

ちゃんとマークダウンになりましたので、これなら必要に応じて開いたり閉じたり出来ますから、多少長くても大丈夫ですよ d^^
guest

回答3

0

一気に編集されすぎて意味が分からないうえ文法エラーになっているので、当初のコードだとして回答します(長すぎるのもあれですが、短すぎはもっとイヤですね)

yuki_javaさん自身も力技だと感じておられるようですが、どうせならスマートに解決したいですよね。

今回のポイントは明らかに渦巻ですよね?
課題か何かで「渦巻の数字を出力せよ」みたいなものもありそうですし、ヒントがないか検索してみます。

java 数字 渦巻」で検索したらこちらが出ました。
2次元配列 に数値を並べる

英語も直訳で「java number swirl」としたらこちらが出ました(Spiralなんですね~^^;
How To Create Spiral Of Numbers (Spiral Matrix) In Java?

どちらも何をやっているかさっぱりわかりませんが、今回はxyの並びが好みな後者にしました^^;
メソッドに切り出し、コンソール出力で動作確認をしてみましょう。

Java

1public class Sample { 2 public static void main(String[] args) { 3 int[][] array = getSpiralMatrix(5); 4 5 for (int[] a : array) { 6 for (int i : a) { 7 System.out.printf("%3d", i); 8 } 9 System.out.println(); 10 } 11 } 12 13 // [How To Create Spiral Of Numbers (Spiral Matrix) In Java?](https://javaconceptoftheday.com/how-to-create-spiral-of-numbers-matrix-in-java/) 14 private static int[][] getSpiralMatrix(int n) { 15 int[][] spiral = new int[n][n]; 16 int value = 1; 17 int minCol = 0; 18 int minRow = 0; 19 int maxCol = n - 1; 20 int maxRow = n - 1; 21 22 while (value <= n * n) { 23 for (int i = minCol; i <= maxCol; i++) { 24 spiral[minRow][i] = value++; 25 } 26 for (int i = minRow + 1; i <= maxRow; i++) { 27 spiral[i][maxCol] = value++; 28 } 29 for (int i = maxCol - 1; i >= minCol; i--) { 30 spiral[maxRow][i] = value++; 31 } 32 for (int i = maxRow - 1; i >= minRow + 1; i--) { 33 spiral[i][minCol] = value++; 34 } 35 minCol++; minRow++; maxCol--; maxRow--; 36 } 37 38 return spiral; 39 } 40}
1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9

左上から時計回りに数字が増えていくようですね。

真ん中を1にするのは簡単ですね。そのうえで左右反転すればよさそうです。
当然ググります(日本語ではいまいちだったので英語)
java 2nd dimension array reverse - Google 検索
java - Reverse the rows of a 2d array - Stack Overflow

Java

1public class Sample { 2 public static void main(String[] args) { 3 int[][] array = getSpiralMatrix(5); 4 5 // 真ん中始まり 6 for (int y = 0; y < array.length; y++) { 7 for (int x = 0; x < array[y].length; x++) { 8 array[y][x] = (5 * 5 + 1) - array[y][x]; 9 } 10 } 11 12 // 左右反転 13 // [java - Reverse the rows of a 2d array - Stack Overflow](https://stackoverflow.com/questions/21920939/reverse-the-rows-of-a-2d-array) 14 for (int j = 0; j < array.length; j++) { 15 for (int i = 0; i < array[j].length / 2; i++) { 16 int temp = array[j][i]; 17 array[j][i] = array[j][array[j].length - i - 1]; 18 array[j][array[j].length - i - 1] = temp; 19 } 20 } 21 22 for (int[] a : array) { 23 for (int i : a) { 24 System.out.printf("%3d", i); 25 } 26 System.out.println(); 27 } 28 } 29 30 private static int[][] getSpiralMatrix(int n) { /* 同じなので省略 */ } 31}
21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13

上記を超ふまえたうえで、GUIにするとこうなりました^^;
この2次元配列を種にして(xyや番号はわかっている)、マスのクラス(Cell)を生成します。

あくまでアウトラインですが、部品は揃ってると思いますので参考にしていただけたらと思います^^

Java

1import java.awt.BasicStroke; 2import java.awt.Color; 3import java.awt.Dimension; 4import java.awt.Graphics; 5import java.awt.Graphics2D; 6import java.awt.Rectangle; 7import java.awt.Stroke; 8import java.util.ArrayList; 9import javax.swing.JButton; 10import javax.swing.JFrame; 11import javax.swing.JPanel; 12 13 14public class GameWindow extends JFrame { 15 public static void main(String[] args) { 16 new GameWindow().setVisible(true); 17 } 18 19 public GameWindow() { 20 DrawCanvas panel = new DrawCanvas(); 21// setSize(550, 600); // JFrame のサイズはタイトルバー・枠も含むので微妙にずれる 22 panel.setPreferredSize(new Dimension(550, 600)); // 中身の推奨サイズを設定 23 add(panel); 24 pack(); 25 26 setResizable(false); 27 setLocationRelativeTo(null); 28 setDefaultCloseOperation(EXIT_ON_CLOSE); 29 } 30} 31 32class Cell { 33 int no; 34 Rectangle rect; 35 Color color; 36 37 Cell(int no, Rectangle rect, Color color) { 38 this.no = no; 39 this.rect = rect; 40 this.color = color; 41 } 42 43 void draw(Graphics2D g2) { 44 g2.setColor(color); 45 g2.fill(rect); 46 g2.setColor(Color.BLACK); 47 g2.draw(rect); 48 g2.drawString(String.valueOf(no), rect.x + 5, rect.y + 15); 49 } 50} 51 52class DrawCanvas extends JPanel { 53 private final int[][] array = getSpiralMatrix(9); 54 private final ArrayList<Cell> cells = new ArrayList<>(); 55 56 private int current = 1; 57 58 DrawCanvas() { 59 initialize(); 60 61 JButton go = new JButton("go"); 62 go.addActionListener(e -> { current++; repaint(); }); 63 add(go); 64 65 JButton back = new JButton("back"); 66 back.addActionListener(e -> { current--; repaint(); }); 67 add(back); 68 69 JButton rotation90 = new JButton("rotation90"); 70 rotation90.addActionListener(e -> { rotation(); repaint(); }); 71 add(rotation90); 72 73 JButton rotation180 = new JButton("rotation180"); 74 rotation180.addActionListener(e -> { rotation(); rotation(); repaint(); }); 75 add(rotation180); 76 } 77 78 private void initialize() { 79 for (int y = 0; y < array.length; y++) { 80 for (int x = 0; x < array[y].length; x++) { 81 array[y][x] = (array.length * array.length + 1) - array[y][x]; 82 } 83 } 84 // [java - Reverse the rows of a 2d array - Stack Overflow](https://stackoverflow.com/questions/21920939/reverse-the-rows-of-a-2d-array) 85 for (int j = 0; j < array.length; j++) { 86 for (int i = 0; i < array[j].length / 2; i++) { 87 int temp = array[j][i]; 88 array[j][i] = array[j][array[j].length - i - 1]; 89 array[j][array[j].length - i - 1] = temp; 90 } 91 } 92 93 // array を種にして Cell のリストを作る 94 Color c = new Color(0, 170, 0); 95 for (int y = 0; y < array.length; y++) { 96 for (int x = 0; x < array[y].length; x++) { 97 Rectangle r = new Rectangle(x * 50 + 50, y * 50 + 100, 50, 50); 98 cells.add(new Cell(array[y][x], r, c)); 99 } 100 } 101 // 番号順に並び変えれば点線を描きやすい 102 cells.sort((a, b) -> a.no - b.no); 103 } 104 105 private static final BasicStroke dashed = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1, new float[]{ 5 }, 0); 106 107 public void paintComponent(Graphics g) { 108 super.paintComponent(g); 109 110 Graphics2D g2 = (Graphics2D) g; 111 Stroke oldStroke = g2.getStroke(); 112 113 Cell before = null; 114 for (Cell cell : cells) { 115 cell.draw(g2); 116 117 // 前のセルとの間に点線を引く 118 if (before != null) { 119 g2.setStroke(dashed); 120 int x1 = before.rect.x + before.rect.width / 2; 121 int y1 = before.rect.y + before.rect.height / 2; 122 int x2 = cell.rect.x + cell.rect.width / 2; 123 int y2 = cell.rect.y + cell.rect.height / 2; 124 g2.drawLine(x1, y1, x2, y2); 125 g2.setStroke(oldStroke); 126 } 127 before = cell; 128 129 if (current == cell.no) { 130 g2.setColor(Color.RED); 131 Rectangle rect = cell.rect.getBounds(); 132 rect.grow(-15, -15); // 一回り小さい四角に 133 g2.fill(rect); 134 } 135 } 136 } 137 138 // current を右90度回転 2次元配列の回転を応用(正方形のみ) 139 private void rotation() { 140 for (int j = 0; j < array.length; j++) { 141 for (int i = 0; i < array[j].length; i++) { 142 if (current == array[j][i]) { 143 current = array[i][array.length - j - 1]; 144 return; 145 } 146 } 147 } 148 } 149 150 // [How To Create Spiral Of Numbers (Spiral Matrix) In Java?](https://javaconceptoftheday.com/how-to-create-spiral-of-numbers-matrix-in-java/) 151 private int[][] getSpiralMatrix(int n) { 152 int[][] spiral = new int[n][n]; 153 int value = 1; 154 int minCol = 0; 155 int minRow = 0; 156 int maxCol = n - 1; 157 int maxRow = n - 1; 158 159 while (value <= n * n) { 160 for (int i = minCol; i <= maxCol; i++) { 161 spiral[minRow][i] = value++; 162 } 163 for (int i = minRow + 1; i <= maxRow; i++) { 164 spiral[i][maxCol] = value++; 165 } 166 for (int i = maxCol - 1; i >= minCol; i--) { 167 spiral[maxRow][i] = value++; 168 } 169 for (int i = maxRow - 1; i >= minRow + 1; i--) { 170 spiral[i][minCol] = value++; 171 } 172 minCol++; minRow++; maxCol--; maxRow--; 173 } 174 175 return spiral; 176 } 177}

アプリ画像

投稿2021/09/05 11:23

編集2023/07/29 04:33
TN8001

総合スコア9326

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

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

jimbe

2021/09/05 13:40

点線をさっと書くことが出来たはず…と探してたのですが、 Graphics2D だったんですね。 勝手ながら使わせて頂きました。ありがとうございます。
TN8001

2021/09/05 13:50

どーぞどーぞお気になさらず^^ 私のも8割がたググったものですし^^;
yuki_java

2021/09/05 16:50

ご回答本当にありがとうございます。 まだまだ質問の仕方さえ不慣れで申し訳ありません。 手法の検索にあたり、この数の並びから渦巻というキーワードが出てこなかった自分が悲しく思えます。 ですがTN8001さんの記述は思考の手順を示したわかりやすいものでした。
guest

0

9x9 の盤面のマス目に順番をつける部分だけですが、

Java

1class Main { 2 public static void main(String[] args) { 3 int n = 9; 4 int[][] a = getBoard(n); 5 for (int i = 0; i < n; i++) { 6 for (int j = 0; j < n; j++) 7 System.out.format("%3d", a[i][j]); 8 System.out.println(); 9 } 10 } 11 12 static int[][] getBoard(int n) { 13 int[][] a = new int[n][n]; 14 a[n/2][n/2] = 1; 15 for (int v = n * n, i = 0, j = n - 1; n > 1; n -= 2, i++, j--) { 16 for (int k = n; --k > 0; ) a[i][j--] = v--; 17 for (int k = n; --k > 0; ) a[i++][j] = v--; 18 for (int k = n; --k > 0; ) a[i][j++] = v--; 19 for (int k = n; --k > 0; ) a[i--][j] = v--; 20 } 21 return a; 22 } 23}

投稿2021/09/05 16:11

編集2021/09/05 16:16
kazuma-s

総合スコア8224

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

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

0

ベストアンサー

取り敢えず描画のみ似せて見ました。
各マスやイベントをクラスにしたり、点線も専用クラスにしています。
各イベントの座標に制限が有るのか無いのかコードから良く分からなかったので、全体を対象にしています。

動かした見た目は殆ど変わらないのに、コードは修正の度に長く…。

java

1package teratail_java.q357803; 2 3import java.awt.*; 4import java.awt.geom.Rectangle2D; 5import java.util.ArrayList; 6import java.util.List; 7import java.util.Random; 8 9import javax.swing.JFrame; 10import javax.swing.JPanel; 11 12public class GameFrame extends JFrame { 13 public static void main(String[] args) { 14 new GameFrame().setVisible(true); 15 } 16 17 public GameFrame() { 18 super("同好会で作ったやつ"); 19 setDefaultCloseOperation(EXIT_ON_CLOSE); 20 setSize(550, 600); 21 setLocationRelativeTo(null); 22 23 //ウインドウを大きくしても GamePanel が中央に位置するようにレイアウトを設定 24 GridBagLayout layout = new GridBagLayout(); 25 setLayout(layout); 26 27 GridBagConstraints gbc = new GridBagConstraints(); 28 gbc.gridx = 0; 29 gbc.gridy = 0; 30 gbc.gridwidth = 1; 31 gbc.gridheight = 1; 32 gbc.anchor = GridBagConstraints.CENTER; 33 add(new GamePanel(50, 9), gbc); //描画領域の追加 34 } 35 36 //マス 37 private static class Square { 38 enum Direction { 39 CENTER, EAST, WEST, NORTH, SOUTH; 40 } 41 private int number, x, y; 42 private int gx, gy, size; 43 private Color background = new Color(0, 170, 0); 44 private Event event; 45 Square(int number, int x, int y, int size) { 46 this.number = number; 47 this.x = x; 48 this.y = y; 49 this.size = size; 50 51 this.gx = x * size; 52 this.gy = y * size; 53 } 54 void setEvent(Event event) { this.event = event; } 55 //イベントがあるか 56 boolean hasEvent() { return event != null; } 57 //マスの各方向の座標 58 Point getPoint(Direction dir) { 59 switch(dir) { 60 case EAST: 61 return new Point(gx+size, gy+size/2); 62 case WEST: 63 return new Point(gx, gy+size/2); 64 case NORTH: 65 return new Point(gx+size/2, gy); 66 case SOUTH: 67 return new Point(gx+size/2, gy+size); 68 default: //CENTER 69 return new Point(gx+size/2, gy+size/2); 70 } 71 } 72 void draw(Graphics g) { 73 Graphics g2 = g.create(); 74 g2.setColor(background); 75 g2.fillRect(gx, gy, size, size); 76 g2.dispose(); 77 78 g.drawRect(gx, gy, size, size); //枠 79 80 drawStringAtBottomRight(g, ""+number); //番号 81 if(hasEvent()) event.draw(g, gx+2, gy+2); //イベント 82 } 83 private void drawStringAtBottomRight(Graphics g, String text) { 84 FontMetrics fm = g.getFontMetrics(); 85 int descent = fm.getDescent(); //ベースラインの高さ 86 Rectangle2D rect = fm.getStringBounds(text, g); 87 int width = (int)rect.getWidth(); //文字列の幅 88 g.drawString(text, gx+size-width-1, gy+size-descent-1); //-1 はちょっと隙間 89 } 90 } 91 92 //イベント 93 private static class Event { 94 private String text1, text2; 95 Event(String text) { 96 this.text1 = text; 97 } 98 Event(String text1, String text2) { 99 this.text1 = text1; 100 this.text2 = text2; 101 } 102 void draw(Graphics g, int gx, int gy) { 103 FontMetrics fm = g.getFontMetrics(); 104 gy += fm.getAscent(); //ベースラインから文字頂までの高さ 105 g.drawString(text1, gx, gy); 106 if(text2 != null) { 107 Rectangle2D rect = fm.getStringBounds(text2, g); 108 gy += (int)rect.getHeight(); 109 g.drawString(text2, gx, gy); 110 } 111 } 112 } 113 114 //点線描画 115 private static class DotLineDrawer { 116 private int x, y; 117 private BasicStroke dashed; 118 DotLineDrawer(int solid_period) { 119 dashed = new BasicStroke(0, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1, new float[]{solid_period}, 0); 120 } 121 //始点 122 void setStart(Point start) { 123 x = start.x; 124 y = start.y; 125 } 126 //始点もしくは最後に draw した後から描画 127 void draw(Graphics g, Point end) { 128 Graphics2D g2 = (Graphics2D)g.create(); 129 g2.setStroke(dashed); 130 g2.drawLine(x, y, end.x, end.y); 131 g2.dispose(); 132 x = end.x; 133 y = end.y; 134 } 135 } 136 137 //右好きの亀さん 138 private static class Turtle { 139 interface Confirm { 140 //安全確認. x,y にマイナスや大きな値が入っても例外を出さないよう注意. 141 boolean isSafe(int x, int y); 142 } 143 enum Direction { 144 NORTH(0,-1) { Direction right() { return EAST; } }, 145 SOUTH(0, 1) { Direction right() { return WEST; } }, 146 EAST( 1,0) { Direction right() { return SOUTH; } }, 147 WEST(-1,0) { Direction right() { return NORTH; } }; 148 149 final int dx, dy; 150 Direction(int dx, int dy) { 151 this.dx = dx; 152 this.dy = dy; 153 } 154 abstract Direction right(); 155 } 156 private int x, y; 157 private Direction dir; 158 private Confirm confirm; 159 Turtle(int x, int y, Direction dir, Confirm confirm) { 160 this.x = x; 161 this.y = y; 162 this.dir = dir; 163 this.confirm = confirm; 164 } 165 int getX() { return x; } 166 int getY() { return y; } 167 void forward() { 168 x += dir.dx; 169 y += dir.dy; 170 Direction sence = dir.right(); //この辺が右好き 171 if(confirm.isSafe(x+sence.dx, y+sence.dy)) dir = sence; 172 } 173 } 174 175 //描画する紙を表すクラス 176 private static class GamePanel extends JPanel { 177 private List<Square> squareList = new ArrayList<>(); //中心を index=0 とし、螺旋を展開した直線状態 178 private Random random = new Random(); 179 private final int square_size; 180 private final int square_count; 181 182 GamePanel(int square_size, int square_count) { 183 super(null); 184 this.square_size = square_size; 185 this.square_count = square_count; 186 187 setPreferredSize(new Dimension(square_size*(square_count+1), square_size*square_count)); 188 setMinimumSize(getPreferredSize()); 189 190 initSquareList(); 191 192 squareList.get(0).setEvent(new Event("スタート")); 193 194 setForwardingEvent(); //"進む"イベント(1) 195 setRotateEvent("⤵ 90°"); //盤面回転イベント(1) 196 setForwardingEvent(); //"進む"イベント(2) 197 setRotateEvent("⤵ 180°"); //盤面回転イベント(2) 198 setForwardingEvent(); //"進む"イベント(3) 199 setToLeftEvent(); //"左へ"イベント 200 setForwardingEvent(); //"進む"イベント(4) 201 setForwardingEvent(); //"進む"イベント(5) 202 setForwardingEvent(); //"進む"イベント(6) 203 } 204 205 //マス準備 206 private void initSquareList() { 207 Turtle turtle = new Turtle(square_count/2, square_count/2, Turtle.Direction.EAST, new Turtle.Confirm() { 208 @Override 209 public boolean isSafe(int x, int y) { 210 for(Square s : squareList) if(s.x == x && s.y == y) return false; //既に通った 211 return true; 212 } 213 }); 214 215 for(int number=1; number<=square_count*square_count; turtle.forward(), number++) { 216 squareList.add(new Square(number, turtle.getX(), turtle.getY(), square_size)); 217 } 218 } 219 220 //"進む"イベント 221 private void setForwardingEvent() { 222 Square square = getRandomSquare(); 223 if(!square.hasEvent()) { 224 int a = random.nextInt(5) + 2; 225 square.setEvent(new Event("+" + a + "マス")); 226 } 227 } 228 //盤面回転イベント 229 private void setRotateEvent(String text2) { 230 Square square = getRandomSquare(); 231 if(!square.hasEvent()) { 232 square.setEvent(new Event("盤面", text2)); 233 } 234 } 235 //"左へ"イベント 236 private void setToLeftEvent() { 237 Square square = getRandomSquare(); 238 if(!square.hasEvent()) { 239 square.setEvent(new Event("2マス", "左へ")); 240 } 241 } 242 243 //ランダムにマスを選択 244 private Square getRandomSquare() { 245 return getRandomSquare(square_count,0,square_count,0); 246 } 247 private Square getRandomSquare(int xbound, int xoffset, int ybound, int yoffset) { 248 int x = random.nextInt(xbound) + xoffset; 249 int y = random.nextInt(ybound) + yoffset; 250 return getSquare(x, y); 251 } 252 //x,y指定から Square を得る 253 private Square getSquare(int x, int y) { 254 for(Square s : squareList) if(s.x == x && s.y == y) return s; 255 return null; 256 } 257 258 public void paintComponent(Graphics g) { 259 super.paintComponent(g); 260 261 //ゴール 262 g.setColor(Color.yellow); 263 g.fillRect(square_size*square_count, 0, square_size, square_size); 264 g.setColor(Color.black); 265 g.drawString("ゴール", square_size*square_count+5, 13); 266 267 //各マス 268 for(Square s : squareList) s.draw(g); 269 270 //点線 271 DotLineDrawer dotLineDrawer = new DotLineDrawer(5); 272 dotLineDrawer.setStart(squareList.get(0).getPoint(Square.Direction.CENTER)); 273 for(Square s : squareList.subList(1, squareList.size()-1)) { 274 dotLineDrawer.draw(g, s.getPoint(Square.Direction.CENTER)); 275 } 276 dotLineDrawer.draw(g, squareList.get(squareList.size()-1).getPoint(Square.Direction.EAST)); //最後はマスの右端まで 277 } 278 } 279}

弄ってみたコードを GitHub に入れています。

https://github.com/Jimbe-github/teratail_java/tree/master/workspace2/teratail_java/src/teratail_java/q357803

C.java はオリジナル、C2.java は GameFrame.java から出した Turtle.java を使って C.java の構造を変えずに番号追加(ついでに点線や繰り返し部分を修正)、GameFrame.java は…まぁこちらのより弄っています ^^;;;

投稿2021/09/05 09:50

編集2021/09/07 16:23
jimbe

総合スコア12648

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

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

jimbe

2021/09/05 13:50

ベタで書いていた螺旋座標を、タートルグラフィックス風に「右好き」な亀さんの後をなぞって作るようにしました。
yuki_java

2021/09/05 16:50

私の質問にこたえるだけでなく、回転のクラスを作ってくださったり、そもそもの私のかなりわかりにくいコードをクラスごとに分けてくださったりと、かなりのお手数をおかけしていただいたことと、お見受けします。 ご回答ありがとうございました。
jimbe

2021/09/05 18:36

車とかバイクとか自転車とか好きな人が延々と弄っていて飽きないのと同じで、私もコードを延々と弄っているだけですので、手間ということはありません。 それよりも、このようなスゴロクを初めて見たのですが、この後どのようになっていくのかが気になっています。特に、盤面の90度回転とかするとどんな風になっちゃうんでしょう。
yuki_java

2021/09/07 04:35

私もできるだけ早くそれくらいプログラムを好きに操れるようになりたいものです。 今後としてはマス目のイベントに止まった場合+何マスなどは通常のすごろくと同じですが、90度回転などはその通りにその升目に止まった場合、盤面が駒ごと90度回転することで、ゴール前からいきなり遠いところまで飛ばされたり、逆にゴールから程遠かった人がゴール目の前に来たりといった少し普通のすごろくよりも運の絡むものを作りたいんです。
jimbe

2021/09/07 05:09

私も独学だけでやって来ましたが、今のようにいきなりウインドウを作って線を引くなんてことは出来ない状態からでしたから、否応無く出来ることからするしかなかったので、その分迷うことも少なくてステップアップし易かったのかもしれません。 > ゴール前からいきなり遠いところまで飛ばされたり ~ ということは、番号と点線の表示はそのままで、イベントと駒だけが回転するんですね。 そうすると…私のコードだと、亀さんの向きを変えて得た座標に元の座標の Square を(番号と座標を変えて)移したリストに置き換える感じ…かな? なるほど ゝ。 あ、でも元は紙でイベントを直接盤に書き込んでいたとすると、イベントも回転するのは書き換えが面倒ですね。回転するのは駒だけでしょうか。
TN8001

2021/09/07 09:47 編集

元々の紙のゲームではゴール以外すべてが回るんですよね? あと1マスでゴールだって時に誰かが回転イベントに乗ってしまい盤面(当然イベントも含むし乗っている駒も同様)が回ることで、ゴール目前だった人がまた3/4周程度しなくてはならなくなる。と 紙のゲームならそれでいいと思うんですよ。 しかしPCのゲーム(コンピュータゲーム)となると、まったく同じデザインというわけにもいかないと思うんですよね。 (罫線引くのが面倒なので)3*3で考えてみます。 ┏━┳━┳━┓ ┃┌╂─╂─╂G ┣┿╋━╋━┫ ┃│┃S╂┐┃ ┣┿╋━╋┿┫ ┃└╂─╂┘┃ ┗━┻━┻━┛ 誰かが90度回してしまいました。 ┏━┳━┳━┓ ┃┌╂─╂┐┃G ┣┿╋━╋┿┫ ┃│┃S┃│┃ ┣┿╋┿╋┿┫ ┃└╂┘││┃ ┗━┻━┻┿┛ こうなります。 紙のゲームでは右上のマスの次はゴール・右下のマスの次は左に行くとみんなが了解しているでしょう(いちいち線を書き換えるわけにはいかないし^^; しかしPCゲームなら自由に書き換えられます(実際にそれを実装する手間は考慮しない) もし書き換えるならこうなるでしょう。 ┏━┳━┳━┓ ┃┌╂─╂─╂G ┣┿╋━╋━┫ ┃│┃S┃│┃ ┣┿╋┿╋┿┫ ┃└╂┴╂┘┃ ┗━┻━┻━┛ 元々左上だったマスが右上になりゴールに接したことでゴール直前マスになり、右下では合流地点もできてしまいました。 盤の回転がなければ1直線で考えられたのですが、そうもいかなくなってしまいました(それをどう実現するかを考えるのもそれはそれで面白いと思いますが) 上記問題が見え見えだったため、私の回答では盤は動かず駒だけを点対称な位置に回転させました(イベントも動かせますが、個人的には盤が回らない以上動かないほうが自然な気はします。ゴール直前のイベントラッシュも作りやすいですし) アナログゲームでパッと点対称な位置を探すのは面倒かもしれませんが、PCが勝手にやってくれるなら問題ないわけです。 盤は動かないため1直線性が保証され実装しやすくなるのです(駒だけ飛んだとしてもゲーム性は変わっていないでしょう) ということを回答コードに込めたつもりなのですが、もし実行しても伝わらなかったとすれば言葉足らずでした^^;
jimbe

2021/09/07 10:28

これはなかなか、同好会で作られたそうですが、その時もきっと試行錯誤されたんでしょうね ^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問