이 기사에서는 Mine-Sweeping 게임과 Java Swing이 구현 한 개선 된 버전에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
Version 1:
패키지 awtdemo; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import javax.swing.jbutton; import javax.swing.jframe; javax.swing. Swing이 작성한 광산 스위프 예제, 초보자가 연습하기에 적합*이 프로그램은 SetBounds (X, Y, W, H)를 사용하여 제어* 메소드를 win XP에 내장 된 광산 스위핑을 말합니다. 물론, 작문 기능은 이루어지지 않았다. * 일부 기능에는 버그가있다 * @author ping_qc */public class test는 jframe empless actionlistener, runnable, mouselistener {private static final long serialversionuid = -241775839765039613L; 개인 최종 int empty = 0; 개인 최종 int 광산 = 1; 개인 최종 int 확인 = 2; 개인 최종 최종 int mine_count = 10; // Thunder Private Private Final int Button_border = 50; // 각 지점의 크기 개인 최종 최종 int mine_size = 10; // 인터페이스 사양, 20x20 개인 최종 최종 int start_x = 20; // 시작 위치 X 비공개 최종 int start_y = 50; // 시작 위치 y 개인 부울 플래그; 개인 JBUTTON [] [] JB; 개인 Jlabel JL; 개인 jlabel showtime; 개인 int [] []지도; /*** 한 지점 주위에 번개가 있는지 여부를 감지하십시오. 주변 지점의 좌표는이 배열*/ private int [] [] [] mv = {{-1, 0}, {-1, 1}, {0, 1, {1, 1}, {1, 0}, {1, -1}, {-1, -1}}; / *** 세트 수의 천둥 수를 무작위로 생성*/ 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] == empty) {map [tx] [ty] = mine; i ++; // 반복 된 번개를 기억하지 못한다}}}}/ *** 버튼 배열을 프레임에 넣고 맵 [] [] array*/ public void makebutton () {for (int i = 0; i <mine_size; i ++)에 해당합니다. // if (map [i] [j] == mine) // jb [i] [j] .settext (i+","+j); // 리스너가 add 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.set -Visible (true); JL. 세트 바운드 (20, 20, 500, 30); this.add (jl); showtime.settext ( "경과 : 0 초"); showtime.setbounds (400, 20, 100, 30); this.add (showtime); Makemine (); makebutton (); this.setsize (550, 600); this.setLocation (700, 100); this.setResizable (false); this.setDefaultCloseOperation (exit_on_close); this.set -Visible (true); } public test (문자열 제목) {super (title); this.setLayout (null); // 레이아웃 관리자를 사용하지 않고 SetBounds를 사용하여 각 컨트롤의 위치를 설정합니다. 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 ((jbutton의 obj instance) == false) {showMessage ( "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 ( "죽음", "당신은 광산을 밟았습니다 ~~~"); flag = true; showmine (); 반품; } dfs (x, y, 0); CheckSuccess (); } / ** *마다 클릭 한 후, 사용 가능한 상태로 버튼 수를 계산하여 모든 라이트 닝이 발견되었는지 여부를 결정하십시오. for (int i = 0; i <mine_size; i ++) {for (int j = 0; }}} if (cnt == mine_count) {문자열 tmp_str = showtime.getText (); tmp_str = tmp_str.replaceall ( "[^0-9]", ""); ShowMessage ( "Victory", "이 광산이 공유 될 때 :" + tmp_str + "seconds"); flag = true; showmine (); }} private int dfs (int x, int y, int d) {map [x] [y] = 확인; 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 tag * * @param title * @param info * / private void showmessage (문자열 제목, 문자열 정보) {jl.settext (info); System.out.println ( "functino showmessage () :" + info); } public void run () {int t = 0; while (true) {if (flag) {break; } try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } t ++; showtime.settext ( "경과 :" + t + "초"); } // showmine (); } private void showmine () {// Icon iconmine = new ImageIcon ( "e : /mine.jpg"); for (int i = 0; i <mine_size; i ++) {for (int j = 0; }}}} @override public void mouseclicked (mouseevent e) {if (e.getButton () == 3) {object obj = e.getSource (); if ((jbutton의 obj instance) == false) {showMessage ( "error", "내부 오류"); 반품; } string [] tmp_str = ((jbutton) obj) .getName (). split ( "_"); int x = integer.parseint (tmp_str [0]); int y = integer.parseint (tmp_str [1]); if ( "{1}". Equals (jb [x] [y] .getText ()))) {jb [x] [y] .settext ( ""); } 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 (mouseevent e) {// todo 자동 생성 메소드 스터브} @override public void mousereLeased (mouseevent e) {// to auto-auto-void methods stub} @override public void mouternered (mouseevent e) {// auto greced void mousevent e) {// void mouseexited (mouseevent e) {// todo 자동 생성 메소드 스텁}}}실행 효과 :
버전 2는 위 버전 1 프로그램의 개선이며 오른쪽 클릭 마킹 기능과 독립 선택 난이도 기능이 변경되지 않은 기준으로 추가됩니다.
패키지 awtdemo; import java.awt.event.actionevent; import java.awt.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 구현 ActionListener, Runnable, MousElistener {private final int loempty = 0; 개인 최종 int lomine = 1; 개인 최종 int lochecked = 2; 개인 최종 int lomine_count = 10; 개인 최종 INT LOBUTTON_BORDER = 50; 개인 최종 int lomine_size = 10; 개인 최종 INT LostART_X = 20; 개인 최종 int lostArt_y = 50; 개인 부울 깃발; 개인 JBUTTON [] [] JB; 개인 Jlabel JL; 개인 jlabel showtime; 개인 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.set -Visible (true); JL. 세트 바운드 (20, 20, 500, 30); this.add (jl); showtime.settext ( "경과 : 0 초"); showtime.setbounds (400, 20, 100, 30); this.add (showtime); Makelomine (); makebutton (); this.setsize (550, 600); this.setLocation (700, 100); this.setResizable (false); this.setDefaultCloseOperation (exit_on_close); this.set -Visible (true); } public saolei (문자열 제목) {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 스위핑 게임 테스트 2"); test.init (); test.run (); } @override public void ActionPerformed (ActionEvent e) {object obj = e.getSource (); int x, y; if ((jbutton의 obj instance) == false) {showMessage ( "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 ( "죽음", "당신은 광산을 밟았습니다 ~~~"); 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) {문자열 tmp_str = showtime.getText (); tmp_str = tmp_str.replaceall ( "[^0-9]", ""); ShowMessage ( "Victory", "이 광산이 공유 될 때 :" + tmp_str + "seconds"); 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 (문자열 제목, 문자열 정보) {jl.settext (info); System.out.println ( "functino showmessage () :" + info); } public void run () {int t = 0; while (true) {if (flag) {break; } try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } t ++; showtime.settext ( "경과 시간 :" + t + "초"); }} private void showlomine () {for (int i = 0; i <lomine_size; i ++) {for (int j = 0; j <lomine_size; j ++) {if (map [i] [j] == lomine) {jb [i] [j] .settext ( "Thunder"); }}}} public void mouseclicked (mouseevent e) {if (e.getButton () == 3) {object obj = e.getSource (); if ((jbutton의 obj instance) == false) {showMessage ( "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 mousereLed (mouseevent e) {} public void mouseentered (mouseevent e) {} @override public void mouseexited (mouseevent e) {}}실행 효과 :
Java 알고리즘에 대한 자세한 내용은이 사이트에 관심이있는 독자들이 주제를 볼 수 있습니다. "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약"및 "Java Cache Operation Tips의 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.