Javaで美術館パズルを作ろうとしたのですが、、、

このQ&Aのポイント
  • Java言語を使い美術館パズルを作成しようと思いましたが、柱や番号をframeやbuttonとしておき、クリックしたらそこにランプが置けるか判定し、可能ならば緑のランプを点灯させることはできました。
  • しかし、その置いたランプから十字方向に黄色いランプを点灯させる良いプログラミングが思い浮かびません。
  • アイディアや方法があれば、教えてください。
回答を見る
  • ベストアンサー

Javaで美術館パズルを作ろうとしたのですが、、、

Java言語(eclipse)を使い美術館パズル(http://www.nikoli.com/ja/puzzles/bijutsukan/)を作成しようと思い作っていき、柱や番号をframeやbuttonとしておき、クリックしたらそこにランプが置けるか判定し、可能ならば緑のランプを点灯させるところまでは何とかプログラミングできました。しかしその後、その置いたランプから十字方向に(柱にぶつかるまで)黄色いランプを点灯させる良いプログラミングが思い浮かびません。1から作り直すようなアイディアでも構いませんので、何かいい方法があれば、ぜひ教えてください。以下に自分の悩んでいる部分を載せておきます。↓ class MuseumGame extends JFrame implements ActionListener { JPanel panel; MyButton[][] button; MyButton[] lamp; MyButton[][] lamp2; int lamp_count; MuseumGame(GameData data) { setTitle("美術館パズル"); setSize(500,500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); panel = new JPanel(); add(panel); panel.setLayout(new GridLayout(data.w,data.h)); button = new MyButton[data.h][data.w]; for(int i=0; i<data.h; i++) { for(int j=0; j<data.w; j++) { button[i][j] = new MyButton(i,j); button[i][j].addActionListener(this); panel.add(button[i][j]); } } for(int i=0; i<data.n; i++) { int h = data.wall[i][0]; int w = data.wall[i][1]; int c = data.wall[i][2]; button[h][w].setWall(c); } lamp = new MyButton[data.h*data.w]; lamp_count = 0; } public void actionPerformed(ActionEvent ae) { MyButton button = (MyButton) ae.getSource(); if( button.isWall ) return; if( button.getText() == "■" ) { button.setText(""); } else { if( button.getBackground() == Color.WHITE ) { lampAdd(button); } else { lampDelete(button); } } } void lampAdd(MyButton button) { // 本当にそこにランプが置けるか判定する lamp[lamp_count++] = button; button.setBackground(Color.GREEN); // 柱の数値をチェックして影響を表示する // 四方の通路を黄色にする // 上を解決するいいアイディアをお願いします、、、

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

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

  • ベストアンサー
回答No.1

正直、良いかどうかはわからん。 http://ideone.com/xWGdB とりあえず正しい回答かどうかチェックはしないが、 testdata.txtに書いた内容を標準入力から取り込んで D:\>javac -encoding UTF-8 Main.java D:\>java Main < testdata.txt などとして実行した感じでは ランプの判定は間違ってなさそうに思う。

marumarumorimo
質問者

お礼

いろいろとありがとうございます。 参考にさせて頂きますm()m

関連するQ&A

  • C#についてです

    複数のグラフを作成しようと思い、2つのクラスを作りました。 1つ目のクラスで、下のように書き、 public class clsWave { public const int count = 1024; public int[] data = new int[count];     public byte range; public double[] realValue = new double[count]; public PictureBox pcb;     public Pen myPen; ; public void Draw(Graphics g, int v) { int h = pcb.Height; int w = pcb.Width; int stpW = w / count; // X座標       Point[] lp = new Point[count]; for (int i = 0; i < data.Length; i++) { lp[i] = new Point(i * stpW, h - (int)(realValue[i] / (v * 8) * h)); } g.DrawLines(myPen, lp); } } もう一つのクラスで、グラフを下のように作りました。      clsWave BI = new clsWave(); clsWave BV = new clsWave(); clsWave CI = new clsWave(); clsWave CV = new clsWave(); clsWave EI = new clsWave(); clsWave EV = new clsWave(); clsWave SI = new clsWave(); clsWave SV = new clsWave(); この、グラフを配列にしたいのですが、私の力では、まだわかりません。 どのように作ればよいのでしょうか?教えてください。よろしくお願いいたします。

  • javaプログラミングについて

    ただいまjavaプログラム勉強中でhit&blowを制作しております。 public static void main(String[] args) { Scanner scan = new Scanner(System.in); Random rand = new Random(); int[] answer = new int[4]; int[] input = new int[4]; int[] Number = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; int x = 10; for (int i = 0; i < 4; i++) { int select = (int) (Math.random() * x); answer[i] = Number[select]; Number[select] = Number[x - 1]; x--; } int count = 1; while (true) { System.out.println("4桁の異なる数値を入力"); int str_input = scan.nextInt(); // 代入 for (int i = 0; i < 4; i++) { input[i] = str_input; } // hit int hit = 0; for (int i = 0; i < 4; i++) { if (input[i] == answer[i]) { hit++; } } // blow int blow = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++){ if (i != j && input[i] == answer[j]) { blow++; } } } if (hit == 4) { System.out.println("4hit"); System.out.println("正解まで " + count + "回"); break; } else { System.out.println("Hit:" + hit + " Blow:" + (blow - hit)); count++; } } } } 数字が4桁で作っているのですが、数字や4桁以上を入力してしまった場合の表示は後にしようとして、先にhitとblowの判定を作ろうとしているのですが、上記で実行したところhitとblowの判定がされずhit:0blow:0と表示されてしまいます。解決策を教えてください。 自分で作ってみたものの、hit blowの判定方法があっているかも自信がないです。

    • ベストアンサー
    • Java
  • パネルに画像

    パネルに 画像を入れることはできますか? 以下のボタンを画像に出来ないかと思うのですが 教えてください よろしくお願いします Button b[] = new Button[6]; for( int i = 0; i<6; i++ ) b[i] = new Button( "" + i ); Panel p = new Panel( new GridLayout( 2, 3 ) ); for( int i=0; i<6; i++ ) p.add( b[i] );

    • ベストアンサー
    • Java
  • javaのプログラムについて

    初めまして。java初心者のものです。 コンピュータとじゃんけんをするというプログラムをつくりたいのですが、 コンパイルしたところ、次のようなエラーが出ました。 「シンボルが見つかりません。」 どこをどう直せばよいのでしょうか。お教え願います。 以下が私のプログラムです。 import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.applet.AudioClip; class Zyanken extends YJFrame implements ActionListener{ JButton[] btn; JPanel panel; Zyanken(String s, int w, int h,int b){ super(s,w,h,b); String[] ttl={"グー","チョキ","パー","Exit"}; String[] tips={"グーです","チョキです","パーです","終了します"}; int i; setUp(); Icon[] ic=new Icon[4]; for(i=0;i<4;i++) ic[i]=new ImageIcon("icon"+i+".gif"); btn=new JButton[4]; for(i=0;i<4;i++){ btn[i]=new JButton(ttl[i],ic[i]); btn[i].setToolTipText(tips[i]); btn[i].addActionListener(this); } JPanel p=new JPanel(); for(i=0;i<4;i++) p.add(btn[i]); p.setBackground(Color.pink); pane.add(p,BorderLayout.SOUTH); panel=new JPanel(); pane.add(panel,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ int com=(int)(Math.random()*4); if(com==1){ panel.setText("COMはグーです。"); } else if(com==2){ panel.setText("COMはチョキです。"); } else{ panel.setText("COMはパーです。"); } if(e.getSource()==btn){ if(com==1){ panel.setText("あいこです。"); } else if(com==2){ panel.setText("あなたの勝ちです。"); } else{ panel.setText("あなたの負けです。"); } } else if(e.getSource()==btn){ if(com==1){ panel.setText("あなたの負けです。"); } else if(com==2){ panel.setText("あいこです。"); } else{ panel.setText("あなたの勝ちです。"); } } else{ if(com==1){ panel.setText("あなたの勝ちです。"); } else if(com==2){ panel.setText("あなたの負けです。"); } else{ panel.setText("あいこです。"); } } } } 大変恐縮ですが、よろしくお願いします。

  • java 初心者です。

    COMとじゃんけんをし、勝敗を決定するというプログラムを作りたいのですが、 コンパイルしたところ、33行目に「シンボルが見つけられません」というエラーが出ます。 (合計12個のエラーがでます) どこを直せばこのエラーは解決されるのでしょうか。 すいませんが、よろしくお願いします。 以下がプログラムです。 import java.awt.event.*; import java.awt.*; import javax.swing.*; class Zyanken extends YJFrame implements ActionListener{ JButton[] btn; JPanel panel; Zyanken(String s, int w, int h,int b){ super(s,w,h,b); String[] ttl={"グー","チョキ","パー","Exit"}; String[] tips={"グーです","チョキです","パーです","終了します"}; int i; setUp(); Icon[] ic=new Icon[4]; for(i=0;i<4;i++) ic[i]=new ImageIcon("icon"+i+".gif"); btn=new JButton[4]; for(i=0;i<4;i++){ btn[i]=new JButton(ttl[i],ic[i]); btn[i].setToolTipText(tips[i]); btn[i].addActionListener(this); } JPanel p=new JPanel(); for(i=0;i<4;i++) p.add(btn[i]); p.setBackground(Color.pink); pane.add(p,BorderLayout.SOUTH); panel=new JPanel(); pane.add(panel,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ int com=(int)(Math.random()*4); if(com==1){ panel.setText("COMはグーです。"); } else if(com==2){ panel.setText("COMはチョキです。"); } else{ panel.setText("COMはパーです。"); } if(e.getSource()==btn){ if(com==1){ panel.setText("あいこです。"); } else if(com==2){ panel.setText("あなたの勝ちです。"); } else{ panel.setText("あなたの負けです。"); } } else if(e.getSource()==btn){ if(com==1){ panel.setText("あなたの負けです。"); } else if(com==2){ panel.setText("あいこです。"); } else{ panel.setText("あなたの勝ちです。"); } } else{ if(com==1){ panel.setText("あなたの勝ちです。"); } else if(com==2){ panel.setText("あなたの負けです。"); } else{ panel.setText("あいこです。"); } } } }

  • javaのシェルソートについて質問です

    //Sample482 import java.util.Random; class Sample482{ static int shellSort1(int[] x){ int n = x.length; int cnt = 0; for(int h = n/2;h > 0;h /= 2){ for(int i = h;i < n;i++){ int tmp = x[i]; int j; for(j = i;j > h-1 && x[j-h] > tmp;j -= h){ cnt++; x[j] = x[j-h]; } x[j] = tmp; } } return cnt; } public static void main(String[] args){ Random rand = new Random(); int n = 20000; int[] x = new int[n]; for(int i = 0;i < n;i++){ x[i] = rand.nextInt(1000000); } int cnt = shellSort1(x); System.out.println("昇順にソートしました。"); for(int i = 0;i < n;i++){ System.out.println("x[" + i + "]=" + x[i]); } System.out.println("要素の移動回数" + cnt); } } //Sample483 import java.util.Random; class Sample483{ static int shellSort2(int[] x){ int n = x.length; int cnt = 0; int h; for(h = 1;h < n/9;h = 3*h+1); for(;h > 0;h /= 3){ for(int i = h;i < n;i++){ int j; int tmp = x[i]; for(j = i-h;j >= 0 && x[j] > tmp;j -= h){ x[j+h] = x[j]; cnt++; } x[j+h] = tmp; } } return cnt; } public static void main(String[] args){ Random rand = new Random(); int n = 20000; int[] x = new int[n]; for(int i = 0;i < n;i++){ x[i] = rand.nextInt(1000000); } int cnt = shellSort2(x); System.out.println("昇順にソートしました。"); for(int i = 0;i < n;i++){ System.out.println("x[" + i + "]=" + x[i]); } System.out.println("要素の移動回数:" + cnt); } } 上記のSample482とSample483はどちらもシェルソートを扱ったコードです。 参考書やネットの情報によると、後者のSmple483のシェルソートの方がより高速にソート することができるらしいのですが、実際に実行してみると、要素の移動回数は Sample482よりSample483の方が多くなります。 要素の移動回数が多いということは、それだけソートに時間がかかると私は思うのですが、 何故、後者のシェルソートの方が高速に動くといえるのでしょうか?

  • javaで配列の格納をしたいです。

    配列の格納がうまくいきません。 javaについて質問させて頂きます。 ユーザーが数字を入力し配列 atr[ i ]に格納され 配列 v[ i ] に v[ 0 ] = count ... v[ 143 ] = count ... v[ 144 ] = count - 1 ... v[ 287 ] = count - 1 ... ... v[ count-288 ] = 2 ... v[ count-145 ] = 2 ... v[ count-144 ] = 1 ... v[ count-1 ] = 1 と、格納されるようなプログラムを作っています。 for文で作ろうと考えたのですが count, count-1 , ... 3, 2, 1と値を入れようと思いましたがうまくコンパイルが通りませんでした。 エラーは以下になります。 a.java:48: シンボルを見つけられません。 シンボル: メソッド readLine(int) 場所 : java.io.BufferedReader の クラス value = br_v.readLine(atr[i]); もし宜しければアドバイスやご指摘を頂けませんでしょうか。 説明も拙い部分がありますが宜しければお願いします。 import java.io.*; import java.util.Arrays; class a { public static void main(String[] args) throws IOException { int atr[]; atr = new int[25]; int count = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true){ //絶対に通る String str = br.readLine(); int res = Integer.parseInt(str); if(res == 0){ break; } else{ atr[count] = res; } count++; } for(int i=0; i<count; i++){ System.out.println(atr[i] + "が、選択されました。"); } int v[] = new int[25*144]; String value; try{ BufferedReader br_v = new BufferedReader(new InputStreamReader(System.in)); for(int i=count; i<count; i--){ value = br_v.readLine(atr[i]); v[i] = Integer.parseInt(value); } } catch(IOException e){ System.out.println("エラーです。"); } } }

  • 15パズルの作り方が分かりません!

    ご閲覧ありがとうございます。 実は大学で、「15パズル」のプログラムを作れという課題が出たのですが、上手く動きません。プログラミングに関してはほぼ初心者で、どこがどうまちがっているのか、どのように直したらきちんと動くのかが全く分かりません・・・。!il||li(っω-`。)il||li 助けて下さい!お願いします(´;ω;`) 以下が私がいじっていたプログラムです <html> <head> <title>15パズル</title> <script type="text/javascript"> // 初期盤面を生成するプロシージャ function gstart() { var checked=new Array(15); // 「使用済み」のチェック用 var i, j; // カウンタ var n; // パネル番号 var p; // パリティ計算用 var parity = false; // 奇順列の状態 var flag; // その数が使用済みかどうか while(parity==false){ // 奇順列の間は繰り返す for(i=0;i<16;i++) checked[i]=false; // すべて未使用状態化 for(i=0;i<16;i++){ // パネル番号を順に決める flag = false; // 最初はパネル番号未決定とする while(flag==false){ // 未使用状態の間は繰り返す n = Math.floor(Math.random()*16); // nに0~8の乱数を設定 if(checked[n]==false){ // nが未使用なら pnum[i] = n; // i番目のパネルのパネル番号をn checked[n] = true; // nを使用済みにする flag = true; // パネル番号決定 } } } p = 0; // 偶順列か奇順列かの計算 for(i=0;i<15;i++){ for(j=i+1;j<16;j++){ if(pnum[i]!=0 && pnum[j]!=0){ if(pnum[i]>pnum[j]) p++; // 互換の数を勘定 } } } if((p%2)==0) parity=true; // 互換の数が偶数なら偶順列 } for(i=0;i<16;i++){ if(pnum[i]==0) document.forms[0].elements[i].value= ""; else document.forms[0].elements[i].value= pnum[i]; } } function move(obj) { var i,j,k; for(j=0;j<16;j++) if(obj.value==pnum[j]) i=j; // objのパネル位置を調べる for(j=-4;j<2;j=j+3){ // 上下左右の隣接パネルの調査 k = i+j; if((k>=0&&k<16) && ((Math.floor(i/2)==Math.floor(k/2))||(i%2==k%2))){ if(pnum[k]==0){ // 隣が空なら入れ替え pnum[k] = pnum[i]; document.forms[0].elements[k].value= pnum[k]; pnum[i] = 0; document.forms[0].elements[i].value= ""; } } } } </script> </head> <body> <h1>15パズル</h1> [開始]ボタンクリックでスタート。 <form id="Form1"> <script type="text/javascript"> var i; var s; var pnum=new Array(16); // パネル番号記憶用 for(i=0;i<16;i++){ document.write("<input style='width:30px; height:30px;' type='button' value='"+(i+1)+"' onClick='move(this)'>"); if((i+1)%4==0) document.write("<br />"); } document.forms[0].elements[15].value= ""; </script> <br /> <input style="width:60px; height:30px;" type="button" value="開始" onClick="gstart()"><br /> </form> </body> </html>

  • 数独のJavaプログラム

    数独の解答を一発で出すプログラムを考えています。 自分が考えたプログラムは下記の通りです。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; for ( k=0; k<j; k++ ) if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ ) if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ ) for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ) break; count++; } count = 0; } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]); } System.out.print("\n"); } } } これを実行すると、正しい数独の解が出来るまでに実行を20~30回。多い時は200回前後実行しないと出来ません。 実行結果(0は数独のルール上数字が入らない所) 9 3 6 5 4 1 7 8 2 1 7 4 2 9 6 5 3 0 5 2 8 7 3 0 0 0 0 2 1 5 3 7 8 4 6 9 8 6 3 4 1 9 2 7 5 4 9 7 6 5 2 1 0 0 7 5 1 8 6 4 9 2 3 3 8 2 9 0 0 0 0 0 6 4 9 1 2 5 8 0 0 これを一発で0がない状態にしたいのです。 因みにC言語だと下記のプログラムで一発で出るのですが。(前回質問したプログラム) int main(void) { int i,j,k,l,chk=0,num=0,tmp,count=0; int a[9][9];  srand((unsigned) time(NULL)); start: count=0; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) a[i][j]=0; for(tmp=1;tmp<10;tmp++){ num=0; while(num<9){ i = rand() % 9; j = rand() % 9; chk=0; for(k=0;k<9;k++) if(a[i][k]==tmp)chk=1; for(k=0;k<9;k++) if(a[k][j]==tmp)chk=1; for(k=(i/3)*3;k<(i/3)*3+3;k++){ for(l=(j/3)*3;l<(j/3)*3+3;l++){ if(a[k][l]==tmp)chk=1; } } if((chk==0)&&(a[i][j]==0)){ a[i][j]=tmp; num++; } if(count%100==99){ count++; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) if(a[i][j]==tmp)a[i][j]=0; num=0; } if(count>10000) goto start; count++; } } for(i = 0; i < 9; i++){ for(j = 0; j < 9; j++){ printf("%d ",a[i][j]); } printf("\n"); } return 0; } このプログラムを実行すると一発で解答が出ます。 上のJavaプログラムを下のプログラムのようにするにはどうしたら良いでしょうか。

    • ベストアンサー
    • Java
  • C++の数独をJavaに変換したいのですが

    C言語のプログラムをJavaに変換しようと思っているのですが、上手くいきません。 下記のプログラムを実行すると、一発で数独の解答が出来上がるようになっています。 Javaにはgotoがないので、そこをどのように変えたらいいのかで迷っています。 どう直したら良いのでしょうか。 #include<stdio.h> #include<stdlib.h> #include <time.h> int main(void) { int i,j,k,l,chk=0,num=0,tmp,count=0; int a[9][9]; srand((unsigned) time(NULL)); start: count=0; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) a[i][j]=0; for(tmp=1;tmp<10;tmp++){ num=0; while(num<9){ i = rand() % 9; j = rand() % 9; chk=0; for(k=0;k<9;k++) if(a[i][k]==tmp)chk=1; for(k=0;k<9;k++) if(a[k][j]==tmp)chk=1; for(k=(i/3)*3;k<(i/3)*3+3;k++){ for(l=(j/3)*3;l<(j/3)*3+3;l++){ if(a[k][l]==tmp)chk=1; } } if((chk==0)&&(a[i][j]==0)){ a[i][j]=tmp; num++; } if(count%100==99){ count++; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) if(a[i][j]==tmp)a[i][j]=0; num=0; } if(count>10000) goto start; count++; } } for(i = 0; i < 9; i++){ for(j = 0; j < 9; j++){ printf("%d ",a[i][j]); } printf("\n"); } return 0; }

    • ベストアンサー
    • Java