ボタンを押すと自動更新されるライフゲームの作り方

このQ&Aのポイント
  • ライフゲームにボタンを押すと何度も自動で更新されるように作りたいのですが、どうすればいいですか?
  • 今回の質問は、ライフゲームにおいてボタンを押すと自動で更新が行われるようにしたいというものです。具体的な作り方についてご質問いただいており、以下に要約をまとめました。
  • ライフゲームにボタンを追加し、ボタンが押されると自動で更新が行われるようにしたいとのことです。具体的な方法としては、Appletクラスを継承し、ボタンとアクションリスナーを追加することで実現可能です。詳細なコードの説明や注意点なども含めてまとめました。
回答を見る
  • ベストアンサー

ライフゲームにボタンを押すと何度も自動で更新されるように作りたいのです

ライフゲームにボタンを押すと何度も自動で更新されるように作りたいのですが ↓を変えて更新されるようにするにはどうすればいいですか? public class Lifegame extends Applet implements ActionListener{ int hani = 30; int xy = 15; int sikaku = xy-2; int [][]a = new int[hani][hani]; int [][]b = new int[hani][hani]; Button button; public void init(){ for(int i=0; i < hani; i++) { for(int j = 0;j < hani; j++) { if(i==0 || j == 0 || i == hani || j == hani){ b[i][j] =0; }else{ b[i][j] = (int)(Math.random()*2); } } } button = new Button("更新"); button.addActionListener(this); add(button); } public void paint(Graphics g){ for(int i = 1; i < hani - 1; i++){ for(int j = 1; j < hani - 1; j++){ if(b[i][j] == 1){ g.setColor(Color.green); g.fillRect(i*xy, 30+j*xy, sikaku, sikaku); }else if(b[i][j] == 0){ g.setColor(Color.black); g.fillRect(i*xy, 30+j*xy, sikaku, sikaku); } } } } public void actionPerformed(ActionEvent arg0){ for(int i = 1; i < hani - 1; i++){ for(int j = 1; j < hani - 1; j++){ a[i][j] = b[i][j]; } } for(int i = 1; i < hani - 1; i++) { for(int j = 1; j < hani - 1; j++) { int hantei = a[i - 1][j - 1] + a[i - 1][j] + a[i - 1][j + 1] + a[i][j-1] + a[i][j + 1] + a[i+1][j-1] + a[i+1][j] + a[i+1][j+1]; if(b[i][j] == 1){ if(hantei == 2 || hantei == 3){ b[i][j] = 1; }else{ b[i][j] = 0; } }else if (b[i][j] == 0){ if(hantei == 3){ b[i][j] = 1; }else{ b[i][j] = 0; } } } } repaint(); } } ご回答よろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。 >何度も自動で更新されるように  そういうときは、java.util.Timer を使います。  Timerに設定するTimerTaskのrunメソッドないで、現在、更新ボタンのイベント内でやっていることと同じことをします。

