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

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

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

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

Swing

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

Q&A

解決済

1回答

1092閲覧

ライフゲームのルール部分が上手く動作をしない

Alpa

総合スコア80

Java

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

Swing

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

0グッド

0クリップ

投稿2018/09/02 12:37

現在ライフゲームを作成しているのですが、
ライフゲームのルール部分のプログラムで思っていた動作をしないので、
質問させていただきました。

具体的にはcellUpdateメソッドの動作がWikipediaに載っていたルールに
沿って作ったと思っていたのですが、
Wikipediaのまま置いたセルが書いてある動作とは違う動作をしました。

何回もルールのチェックを行ったり、
プログラム内で実行順序の変更なども行ったのですが、
自分には解決できませんでした。
なので解決策を教えていただけると幸いです。

java

1import javax.swing.*; 2import javax.swing.Timer; 3import javax.imageio.*; 4import java.awt.*; 5import java.awt.image.*; 6import java.awt.event.*; 7import java.util.*; 8import java.io.*; 9 10public class life extends JFrame implements ActionListener, KeyListener 11{ 12 int player_x = 20; 13 int player_y = 40; 14 15 boolean key_up = false; 16 boolean key_down = false; 17 boolean key_right = false; 18 boolean key_left = false; 19 20 boolean init = false; 21 22 boolean running = false; 23 24 Timer keyTimer = new Timer(50, this); 25 Timer timer = new Timer(500, this); 26 27 ArrayList<Cell> cells = new ArrayList<Cell>(); 28 29 Random rand = new Random(); 30 31 BufferedImage buff = new BufferedImage(500, 700, BufferedImage.TYPE_4BYTE_ABGR_PRE); 32 Graphics2D g2 = buff.createGraphics(); 33 34 public static void main(String[] args) 35 { 36 life frame = new life(); 37 frame.setTitle("ライフゲーム"); 38 frame.setSize(500, 700); 39 frame.setLocationRelativeTo(null); 40 frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 41 frame.setResizable(false); 42 frame.setAlwaysOnTop(false); 43 frame.setVisible(true); 44 } 45 46 life() 47 { 48 JPanel panel = new JPanel(); 49 panel.setLayout(null); 50 51 keyTimer.setActionCommand("キー"); 52 timer.setActionCommand("更新"); 53 54 addKeyListener(this); 55 56 getContentPane().add(panel, BorderLayout.CENTER); 57 } 58 59 public void actionPerformed(ActionEvent e) 60 { 61 String cmd = e.getActionCommand(); 62 63 switch(cmd){ 64 case "キー":{ 65 if(!running){ 66 if(key_up){ 67 if(player_y >= 50){ 68 player_y -= 10; 69 } 70 } 71 72 if(key_down){ 73 if(player_y <= 460){ 74 player_y += 10; 75 } 76 } 77 78 if(key_right){ 79 if(player_x <= 460){ 80 player_x += 10; 81 } 82 } 83 84 if(key_left){ 85 if(player_x >= 30){ 86 player_x -= 10; 87 } 88 } 89 90 if(key_up || key_down || key_right || key_left) clear(); 91 } 92 }break; 93 94 case "更新":{ 95 cellUpdate(); 96 }break; 97 } 98 } 99 100 public void paint(Graphics g) 101 { 102 if(!init){ 103 g.setColor(Color.white); 104 g.fillRect(0, 0, 500, 700); 105 106 setData(); 107 keyTimer.start(); 108 init = true; 109 } 110 111 buff = new BufferedImage(500, 700, BufferedImage.TYPE_4BYTE_ABGR_PRE); 112 g2 = buff.createGraphics(); 113 114 g2.setColor(Color.black); 115 g2.drawRect(20, 40, 460, 440); 116 117 for(int i = 0; i < cells.size(); i++){ 118 if(cells.get(i).status == 0){ 119 g2.setColor(Color.black); 120 }else if(cells.get(i).status == 1){ 121 g2.setColor(Color.green); 122 } 123 124 g2.fillRect(cells.get(i).x, cells.get(i).y, 10, 10); 125 126 g2.setColor(new Color(30, 30, 30)); 127 g2.drawRect(cells.get(i).x, cells.get(i).y, 10, 10); 128 } 129 130 if(!running){ 131 drawPlayer(); 132 } 133 134 drawImage(buff, 0, 0); 135 136 g2.dispose(); 137 } 138 139 public void keyReleased(KeyEvent e) 140 { 141 switch(e.getKeyText(e.getKeyCode())){ 142 case "上": key_up = false; break; 143 case "下": key_down = false; break; 144 case "右": key_right = false; break; 145 case "左": key_left = false; break; 146 case "スペース":{ 147 for(int i = 0; i < cells.size(); i++){ 148 if(cells.get(i).x == player_x && cells.get(i).y == player_y){ 149 if(cells.get(i).status == 0){ 150 cells.set(i, new Cell(cells.get(i).x, cells.get(i).y, 1)); 151 }else if(cells.get(i).status == 1){ 152 cells.set(i, new Cell(cells.get(i).x, cells.get(i).y, 0)); 153 } 154 } 155 } 156 }break; 157 158 case "S":{ 159 if(timer.isRunning()){ 160 running = false; 161 timer.stop(); 162 debug("STOP"); 163 }else{ 164 running = true; 165 timer.start(); 166 debug("START"); 167 } 168 169 clear(); 170 }break; 171 172 case "C":{ 173 cells.clear(); 174 setData(); 175 clear(); 176 } 177 178 case "Enter": cellUpdate(); break; 179 } 180 } 181 182 public void keyPressed(KeyEvent e) 183 { 184 switch(e.getKeyText(e.getKeyCode())){ 185 case "上": key_up = true; break; 186 case "下": key_down = true; break; 187 case "右": key_right = true; break; 188 case "左": key_left = true; break; 189 } 190 } 191 192 public void keyTyped(KeyEvent e){} 193 194 void drawPlayer() 195 { 196 g2.setColor(Color.red); 197 g2.fillRect(player_x, player_y, 10, 10); 198 } 199 200 void drawImage(BufferedImage Img, int x, int y) 201 { 202 Graphics g = getGraphics(); 203 g.drawImage(Img, x, y, this); 204 g.dispose(); 205 } 206 207 void clear() 208 { 209 g2.setColor(Color.white); 210 g2.fillRect(0, 0, 500, 700); 211 repaint(); 212 } 213 214 void setData() 215 { 216 for(int i = 0; i < 46; i++){ 217 for(int j = 0; j < 44; j++){ 218 cells.add(new Cell((i + 1) * 10 + 10, (j + 1) * 10 + 30, 0)); 219 } 220 } 221 } 222 223 void cellUpdate() 224 { 225 int alive = 0; 226 227 for(int i = 0; i < cells.size(); i++){ 228 for(int j = 0; j < cells.size(); j++){ 229 if(cells.get(j).x == cells.get(i).x - 10 && cells.get(j).y == cells.get(i).y - 10){ 230 if(cells.get(j).status == 1){ 231 alive++; 232 } 233 } 234 235 if(cells.get(j).x == cells.get(i).x && cells.get(j).y == cells.get(i).y - 10){ 236 if(cells.get(j).status == 1){ 237 alive++; 238 } 239 } 240 241 if(cells.get(j).x == cells.get(i).x + 10 && cells.get(j).y == cells.get(i).y - 10){ 242 if(cells.get(j).status == 1){ 243 alive++; 244 } 245 } 246 247 if(cells.get(j).x == cells.get(i).x - 10 && cells.get(j).y == cells.get(i).y){ 248 if(cells.get(j).status == 1){ 249 alive++; 250 } 251 } 252 253 if(cells.get(j).x == cells.get(i).x + 10 && cells.get(j).y == cells.get(i).y){ 254 if(cells.get(j).status == 1){ 255 alive++; 256 } 257 } 258 259 if(cells.get(j).x == cells.get(i).x - 10 && cells.get(j).y == cells.get(i).y + 10){ 260 if(cells.get(j).status == 1){ 261 alive++; 262 } 263 } 264 265 if(cells.get(j).x == cells.get(i).x && cells.get(j).y == cells.get(i).y + 10){ 266 if(cells.get(j).status == 1){ 267 alive++; 268 } 269 } 270 271 if(cells.get(j).x == cells.get(i).x + 10 && cells.get(j).y == cells.get(i).y + 10){ 272 if(cells.get(j).status == 1){ 273 alive++; 274 } 275 } 276 } 277 278 if(alive <= 1){ 279 cells.set(i, new Cell(cells.get(i).x, cells.get(i).y, 0)); 280 }else if(alive == 2 || alive == 3 && cells.get(i).status == 1){ 281 cells.set(i, new Cell(cells.get(i).x, cells.get(i).y, 1)); 282 }else if(alive >= 4){ 283 cells.set(i, new Cell(cells.get(i).x, cells.get(i).y, 0)); 284 }else if(alive == 3 && cells.get(i).status == 0){ 285 cells.set(i, new Cell(cells.get(i).x, cells.get(i).y, 1)); 286 } 287 288 alive = 0; 289 clear(); 290 } 291 } 292 293 void debug(Object obj) 294 { 295 System.out.println(obj); 296 } 297 298 int random(int r) 299 { 300 return rand.nextInt(r); 301 } 302} 303 304class Cell 305{ 306 int x = 0; 307 int y = 0; 308 int status = 1; 309 310 public Cell(int x, int y, int status) 311 { 312 this.x = x; 313 this.y = y; 314 this.status = status; 315 } 316}

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

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

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

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

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

