この記事では、鉱山掃除ゲームとJava Swingが実装した改良バージョンについて説明します。次のように、参照のために共有してください。
バージョン1:
パッケージawtdemo; import java.awt.event.actionevent;インポートjava.awt.event.event.actionlistener; Import java.awt.event.MouseEvent; Import java.awt.event.MouseListener; Import javax.swing.jbutton; Import javax.swing.swing.swing.swing.swing.swing.swing.swing.swing.swing.swing.swing.swing.swing.swing.swing。 Swingによって書かれた単純な鉱山掃除の例、初心者が練習するのに適している*もちろん、書き込み機能は行われていません。 *行われた関数にはバグがあります * * @author ping_qc */public classテストは、jframeを実装します。プライベートファイナルint empty = 0;プライベートファイナルint鉱山= 1;プライベートファイナルintチェック= 2;プライベートファイナルint mine_count = 10; // Thunder Private final int button_border = 50の数。 //各ポイントのサイズプライベート最終int mine_size = 10; //インターフェイス仕様、20x20プライベートファイナルint start_x = 20; //ポジションxプライベートファイナルint start_y = 50; //ポジションYプライベートブールフラグを開始します。 Private JButton [] [] JB;プライベートJlabel JL;プライベートJlabelショータイム。 private int [] [] []マップ; /***ポイントの周りに稲妻があるかどうかを検出します。周囲のポイントの座標は、この配列*/ private int [] [] mv = {{-1、0}、{-1、1}、{0、1}、{1、1}、{1、0}、{1、-1}、{-1、-1、-1}}から計算できます。 / *** sunderのセット数をランダムに生成*/ public void makemine(){int i = 0、tx、ty; for(; i <mine_count;){tx =(int)(math.random() * mine_size); ty =(int)(math.random() * mine_size); if(map [tx] [ty] == empt){map [tx] [ty] = mine; i ++; //繰り返される稲妻を覚えていません}}}}/ ***ボタン配列をフレームに配置し、マップに対応し、[] [] [] [] [] [] [] []/ public void makebutton(){for(int i = 0; i <mine_size; i ++){for(j = 0; j <mine_size; j ++){jb [i] = jbutton() // if(map [i] [j] == mine)// jb [i] [j] .settext(i+"、"+j); //リスナーはjb [i] [j] .addactionlistener(this)を追加します。 jb [i] [j] .addmouseListener(this); jb [i] [j] .setname(i + "_" + j); //便利なクリックは、どのボタンをクリックしたかを決定することです// font font = new font(font.serif、font.bold、10); // jb [i] [j] .setfont(font); // jb [i] [j] .settext(i+"、"+j); jb [i] [j] .setbounds(j * button_border + start_x、i * button_border + start_y、button_border、button_border); this.add(jb [i] [j]); }}} public void init(){flag = false; jl.settext( "テストへようこそ、合計「 + mine_count +" thunder "があります); jl.setVisible(true); jl.setbounds(20、20、500、30); this.add(jl); showtime.settext( "Elapsed:0秒"); showtime.setbounds(400、20、100、30); this.add(showtime); makemine(); makebutton(); this.setsize(550、600); this.setlocation(700、100); this.SetSizable(false); this.setDefaultCloseoperation(exit_on_close); this.setVisible(true); } public test(string title){super(title); this.setlayout(null); //レイアウトマネージャーを使用していない場合、各コントロールの位置をSetBounds JB = new JButton [Mine_Size] [Mine_Size]; jl = new Jlabel(); showtime = new Jlabel(); map = new int [mine_size] [mine_size]; //ボタンを配列にマッピング} public static void main(string [] args){test test = new Test( "wulin.com-mineスイープゲームテスト1"); test.init(); test.run(); } @Override public void ActionPerformed(actionEvent e){object obj = e.getSource(); int x、y; if((obj instanceof jbutton)== false){showmessage( "error"、 "internal error");戻る; } string [] tmp_str =((jbutton)obj).getname()。split( "_"); x = integer.parseint(tmp_str [0]); y = integer.parseint(tmp_str [1]); if(map [x] [y] == mine){showmessage( "death"、 "あなたは鉱山に足を踏み入れました~~~"); flag = true; showmine();戻る; } dfs(x、y、0); checksuccess(); } / ** *クリックするたびに、有効なステータスを持つボタンの数を計算することにより、すべての稲妻が見つかったかどうかを判断します * / private void checksuccess(){int cnt = 0; for(int i = 0; i <mine_size; i ++){for(int j = 0; j <mine_size; j ++){if(jb [i] [j] .isenabled()){cnt ++; }}} if(cnt == mine_count){string tmp_str = showtime.getText(); tmp_str = tmp_str.replaceall( "[^0-9]"、 ""); showmessage( "victory"、 "このminesweepが共有されるとき:" + tmp_str + "秒"); flag = true; showmine(); }} private int dfs(int x、int y、int d){map [x] [y] = checked; int i、tx、ty、cnt = 0; for(i = 0; i <8; i ++){tx = x+mv [i] [0]; ty = y + mv [i] [1]; if(tx> = 0 && tx <mine_size && ty> = 0 && ty <mine_size){if(map [tx] [ty] == mine){cnt ++; //この点近くの雷番号の統計} else(map [tx] [ty] == empty){; } else if(map [tx] [ty] == checked){; }}} if(cnt == 0){for(i = 0; i <8; i ++){tx = x+mv [i] [0]; ty = y + mv [i] [1]; if(tx> = 0 && tx <mine_size && ty> = 0 && ty <mine_size && map [tx] [ty]!= checked){dfs(tx、ty、d + 1); }}} else {jb [x] [y] .settext(cnt + ""); } jb [x] [y] .setEnabled(false); CNTを返します。 } / ** * jlタグにいくつかの情報を表示 * * @param title * @param info * / private void showmessage(string title、string info){jl.settext(info); system.out.println( "in functino showmessage():" + info); } public void run(){int t = 0; while(true){if(flag){break; } try {thread.sleep(1000); } catch(arturnedexception e){e.printstacktrace(); } t ++; showtime.settext( "Elapsed:" + t + "秒"); } // showmine(); } private void showmine(){// icon iconmine = new ImageIcon( "e:/mine.jpg"); for(int i = 0; i <mine_size; i ++){for(int j = 0; j <mine_size; j ++){if(map [i] [j] == mine){jb [i] [j] .settext( "#"); // jb [i] [j] .seTicon(iConmine); }}}} @Override public void mouseClicked(mouseEvent e){if(e.getButton()== 3){object obj = e.getSource(); if((obj instanceof jbutton)== false){showmessage( "error"、 "internal error");戻る; } string [] tmp_str =((jbutton)obj).getname()。split( "_"); int x = integer.parseint(tmp_str [0]); int y = integer.parseint(tmp_str [1]); if( "{1}」。 } else {jb [x] [y] .settext( "{1}"); } /* if(jb [x] [y] .geticon()== null){jb [x] [y] .seticon(new ImageIcon( "e:/flag.jpg")); } else {jb [x] [y] .seticon(null); }*/}} @Override public void mousepressed(mousevent e){// todo auto-fide method stub} @override public void mouseReleased(// todo auto-generated method stub} @override void mousetered(mouseevent ec wubride) void mouseexited(mousevent e){// todo auto-enerated method stub}}ランニング効果:
バージョン2は、上記のバージョン1プログラムの改善であり、右クリックマーキング関数と独立した選択難易度関数が、変更されていないベースに基づいて追加されます。
パッケージawtdemo; import java.awt.event.actionevent; import java.awt.event.event.actionlistener; Import java.awt.event.MouseEvent; Import java.awt.event.MouseListener; Import javax.swing.jbutton; Import Javax.swing.jframe; javax.swing.jlabel; @suppresswarnings( "serial")パブリッククラスsaolei拡張jframe exprention actionlistener、runnable、mouselistener {private final int loempty = 0;プライベートファイナルイントロミン= 1;プライベートファイナルint lochecked = 2;プライベートファイナルint lomine_count = 10;プライベートファイナルint lobutton_border = 50;プライベートファイナルint lomine_size = 10;プライベートファイナルint lostArt_x = 20;プライベートファイナルint lostArt_y = 50;プライベートブールフラグ。 Private JButton [] [] JB;プライベートJlabel JL;プライベートJlabelショータイム。 private int [] [] []マップ; private int [] [] [] mv = {{-1、0}、{-1、1}、{0、1}、{1、1}、{1、0}、{1、-1}、{0、-1}、{-1、-1}}}; public void makelomine(){int i = 0、tx、ty; for(; i <lomine_count;){tx =(int)(math.random() * lomine_size); ty =(int)(math.random() * lomine_size); if(map [tx] [ty] == loempty){map [tx] [ty] = lomine; i ++; }}}} public void makebutton(){for(int i = 0; i <lomine_size; i ++){for(int j = 0; j <lomine_size; j ++){jb [i] [j] = new jbutton(); jb [i] [j] .addactionlistener(this); jb [i] [j] .addmouseListener(this); jb [i] [j] .setname(i + "_" + j); jb [i] [j] .setbounds(j * lobutton_border + lostart_x、i * lobutton_border + lostart_y、lobutton_border、lobutton_border); this.add(jb [i] [j]); }}} public void init(){flag = false; jl.settext( "歓迎、合計「 + lomine_count +" thunder "); jl.setVisible(true); jl.setbounds(20、20、500、30); this.add(jl); showtime.settext( "Elapsed:0秒"); showtime.setbounds(400、20、100、30); this.add(showtime); Makelomine(); makebutton(); this.setsize(550、600); this.setlocation(700、100); this.SetSizable(false); this.setDefaultCloseoperation(exit_on_close); this.setVisible(true); } public saolei(string title){super(title); this.setlayout(null); //レイアウトマネージャーは使用されません。各コントロールの位置JB = new jbutton [lomine_size] [lomine_size]; jl = new Jlabel(); showtime = new Jlabel(); map = new int [lomine_size] [lomine_size]; //ボタンを配列にマッピング} public static void main(string [] args){saolei test = new saolei( "wulin.com-mine sweepingゲームテスト2"); test.init(); test.run(); } @Override public void ActionPerformed(actionEvent e){object obj = e.getSource(); int x、y; if((obj instanceof jbutton)== false){showmessage( "error"、 "internal error");戻る; } string [] tmp_str =((jbutton)obj).getname()。split( "_"); x = integer.parseint(tmp_str [0]); y = integer.parseint(tmp_str [1]); if(map [x] [y] == lomine){showmessage( "death"、 "あなたは鉱山に足を踏み入れました~~~"); flag = true; showlomine();戻る; } dfs(x、y、0); checksuccess(); } private void checksuccess(){int cnt = 0; for(int i = 0; i <lomine_size; i ++){for(int j = 0; j <lomine_size; j ++){if(jb [i] [j] .isenabled()){cnt ++; }}} if(cnt == lomine_count){string tmp_str = showtime.getText(); tmp_str = tmp_str.replaceall( "[^0-9]"、 ""); showmessage( "victory"、 "このminesweepが共有されるとき:" + tmp_str + "秒"); flag = true; showlomine(); }} private int dfs(int x、int y、int d){map [x] [y] = lochecked; int i、tx、ty、cnt = 0; for(i = 0; i <8; i ++){tx = x+mv [i] [0]; ty = y + mv [i] [1]; if(tx> = 0 && tx <lomine_size && ty> = 0 && ty <lomine_size){if(map [tx] [ty] == lomine){cnt ++; } else if(map [tx] [ty] == loempty){; } else if(map [tx] [ty] == lochecked){; }}} if(cnt == 0){for(i = 0; i <8; i ++){tx = x+mv [i] [0]; ty = y + mv [i] [1]; if(tx> = 0 && tx <lomine_size && ty> = 0 && ty <lomine_size && map [tx] [ty]!= lochecked){dfs(tx、ty、d + 1); }}} else {jb [x] [y] .settext(cnt + ""); } jb [x] [y] .setEnabled(false); CNTを返します。 } private void showmessage(string title、string info){jl.settext(info); system.out.println( "in functino showmessage():" + info); } public void run(){int t = 0; while(true){if(flag){break; } try {thread.sleep(1000); } catch(arturnedexception e){e.printstacktrace(); } t ++; showtime.settext( "Elapsed time:" + t + "秒"); }} private void showlomine(){for(int i = 0; i <lomine_size; i ++){for(int j = 0; j <lomine_size; j ++){if(map [i] == lomine){jb [i] [j] .settext( "thunder"); }}}}} public void mouseclicked(mousevent e){if(e.getButton()== 3){object obj = e.getSource(); if((obj instanceof jbutton)== false){showmessage( "error"、 "internal error");戻る; } string [] tmp_str =((jbutton)obj).getname()。split( "_"); int x = integer.parseint(tmp_str [0]); int y = integer.parseint(tmp_str [1]); if( "{1} quot" .equals(jb [x] [y] .getText())){jb [x] [y] .settext( ""); } else {jb [x] [y] .settext( "{1} quot"); }}}} public void mousepressed(mouseEvent e){} @Override public void mouseReed(mouseEvent e){} public void mouseentered(mousevent e){} @Override public void mouseExited(mousevent e){}}}}}ランニング効果:
Javaアルゴリズムの詳細については、このサイトに興味のある読者は、「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの要約」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」というトピックを見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。