関連するQ&A

  • エラーの対処法を教えてください2

    続き a[0][0] = a[5][5]; a[0][6] = a[5][1]; a[6][0] = a[1][5]; a[6][6] = a[1][1]; for (int i=1; i<6; i++){ for (int j=1; j<6; j++){ if(a[i][j] == 0){ g.setColor(Color.black); g.fillRect(40 + i * 10, 40 + j * 10, 10, 10); }else{ g.setColor(Color.white); g.fillRect(40 + i * 10, 40 + j * 10, 10, 10); } } } repaint(); } } どなたかお教えください。

  • エラーの対処法を教えてください

    メソッドの宣言が不正です。戻り値の型が必要です。 public Window(int width, int height){ というエラーメッセージが出たのですが解決方法をどなたかお教えください。 import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; public class Kadai extends JFrame implements ActionListener { private Timer timer; private int a[][] = new int[7][7]; private int b[][] = new int[7][7]; public Window(int width, int height){ setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(width, height); setVisible(true); } public static void main(String[] args) { Window window = new Window(640, 480); } public void paint(Graphics g){ g.setColor(Color.black); for (int i=5; i<26; i++){ g.drawLine(i * 10, 50, i * 10, 250); g.drawLine(50, i * 10, 250, i * 10); } } public static void main(String args[]) { Random rand = new Random(); for (int i=1; i<6; i++){ for (int j=1; j<6; j++){ a[i][j] = rand.nextInt(2); } } for (int i=1; i<6; i++){ a[i][0] = a[i][5]; a[0][i] = a[5][i]; a[i][6] = a[i][1]; a[6][i] = a[1][i]; } a[0][0] = a[5][5]; a[0][6] = a[5][1]; a[6][0] = a[1][5]; a[6][6] = a[1][1]; for (int i=1; i<6; i++){ for (int j=1; j<6; j++){ if(a[i][j] == 0){ g.setColor(Color.black); g.fillRect(40 + i * 10, 40 + j * 10, 10, 10); }else{ g.setColor(Color.white); g.fillRect(40 + i * 10, 40 + j * 10, 10, 10); } } } } public Kadai() { timer = new Timer( 50, this ); timer.start(); } public void actionPerformed( ActionEvent e ) { for (int i=1; i<6; i++){ for (int j=1; j<6; j++){ if(a[i][j] = 0){ if(a[i-1][j-1]+a[i-1][j]+a[i-1][j+1]+a[i][j-1]+a[i][j+1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1] == 2 && a[i-1][j-1]+a[i-1][j]+a[i-1][j+1]+a[i][j-1]+a[i][j+1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1] == 3){ b[i][j] = 0; }else{ b[i][j] = 1; } }else{ if(a[i-1][j-1]+a[i-1][j]+a[i-1][j+1]+a[i][j-1]+a[i][j+1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1] == 3){ b[i][j] = 0; }else{ b[i][j] = 1; } } } } for (int i=1; i<6; i++){ for (int j=1; j<6; j++){ b[i][j] = a[i][j]; } } for (int i=1; i<6; i++){ a[i][0] = a[i][5]; a[0][i] = a[5][i]; a[i][6] = a[i][1]; a[6][i] = a[1][i]; } 2に続きます。

  • 祝日判定です。

    祝日判定 カレンダーですが、エラーが出てしまいます。どうかよろしくお願いいたします。ソースの一部です。 for (j=0; j<6; j++) { for (k=0; k<7; k++) { if (cal[i][j][k]==0) printf(" "); else if(hantei(yy,mm,dd,youbi) == 2){ printf("(%3d) ",cal[i][j][k]); flag = 1; // 日曜と祝日が重なったらflagをたてる } else if(hantei(yy,mm,dd,youbi) == 1 || flag == 1){ printf("(%3d) ",cal[i][j][k]); printf("\t"); flag = 0; } else if((i-1)%7 == 6){ // 土曜日 printf("%3d ",cal[i][j][k]); printf("\t"); } else{ printf("(%3d) ",cal[i][j][k]); //printf("%d"); //日付を出力 flag = 0; } if((i-1)%7 == 6) printf("\n"); //土曜のあとは改行 } int hantei(int yy,int mm,int dd,int youbi){ if((mm==3 && dd== (int)(20.8431 + 0.

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • 解けません!!

    http://www.pref.fukushima.jp/pc-concours/2008/03/pdf/2006honsen.pdf これの問題07ヘビを解いています。 しかし、学校のジャッジシステムに提出しても間違えと表示されます。 どなたか以下のプログラムの不備を教えて下さい。 サンプルは処理できました。 #include<stdio.h> int A(char snake[]) {  int answer,a=0,b=0,j;    if(snake[0] == '>' && snake[1] == '\''){   for(j = 2; snake[j] == '='; j++){     a++;   }   if(snake[j] == '#'){    for(j += 1; snake[j] == '='; j++){     b++;    }   }   if(snake[j] == '~' && a == b){    answer = 1;   }  }    return answer; } int B(char snake[]) {  int answer,j;    if(snake[0] == '>' && snake[1] == '^'){   for(j = 2; snake[j] == 'Q' && snake[j+1] == '='; j += 2){  }  if(snake[j] == '~' && snake[j+1] == '~'){   return answer = 1;   }  }    return answer; } int main(void) {  int i,j,n,t;  char snake[110];    scanf("%d",&n);  for(i = 0; i < n; i++){   scanf("%s",snake);   if( A(snake) == 1 ){    puts("A");   }else if( B(snake) == 1 ){    puts("B");   }else{    puts("NA");   }  }  return 0; } 半角スペースが書けないようなので見やすいように全角スペースにしています。 よろしくお願いします

  • Java Applet での虫食い算での質問

    初めて利用させていただきます。 今、課題で虫食い算のプログラムを作成しているのですが、うまく動作してくれません。 もしよろしければご指摘をしてもらえればと思い書き込みのほうをさせていただきます。 import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Event; import java.awt.Font; import java.awt.Graphics; import java.awt.Panel; import java.applet.Applet; public class musikuizan_1 extends Applet { int A, B; int cnt; int sub(int n,int m) { int i; for (i=1; i<m; i++) n /= 10; return n % 10; } void puzzle() { int a; int b; int c; int d; int e; for (a=1; a<=99; a++) { for (b=1; b<=99; b++) { c = a * (b % 10); d = a * (b / 10); e = a * b; if (c>=100 && c<=999 && d>=10 && d<=99 && e>=100 && e<=999) /*桁数調整*/ { if (sub(b,1)==3 && sub(c,2)==1 && sub(d,2)==8) /*穴埋めされてある部分の数*/ { A = a; B = b; cnt++; } } } } } public void init() { setBackground(new Color(150,180,200)); setLayout(new BorderLayout()); Panel psouth = new Panel(); psouth.add(new Button("実行")); add("South", psouth); } public void paint(Graphics g) { int i, c, d, e; for (i=1; i<=2; i++) { g.drawRect(97-i*20, 5,16,16); g.drawRect(97-i*20,25,16,16); g.drawRect(77-i*20,65,16,16); } for (i=1; i<=3; i++) { g.drawRect(97-i*20,45,16,16); g.drawRect(97-i*20,85,16,16); } for (i=1; i<=4; i++) g.drawLine(30,43,100,43); g.drawLine(30,83,100,83); g.setFont(new Font("Helvetica",Font.BOLD,18)); g.drawString("x",40, 40); if (A == 0) { g.drawString("3",60, 40); g.drawString("1",60, 60); g.drawString("8",60, 80); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.drawString("cnt = ",30,115); } else { c = A * (B % 10); d = A * (B / 10); e = A * B; g.setFont(new Font("Helvetica",Font.BOLD,18)); for (i=1; i<=2; i++) { g.drawString(Integer.toString(sub(A,i)),100-i*20, 20); g.drawString(Integer.toString(sub(B,i)),100-i*20, 40); } for (i=1; i<=3; i++) { g.drawString(Integer.toString(sub(c,i)),100-i*20, 60); g.drawString(Integer.toString(sub(d,i)), 80-i*20, 80); } for (i=1; i<=4; i++) g.drawString(Integer.toString(sub(e,i)),100-i*20,100); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.drawString("cnt = "+Integer.toString(cnt),30,115); } } public boolean action(Event e, Object arg) { if ("実行".equals(arg)) { if (A == 0) puzzle(); else A = cnt = 0; repaint(); } return true; } }

    • ベストアンサー
    • Java
  • 配列のポインタについて

    C言語で処理が下記のような処理を作成したいと思っております。 関数の引数によって、データを代入する配列を切り替えたいと考えております。 下記のような処理を考えた場合、if文の中・for文のbuffをどのように処理すれば よいでしょうか? アドバイスよろしくお願い致します。 int a[100][150]; int b[100][150]; void sample(int flg) { int i,j; unsigned short *buff; if(flg == 0){ buff = &a; }else{ buff = &b; } for( j=0 ; j<100 ; j++ ){ for( i=0 ; i<150 ; i++ ){ buff[y][x] = data; x++; } x = 0; y++; } }

  • C++のソースコードについて

    このコードを書いてビルドまでノーエラーで通ったのですがいざ起動してみると起動した瞬間に動作を停止しました。と表示されて何もできません。 #include<iostream> #include<algorithm> using namespace std; int main(){ long long d[2000], e[2000]; int w[2000], h[2000], a[1501 * 1024], b[1502 * 1024], n, m; while (cin >> n >> m, n){ long k = 1, l = 1, count = 0, f = 0; for (int i = 0; i < n; i++) { d[i] = 0; cin >> w[i]; if (!i)d[0] = w[i]; else d[i] += w[i] + d[i - 1]; } for (int i = 0; i < m; i++) { e[i] = 0; cin >> h[i]; if (!i)e[0] = h[i]; else e[i] += h[i] + e[i - 1]; } a[0] = d[0]; b[0] = e[0]; for (int i = 1; i < n; i++) for (int j = 0; j < i; j++){ a[k] = d[i] - d[j]; k++; } for (int i = 1; i < m; i++) for (int j = 0; j < i; j++){ b[l] = e[i] - e[j]; l++; } sort(a, a + n); sort(b, b + m); for (int i = 0; i < n; i++){ for (; f < m; f++){ if (a[i] == b[f]){ count++; f++; break; } if (a[i] < b[f])break; } } cout << count << endl; } } ちなみにこの問題はhttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2015 です

  • [至急!]Javaのプログラミング

    野球のBSOカウンタを作ろうとしているのですが、エラーが出ないもののうまく動きません。動作としてはsと入力したらSのカウンタに「〇」を表示、といったことをO(アウト)カウンタが3つになるまで行うプログラムなのですが、入力と出力の両方をうまくループすることが出来ません。分かる方がいたら教えてください。私が作ったものは下のものです。これを改良して作っていただけると助かります。 import java.io.*; public class test1 { public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //String str=br.readLine(); //char hantei=str.charAt(0); int sc=0,bc=0,oc=0; while(oc<3){ String str=br.readLine(); char hantei=str.charAt(0); if(hantei=='s') { sc=sc+1; if(sc==3) oc=oc+1; sc=0; bc=0; } else if(hantei=='b') { bc=bc+1; if(bc==4) sc=0; bc=0; } else if(hantei=='o') { oc=oc+1; sc=0; bc=0; } else { System.out.println("入力が違います。"); } } System.out.print("B "); for(int i=0;i<=bc;i++){ System.out.print("〇"); } System.out.println(""); System.out.print("S "); for(int i=0;i<=sc;i++){ System.out.print("〇"); } System.out.println(""); System.out.print("O "); for(int i=0;i<=oc;i++){ System.out.print("〇"); } System.out.println(""); } } 出力例 s(入力) B S 〇 O s(入力) B S 〇〇 O s(入力) B S O 〇 これをアウトカウントが3つになるまで行うプログラムです。

    • ベストアンサー
    • Java
  • Start:アプレットは初期化されていません、、というエラーが出る。

    アプレットを勉強している初心者です。 落ちものゲームを作ろうと思い、本に載っているサンプルを分かるところから書いていこうとしています。 そうしたら(もちろんまだ全体の途中、というか始めたばかりですが)タイトルのようなエラーが出てしまいました。 今の段階でのソースを載せるので、もし分かる方がいたら、よろしくお願いします。 import java.applet.Applet; import java.awt.*; import java.util.*; import java.awt.event.*; public class jisaku extends Applet{ int square = 8; int nw = 23; int nh = 24;//ブロック位置の最大数 int block[][] = new int[4][4];//動くブロックの形 int board[][] = new int[nh+1][nw+1];//盤面にあるブロックの有無 Dimension d;//表示スクリーン Image offs;//オフスクリーン Graphics grf; public void init(){ //********盤面のブロックの初期化(board[][]の初期化(=フィールドと枠)だけ)************ //フィールドにはブロックはない for(int i = 0; i <= nh; i++){ for(int j = 0; i <= nw; j++){ board[i][j] = 0;//盤面にはブロックはない } } //左右下の固定ブロック for(int i = 0; i <= nh; i++){ for(int j = 0; j <= nw; j++){ board[i][j] = 2; board[i][nw-j] = 1; } } for(int i = 0; i < 3; i++){ for(int j = 0; j <= nw; j++){ board[nh-i][j] = 2; } } //************オフスクリーンの設定********* d = getSize(); offs = createImage(d.width, d.height); grf = offs.getGraphics(); } public void paint(Graphics g){ update(g); } public void update(Graphics g){ //[grf]はオフスクリーンのグラフィックスオブジェクト(というのかな?) //バックをオレンジで塗る grf.setColor(Color.orange); grf.fillRect(0,0,d.width,d.height); //ブロックを描く grf.setColor(Color.blue); for(int i = 0; i <= nh; i++){ for(int j = 0; j <= nw; j++){ if(board[i][j] >= 1){ grf.fillRect(j*square, i*square, square, square); } } } //左右下の枠を描く grf.setColor(Color.red); for(int i = 0; i <= nh; i++){ for(int j = 0; j <3; j++){ grf.fillRect(j*square, i*square, square, square); grf.fillRect((nw-j)*square, i*square, square, square); } } for(int i =0; i < 3; i++){ for(int j = 0; j <= nw; j++){ grf.fillRect(j*square, (nh-i)*square, square, square); } } g.drawImage(offs, 0, 0, this); } }

    • ベストアンサー
    • Java

専門家に質問してみよう