작년 에이 기술을 배웠고 아직 글을 쓰지 않았습니다. 이제 나는 테트리스 게임을 작성하는 데 시간이 걸렸습니다.
단순한 새 게임, 일시 정지, 계속, 포인트 기능 만. 그것은 단순히 고전적인 러시아 기능을 깨닫습니다.
더 이상 소개하지 않겠습니다. 관심이 있으시면 직접 실행하고 나중에 사진을 게시하십시오.
암호:
패키지 cn.hncu; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.keyadapter; import java.awt.event.keyevent; javax.swing.jmenu; import javax.swing.jmenubar; import javax.swing.jmenuitem; import javax.swing.joptionpane; import javax.swing.jpanel; import javax.swing.timer; public statris (public stent void main); te.set -Visible (true); // 초점을 포착하는 인터페이스에 편집 상자를 추가하면 다음 코드를 사용해야합니다. //te.requestfocus(true) ;//////// 키보드의 청취를 얻습니다} 개인 Tetrispanel TP; jmenuitem itempause; jmenuitem itemcontinue; public tetris () {this.setDefaultCloseOperation (exit_on_close); this.setLocation (700, 200); this.setsize (220, 275); this.setResizable (false); TP = 새로운 테트리스 패널 (); this.getContentPane (). add (tp); // 메뉴 추가 jmenubar menubar = new jmenubar (); this.setjmenubar (menubar); jmenu menugame = New Jmenu ( "게임"); menubar.add (menugame); jmenuitem itemnew = new Jmenuitem ( "New Game"); ItemNew.SetActionCommand ( "New"); itempause = new Jmenuitem ( "일시 정지"); ItemPause.SetActionCommand ( "pause"); itemcontinue = new Jmenuitem ( "계속"); ItemContInue.SetActionCommand ( "계속"); ItemContInue.setEnabled (false); menugame.add (ItemNew); menugame.add (itempause); menugame.add (ItemContinue); menulistener menulistener = 새로운 menulistener (); ItemNew.addactionListener (Menulistener); itempause.addactionListener (Menulistener); ItemContInue.AdDactionListener (Menulistener); // jframe 전체가 키보드를 추가하도록하십시오. } Class Menulistener는 ActionListener를 구현합니다 {@override public void ActionPerformed (ActionEvent e) {// 새 게임을 재생합니다. } if (e.getActionCommand (). Equals ( "pause")) {timer.stop (); ItemContInue.SetEnabled (true); itempause.setenabled (false); } if (e.getActionCommand (). Equals ( "계속")) {timer.restart (); ItemContInue.setEnabled (false); itempause.setenabled (true); }}} 개인 타이머 타이머; 클래스 테트리 스파넬은 jpanel을 확장합니다 {// 제곱의 모양 : // 첫 번째 차원은 블록 유형을 나타냅니다 (7 가지 유형 포함 : s, z, l, j, i, i, o, t) // 두 번째 차원은 회전 수를 나타냅니다. // 세 번째 및 네 번째 차원은 블록 행렬 // 형태를 나타냅니다. [turnstate] [i] [i/4] [i/4] 모양 [] [] [] = new int [] [] [] { / * * 템플릿 { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, {0,0,0,0,0,0,0,0,0, * 0,0,0,0,0,0,0,0,0,0}} *//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,,,,, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,,,,, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0}}, // s {{0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}}, // z {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 0, 0, 0, 0, 0, 0, 0}}, // o {{{1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0, 0, 1, 1, 0,, 0,, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 0,, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0} 0, 0, 0, 0}, {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0,, 0,, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0}, {0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 개인 int blocktype; // 블록 유형 개인 int 턴 스테이트; // 회전 상태 개인 int X; // 블록 위치 x- 컬럼 위치 컬럼 번호 비공개 y; // 블록 위치 y- 로우 번호 위치-로우 번호 개인 int 맵 [] = new int [13] [23]; // 맵 : 12 열 및 22 줄. 국경을 방지하기 위해 배열은 다음과 같이 열립니다. 13 열 및 23 개의 행 프라이빗 int 지연 = 1000; Public Timerkeylister 리스너 = New Timerkeylister (); 개인 int score = 0; // 점수 public tetrispanel () {newGame (); 다음 번 (); // 타이머 = 새 타이머 (지연, 리스너); //timer.start (); } public void newGame () {blockType = (int) (math.random ()*1000)%7; Turnstate = (int) (Math.random ()*1000)%4; x = 4; y = 0; (int i = 0; i <12; i ++) {// (int j = 0; }} map [i] [21] = 3; // 3은 인터페이스 경계의 그리드입니다} if (timer! = null) {timer.stop (); } 지연 = 1000; 타이머 = 새 타이머 (지연, 리스너); timer.start (); } private void nexblock () {blocktype = (int) (math.random ()*1000)%7; Turnstate = (int) (Math.random ()*1000)%4; x = 4; y = 0; // if (crash (x, y, blocktype, turnstate) == 0) {timer.stop (); int 옵션 = joptionpane.showconfirmdialog (이것은 "게임 오버! if (옵션 == joptionpane.ok_option) {newGame (); } else if (옵션 == joptionpane.no_option) {system.exit (0); }}} private void down () {if (crash (x, y+1, blocktype, turnstate) == 0) {// y+1은 맵의 해당 위치가 한 정사각형에 의해 스택 된 블록인지 프레임인지를 결정하는 데 사용됩니다. } else {y ++; } Repaint (); } private void left () {if (x> = 0) {x -= 충돌 (x -1, y, blocktype, turnstate); } Repaint (); } private void right () {if (x <8) {x += 충돌 (x +1, y, blocktype, turnstate); } Repaint (); } private void turn () {if (crash (x, y, blocktype, (Turnstate+1)%4) == 1) {Turnstate = (Turnstate+1)%4; } Repaint (); } private void add (int x, int y, int blocktype, int turnstate) {for (int a = 0; a <4; a ++) {for (int b = 0; b <4; b ++) {if (shapes [shapes [a*4+b] == 1) {map [x+b+1] [y+a] = 1; }}} trydelline (); } // 개인 void 제거 trydelline () {for (int b = 0; b <21; b ++) {int c = 1; 의 경우 (int a = 0; a <12; a ++) {c & = map [a] [b]; // 모두는 1입니다. c의 결과는 1} if (c == 1) {// (c == 1) {// (int d = b; d> 0; d-) {e ++) {e+) {e+) {e+) {e+) {e+) {e ++) {e+) [e ++) {e ++) {e+) [e ++) [e ++) [e ++) {e+) [e ++) [e ++) [e ++) [e++) [e ++) [e ++) [e = 0; 지도 [E] [D-1]; }} // 점수 += 100; 지연 /=1.05; TIMER.SETDELAY (지연); }}}} // 매개 변수 예 : 4,3,2,3 // 충돌 개인 int 충돌 (int x, int y, int blocktype, int turnstate) {for (int a = 0; a <4; a ++) {(int b = 0; b <4; b ++) {// if (shaptes] [a*4+b]. 맵 [x+b+1] [y+a] == 1) || // (Shapes [blocktype] [turnstate] [a*4+b] == 1 && 맵 [x+b+1] [y+a] == 3) {//} if ((shapes [turnstate] [a*4+b] & map [x+b+1] =). 0; // collision}}} return 1; // collision} @override public void paint (그래픽 g) {// blocktype = 6; // turnstate = 3; // x = 4; // y = 6; super.paint (g); // afterimage g.setcolor를 제거합니다 (새로운 색 (153,51,205)); // (int J = 0; g.setcolor (color.cyan); G.DrawRect ((J%4+X+1)*10, (J/4+Y)*10, 10, 10); G. 세트 컬러 (새로운 색상 (153,51,205)); }} // 인터페이스 프레임과 스택 블록을 그립니다 --- 전체 맵 g.setcolor (color.red); for (int i = 0; i <12; i ++) {// (int j = 0; } else if (map [i] [j] == 1) {g.fillRect (i*10, j*10, 10, 10); g.setcolor (color.green); G.DrawRect (i*10, J*10, 10, 10); g.setcolor (color.red); }}} // 점수를 표시하고 레이아웃이 아름답고 인터페이스에 무언가를 추가하십시오. // 정사각형 영역의 오른쪽 부분 G.SetColor (color.red); g.setfont (new font ( "aa", font.bold, 11)); G.DrawString ( "score =" + score, 130, 20); g.setfont (new font ( "aa", font.plain, 13)); g.setcolor (color.blue); G.DrawString ( "해적 게임 거부", 125, 70); G.DrawString ( "자기 보호에주의하십시오.", 125, 90); G.DrawString ( "속임수를 조심하십시오.", 125, 110); G.DrawString ( "보통 게임은 뇌에 좋습니다", 125, 130); G.DrawString ( "추가는 신체에 유해하다.", 125, 150); G.DrawString ( "합리적으로 일정 시간", 125, 170); G.DrawString ( "건강한 삶을 즐기십시오.", 125, 190); } 클래스 TimerKeylister 확장 KeyAdapter 구현 ActionListener {@override public void ActionPerformed (ActionEvent e) {down (); } @override public void keypressed (keyEvent e) {switch (e.getKeyCode ()) {case keyEvent.vk_down : down (); 부서지다; case keyevent.vk_left : left (); break; case keyevent.vk_right : right (); break; case keyEvent.vk_up : turn (); break; case keyEvent.vk_f1 : plug (); case keyEvent.vk_f2 : time (); }} public void plug () {score+= 100; } public void time () {delay = 1000; TIMER.SETDELAY (지연); }}}인터페이스 실행 :
더 흥미로운 게임은 특별한 주제 "Java Classic Games"를 참조하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.