前提・実現したいこと
まず、私はプログラミングを独学ではじめ、なかなか理解できず、とにかく触って慣れていこうと思い、ネット上の様々な情報を切り貼りし、
現在、昔 段ボールで作ったすごろくゲームの再現に取り組んでいます。
そこで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のことかと思います
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/04 22:39
2021/09/05 01:50
2021/09/05 03:31
2021/09/05 06:44
2021/09/05 09:55
回答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総合スコア9862
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/05 13:40
2021/09/05 13:50
2021/09/05 16:50
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総合スコア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 に入れています。
C.java はオリジナル、C2.java は GameFrame.java から出した Turtle.java を使って C.java の構造を変えずに番号追加(ついでに点線や繰り返し部分を修正)、GameFrame.java は…まぁこちらのより弄っています ^^;;;
投稿2021/09/05 09:50
編集2021/09/07 16:23総合スコア13209
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/05 13:50
2021/09/05 16:50
2021/09/05 18:36
2021/09/07 04:35
2021/09/07 05:09
2021/09/07 09:47 編集
2021/09/07 10:28
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。