m.ts10806

2018/09/02 13:03

「違う動きをした」とはどう動いたのでしょうか。「具体的には」という割にはどうなったか書かれていません。
Alpa

2018/09/02 13:06

同じ動作をループするはずのセルのパターンが繁殖しました
guest

回答1

0

ベストアンサー

面を一面しか持ってないように見えますが?
今の面と、次の時点の面の、2面は最低必要ですよ。
#追記
Rubyですが、書いてみました。

Ruby

1data = <<EOF 2++++++++++ 3++++++++++ 4+++OOOO+++ 5++++++++++ 6++++++++++ 7EOF 8 9board = data.split(/\n/).map{|x| x.split(//)} 10 11Y = board.size 12X = board[0].size 13 14def alive(board,y,x) 15 return 0 if x<0 or x>=X or y<0 or y>=Y 16 board[y][x] == "O" ? 1 : 0 17end 18 19def update(t0, t1) 20 (0...Y).each do |i| 21 (0...X).each do |j| 22 life = alive(t0,i-1,j-1)+alive(t0,i-1,j)+alive(t0,i-1,j+1)+ 23 alive(t0,i ,j-1)+ alive(t0,i ,j+1)+ 24 alive(t0,i+1,j-1)+alive(t0,i+1,j)+alive(t0,i+1,j+1) 25 t1[i][j] = 26 case life 27 when 2 then t0[i][j] 28 when 3 then "O" 29 else "+" 30 end 31 end 32 end 33end 34 35while gets == "\n" 36 puts board.map{|x| x.join} 37 next_board = Array.new(Y){Array.new(X)} 38 update(board, next_board) 39 board = next_board 40end

投稿2018/09/02 13:03

編集2018/09/02 14:12
otn

総合スコア84423

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

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

Alpa

2018/09/02 13:07

そうなんですか! 2面必要なのは何故か教えて頂きたいです。
otn

2018/09/02 13:14

次の面の各点の生死は、今の面の各点の状態から、全箇所同時に判断する必要があります。
Alpa

2018/09/02 13:18

すいません 具体的にコードを教えて頂きたいのですが無理ですか? コードの方が理解しやすいので
otn

2018/09/02 13:23

あなたのコードがよく理解できないので、無理です。 2面作れば解決するのかどうかもよく分かりません。 面を2面作って、今の面を見ながら、次の面を更新して、全部について終わったら入れ替えてください。
Alpa

2018/09/02 13:38

わかりました。 すいませんありがとうございました!
Alpa

2018/09/02 20:22

わざわざありがとうございます! やっと出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問