Swing의 광산-스위핑 경험은 참조를위한 것입니다. 특정 내용은 다음과 같습니다
최근에 나는 스윙을 공부 한 후 작은 게임을했다 : minesweeping
1. 예비 디자인
2. 구현
실제로이 게임을 완료하는 핵심은 배열을 조작하는 데 있습니다. 아래 기본 코드는 Main.java입니다.
첫 번째 패키지; import java.awt.color; import java.awt.dimension; import java.awt.font; import java.awt.gridlayout; import java.awt.image; import java.awt.toolkit; import java.awt.datatatrans.clipboard; import java.awt.event. java.awt.event.actionlistener; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.io.bufferedReader; import java.io.bufferedWriter; import java.io.ioexception; import java.io.inputstreamreader; java.net.serversocket; import java.net.socket; import java.sql.drivermanager; import java.sql.sqlexception; import java.util.hashset; import java.util.set; import java.util.uuid; import javax.swing.swing.mageicon; javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jmenu; import javax.swing.jmenubar; import javax.swing.jmenuitem; import javax.swing.joptionpane; import javax.swing.timer; import; com.mysql.jdbc.statement; public class main jframe implements actionlistener, mouselistener { / *** yijian* / private static final long serialversionuid = 1l; // 초기 매개 변수 선언 jmenuitem jminew, jmisave, jmiopen, jmiexit, jmichuji, jmizhongji, jmigaoji, jmishowinfo, jmiziding; Toolkit Toolkit = Toolkit.getDefaultToolKit (); // 기본 툴킷을 가져옵니다. Clipboard Clipboard = Toolkit.getSystemClipboard (); // 시스템의 인스턴스를 보정 // 기본 플랫폼에서 제공하는 클립 보드 도구의 인터페이스로 가져옵니다. // 두 아이콘 IMIDEICON ICON = new ImageIcon ( "g : //eclipse-workspace//classtest_thundergame//mine.png"); ImageIcon icon1 = new ImageIcon ( "g : //eclipse-workspace//classtest_thundergame//flag.png"); Private STATIC INT NUM = 1; //이 NUM은 천둥 숫자입니다. // 개인 정적 최종 int Snum = 9를 변경하는 프로그램을 작성할 수 있습니다. //이 스노우는 지뢰의 타일 번호입니다. 개인 JBUTTON [] JB를 변경하는 프로그램을 작성할 수 있습니다. 개인 int [] []지도; 부울 [] [] 플래그; 부울 [] [] 플래그; int couttime; // 연결 객체 연결 CON을 선언합니다. // 드라이버 이름 문자열 드라이버 = "com.mysql.jdbc.driver"; // URL : 액세스 할 데이터베이스 이름을 가리 킵니다. String url = "jdbc : mysql : // localhost : 3306/testsql3"; // mysql 구성 사용자 문자열 user = "root"; // 비밀번호 문자열 비밀번호 = "Huang"; Public Main (int snum, int mines) {// 메인 인터페이스 생성자 settitle ( "mine-sweeping"); // 초기 썬더 수 = 광산; jmenubar greenbar = new Jmenubar (); // 메뉴 컨테이너 Greenbar.setopaque (true); Greenbar.Setbackground (새로운 색상 (250, 250, 250)); Greenbar.SetPreferRedSize (New Dimension (800, 28)); greenbar.setfont (new font (font.dialog_input, font.italic, 16)); // 메뉴 jmenu filemenu1 = new Jmenu ( "게임"); jmenu filemenu2 = new Jmenu ( "난이도"); jmenu filemenu3 = new Jmenu ( "도움말 :"); greenbar.add (filemenu1); greenbar.add (filemenu2); greenbar.add (jmishowinfo = filemenu3); filemenu1.setfont (new font (font.dialog_input, font.italic, 16)); filemenu2.setfont (new font (font.dialog_input, font.italic, 16)); filemenu3.setfont (new font (font.dialog_input, font.italic, 16)); // 메뉴 항목 fileMenu1.add (jminew = new Jmenuitem ( "New Game")); filemenu1.add (jmisave = new jmenuitem ( "Ranking Version")); filemenu1.add (jmiziding = new jmenuitem ( "Custom")); filemenu1.addseparator (); filemenu1.add (jmiexit = new jmenuitem ( "exit")); filemenu2.add (jmichuji = new jmenuitem ( "junior")); filemenu2.add (jmizhongji = new jmenuitem ( "중간")); filemenu2.add (jmigaoji = new jmenuitem ( "Advanced")); filemenu3.add (jmishowinfo = new jmenuitem ( "개발자 정보")); jminew.addactionListener (this); jmiexit.addactionListener (this); jmisave.addactionListener (this); jmisave.addactionListener (this); jmishowinfo.addactionListener (this); jmichuji.addactionListener (this); jmizhongji.addactionListener (this); jmigaoji.addactionListener (this); jmiziding.addactionListener (this); jmiziding.setfont (new font (font.dialog_input, font.italic, 16)); jmishowinfo.setfont (new font (font.dialog_input, font.italic, 16)); jminew.setfont (new font (font.dialog_input, font.italic, 16)); JMISAVE.SETFONT (New Font (font.dialog_input, font.italic, 16)); jmiexit.setfont (new font (font.dialog_input, font.italic, 16)); jmichuji.setfont (new font (font.dialog_input, font.italic, 16)); jmizhongji.setfont (new font (font.dialog_input, font.italic, 16)); jmizhongji.setfont (new font (font.dialog_input, font.italic, 16)); jmigaoji.setfont (new font (font.dialog_input, font.italic, 16)); setjmenubar (Greenbar); Image Icon = Toolkit.getDefaultToolKit (). getImage ( "g : //eclipse-workspace//classtest_thundergame//mine.png"); seticonimage (아이콘); setLayout (New GridLayout (Snum, Snum)); JB = New Jbutton [Snum] [Snum]; map = new int [snum] [snum]; // 버튼을 배열 플래그에 매핑합니다 = 새 부울 [map.length] [map [0] .length]; // 레코드 테이블 저장 플래그 = new boolean [map.Length] [map [0] .length]; // 레코드 int count = 0; // bleigh while (count <num) {int i = (int) (math.random () * map.length); // hang int j = (int) (math.random () * map [0] .length); // lie if (map [i] [j]! = ' *') {map [i] [j] = ' *'; 카운트 ++; }} for (int i = 0; i <snum; i ++) {for (int j = 0; j <snum; j ++) {jb [i] [j] = new Jbutton (); jb [i] [j] .setName (i + "_" + j); JB [i] [J] .setbackground (새로운 색상 (220, 220, 220)); jb [i] [j] .setfont (new font (font.dialog_input, font.italic, 10)); JB [i] [J] .addactionListener (this); jb [i] [J] .addmouselistener (this); // 마우스 리스너 추가 (jb [i] [j]); }} // 타이머 jlabel ststus = new jlabel (); jlabel times = new Jlabel (); jlabel miao = new Jlabel (); 추가 (ststus); 추가 (시간); times.settext ( "0"); miao.settext ( "초"); settimer (시간); couttime = 0; ststus.settext ( "시간 :"); greenbar.add (ststus); greenbar.add (times, right_alignment); greenbar.add (miao, right_alignment); times.setfont (new font (font.dialog_input, font.italic, 16)); ststus.setfont (new font (font.dialog_input, font.italic, 16)); miao.setfont (new font (font.dialog_input, font.italic, 16)); setsize (700, 700); setLocationRelativeto (null); setvisible (true); // setDefaultCloseOperation (jframe.exit_on_close); setDefaultCloseOperation (dispose_on_close); //이 줄을 추가} private void settimer (jlabel time) {// Time Listening Final jlabel vartime = time; 타이머 timeAction = new Timer (1000, new ActionListener () {public void actionPerformed (ActionEvent e) {couttime ++; vartime.settext ( ""+couttime);}}); TimeAction.Start (); } private void showTheClick (int x, int y) {// 이벤트 구현을 클릭하면 (map [x] [y] == '*') {jb [x] [y] .seticon (아이콘); showmines (); } else {int count1 = 0; for (int a = x -1; a <= x+1; a ++) {for (int b = y -1; b <= y+1; b ++) {if (! }} 플래그 [x] [y] = true; if (count1 == 0) {jb [x] [y] .setbackground (color.white); } else {jb [x] [y] .settext (count1 + ""); jb [x] [y] .setfont (new font (font.dialog_input, font.italic, 20)); jb [x] [y] .setbackground (color.white); } if (count1 == 0) {for (int i = x -1; i <= x+1; i ++) {for (int j = y -1; j <= y+1; j ++) {if (! (! (i <0 || j <0 || == false) {showTheClick (i, j); // loop traversal} else {// 반복적 인 액세스 방지}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {// 모든 thunders show // to auto-generated method stub for (int i = 0; i++) {// <<<<<<<<<<<<<<j. map.length; //}}} // 게임 종료 int b = joptionpane.showOptionDialog (null, "오, 그것은 폭발, 새 게임?", "확인란", joptionpane.yes_no_option, joptionpane.question_message, null, null, null); if (b == 1) {system.exit (0); } else {setVisible (false); New Main (Map.Length, Num); }} @override public void ActionPerformed (ActionEvent e) {// 이벤트 청취 처리 // todo 자동 생성 메소드 스터브 if (e.getSource () == jminew) {setVisible (false); New Main (Map.Length, Num); } else if (e.getSource () == jmisave) {showRange (); } else if (e.getSource () == jmiexit) {system.exit (0); } else if (e.getSource () == jmiziding) {new selfmines (); } else if (e.getSource () == jmichuji) {setVisible (false); 새로운 메인 (5,3); } else if (e.getSource () == jmishowinfo) {new myinfo (); } else if (e.getSource () == jmizhongji) {setVisible (false); 새로운 메인 (10,10); } else if (e.getSource () == jmigaoji) {setVisible (false); 새로운 메인 (20,60); } else {object obj = e.getSource (); int x, y; 문자열 [] strm = ((jbutton) obj) .getName (). split ( "_"); x = integer.parseint (strm [0]); y = integer.parseint (strm [1]); ShowtheClick (x, y); CheckSuccess (); // 게임이 끝났는지 확인}} private void showRange () {// New Shiyan13 순위 표시 (Map.Length); } private void checksuccess () {// 게임이 지나치게 여부를 결정하십시오. for (int i = 0; i <map.length; i ++) {for (int J = 0; }} if (count == num) {string uuid = uuid.randomuuid (). toString (). replaceall ( "-", ""); // 테이블은 uuid를 데이터베이스에 링크하고 시간 데이터를 저장하는 {class.forname (driver); con = (Connection) DriverManager.getConnection (URL, USER, PASSFARPT); 문자열 SQL; if (! con.isclosed ()) {// ta.settext ( ""); System.out.println ( "데이터베이스 연결"); // 객체 문을 작성하십시오 Statement 문 = (Statement) con.createstatement (); // if (map.length == 10) {// // SQL 문으로 실행됩니다. statement.executeupdate (SQL); con.close (); } else if (map.length == 5) {sql = "rang에 삽입 (userId, usertime) 값 (/" " + uuid +"/"," + couttime + ");"; statement.executeupdate (SQL); con.close (); } else if (map.length == 20) {sql = "toprange (userId, usertime) 값 (/" " + uuid +"/"," + couttime + ")에 삽입;"; statement.executeupdate (SQL); con.close (); } else {}} catch (classNotFoundException e) {// 데이터베이스 드라이버 클래스 예외 처리 System.out.println ( "error"); e.printstacktrace (); } catch (sqlexception e) {// system.out.println (e); System.err.println ( "데이터를 찾지 못함"); // int i = joptionpane.showconfirmdialog (null, "입력 한 SQL 문은 잘못되었습니다", // "찾을 수 없음", joptionpane.yes_no_option); } catch (예외 e) {e.printstacktrace (); } 마침내 {system.out.println ( "데이터베이스가 데이터를 성공적으로 가져옵니다!"); } int i = joptionpane.showoptionDialog (null, "테스트 전달을 축하합니다. 계속 되나요?", "확인란", joptionpane.yes_no_option, joptionpane.question_message, null, null, null); // ststus.settext ( "hello"+i); if (i == 1) {System.Exit (0); } else {setVisible (false); New Main (Map.Length, Num); }}} @override public void mouseclicked (mouseevent e) {// todo 자동 생성 메소드 Stub int c = e.getButton (); if (c == mouseevent.button3) {object obj1 = e.getSource (); int x, y; 문자열 [] strm = ((jbutton) obj1) .getName (). split ( "_"); x = integer.parseint (strm [0]); y = integer.parseint (strm [1]); if (flag [x] [y] == false && flags [x] [y] == false) {// 플래그 jb [x] [y] .seticon (icon1) 삽입; 플래그 [x] [y] = true; } else {jb [x] [y] .seticon (null); 플래그 [x] [y] = false; }}} @override public void mousepressed (mouseevent e) {// todo auto-autenterated method stub} @override public void mouseentered (mouseevent e) {// todo auto-kenerated method stub} @override public void mouseexited (mouseevent e) {// to auto-genderated methode3. 효과를 실현하십시오
4. 주요 기능 구현
(1) 기본 광산-스위핑 함수 (무작위 광산 연량, 깃발 삽입)
(2) 난이도를 선택할 수 있습니다 (3) 광산 수와 그리드 수를 사용자 정의 할 수 있습니다 (4) 시간 설정 시간 (5) 순위 기능 추가 (시간에 따라 데이터베이스에 저장)
(6) exe 파일로 포장하는 것은 (JRE와 함께) 여러 플랫폼에서 실행할 수 있습니다. (Exe4J를 사용하여 JAR 패키지를 포장하십시오)
소스 코드가 필요한 경우 이메일을 남길 수 있습니다! 이것은 소스 코드 : 광산-스위핑 게임입니다
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.