現在ライフゲームを作成しているのですが、
ライフゲームのルール部分のプログラムで思っていた動作をしないので、
質問させていただきました。
具体的には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}
回答1件
あなたの回答
tips
プレビュー