이 기사는 Java : Snake가 구현 한 고전적인 미니 게임을 권장합니다.
생식 이미지 :
더 이상 고민하지 않고 코드를 제시하십시오.
1.
공개 클래스 greedsnake {public static void main (String [] args) {snakemodel model = new snakemodel (20,30); snakecontrol control = 새로운 snakecontrol (모델); SnakeView View = New SnakeView (모델, 제어); // 관찰자를 추가하고보기가 모델 모델의 관찰자가되도록하십시오. (새 스레드 (model)). start (); }}2.
패키지 mvctest; // snakecontrol.javaimport java.awt.event.keyevent; import java.awt.event.keylistener; public class snakecontrol chiylistener {snakemodel model; public snakecontrol (snakemodel model) {this.model = model; } public void keypressed (keyEvent e) {int keycode = e.getKeyCode (); if (model.running) {// 처리 된 키 스위치 (키 코드) {case keyevent.vk_up : model.changedirection (snakemodel.up); 부서지다; case keyEvent.vk_down : model.changedirection (snakemodel.down); 부서지다; case keyEvent.vk_left : model.Changedirection (snakemodel.left); 부서지다; case keyEvent.vk_right : model.Changedirection (snakemodel.right); 부서지다; case keyEvent.vk_add : case keyEvent.vk_page_up : model.speedup (); 부서지다; CASE keyEvent.vk_subtract : case keyEvent.vk_page_down : model.speeddown (); 부서지다; case keyEvent.vk_space : case keyEvent.vk_p : model.changepausestate (); 부서지다; 기본값 :}} // 어떤 경우에도 키가 처리되며 키는 게임이 다시 시작됩니다. }} public void keyreleased (keyevent e) {} public void keytyped (keyevent e) {}}3.
패키지 mvctest; // snakemodel.javaimport javax.swing.*; import java.util.arrays; import java.util.linkedlist; import java.util.observable import java.util.observable; import java.util.random; class snakemel extends in empless in empless {] 행렬; // 위치에 뱀 몸체 또는 음식이 있는지 링크드 목록 NoDearray = new LinkedList (); // 뱀 신체 노드 음식; int maxx; int maxy; int Direction = 2; // 뱀의 달리기 방향은 부울 런닝 = false; // state int int timeinterval = 200; // 시간 간격, 밀리 초 더블 스피드 랜치 = 0.75; // 속도 변화 속도가 멈출 때마다 부울 = 거짓; // 1 균형 플래그 int 스코어 = 0; // int countmove = 0; // 음식을 먹기 전에 움직이는 횟수 // 위아래는 짝수 여야합니다. // 오른쪽과 왼쪽은 홀수 정적 최종 int up = 2; 공개 정적 최종 int down = 4; 공개 정적 최종 int 왼쪽 = 1; 공개 정적 최종 int right = 3; public snakemodel (int maxx, int maxy) {this.maxx = maxx; this.maxy = maxy; 다시 놓기(); } public void reset () {direction = snakemodel.up; // 뱀의 방향 러닝 타임 interval = 200; // 시간 간격, 밀리 초 폴링 = 거짓; // 깃발 점수 = 0; // 점수 countmove = 0; // 음식을 먹기 전의 횟수 // 초기 MATIRX, 모든 명확한 0 매트릭스 = 새로운 부울 [maxx] []; for (int i = 0; i <maxx; ++ i) {matrix [i] = 새로운 부울 [maxy]; arrays.fill (matrix [i], false); } // 뱀 초기 // 뱀 몸 초기, 20 개가 넘는 수평 위치가 있으면 길이는 10이면, 그렇지 않으면 수평 위치의 절반은 initarraylength = maxx> 20입니까? 10 : maxx / 2; nodearray.clear (); for (int i = 0; i <initarraylength; ++ i) {int x = maxx / 2 +i; // maxx는 20 int y = maxy / 2로 초기화됩니다. // Maxy는 30으로 초기화됩니다. // Nodearray [X, Y] : [10,15]-[11,15]-[12,15] ~~ [20,15] // 기본 실행 방향이 상승하므로 게임의 시작 부분에서 : // [10,15]-[11,15]-[12,15] ~ 0]. Nodearray.addlast (새 노드 (x, y)); 매트릭스 [x] [y] = true; } // 음식 생성 음식 = CreateFood (); 매트릭스 [food.x] [food.y] = true; } public void changeirection (int newDirection) {// 변경된 방향은 동일한 방향에 있거나 원래 방향으로 되돌릴 수 없습니다 (Direction % 2! = newdirection % 2) {Direction = newdirection; }} public boolean moveon () {노드 n = (노드) nodearray.getfirst (); int x = nx; int y = ny; // 방향 스위치 (방향)에 따라 좌표 값을 증가시키고 감소시킵니다. {CASE UP : y-; 부서지다; 케이스 다운 : y ++; 부서지다; 왼쪽 사례 : x-; 부서지다; 사례 오른쪽 : x ++; 부서지다; } // 새로운 좌표가 유효한 범위에 속하는 경우 ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {if (matrix [x] [y]) {// 새로운 좌표 (Snake Body 또는 Food)에 무언가가있는 경우 (x == food.x && y == whife.y) {// eat food.y). nodearray.addfirst (음식); // 스네이크 헤드에서 길이를 제공 // 점수 규칙은 움직임의 숫자 및 속도와 관련이 있습니다. 방향 int scoreget = (10000-200 * Countmove)/ TimeInterval; score += scoreget> 0? 스코어 게이트 : 10; 카운트 모브 = 0; food = createfood (); // 새 식품 매트릭스 만들기 [food.x] [food.y] = true; // 음식 위치를 설정하십시오. } else // 뱀의 몸 자체를 먹고 실패한 거짓; } else {// 새 좌표 (뱀 바디)의 지점에 아무것도 없다면 뱀의 몸을 nodearray.addfirst (새 노드 (x, y)); 매트릭스 [x] [y] = true; n = (노드) nodearray.removelast (); 매트릭스 [nx] [ny] = false; 카운트 모브 ++; 진실을 반환하십시오. }} 거짓을 반환합니다. // Edge를 터치하고 실패합니다} public void run () {running = true; while (running) {try {thread.sleep (timeinterval); } catch (예외 e) {break; } if (! paused) {if (moveon ()) {setchanged (); // Model은 업데이트 된 뷰 데이터를 알려줍니다. } else {joptionpane.showmessagedialog (null, "당신은 실패했다", "게임 오버", joptionpane.information_message); 부서지다; }}} running = false; } private node createFood () {int x = 0; int y = 0; // 임의의 뱀 몸과 음식과 겹치지 않는 유효한 영역에서 {random r = new random (); x = R.NextInt (maxx); y = r.nextint (maxy); } while (matrix [x] [y]); 새 노드 (x, y)를 반환합니다. } public void speedup () {TimeInterval *= speedchangerate; } public void speeddown () {TimeInterval /= speedchangerate; } public void changepausestate () {paused =! paused; } public String toString () {문자열 result = ""; for (int i = 0; i <nodearray.size (); ++ i) {노드 n = (노드) nodearray.get (i); 결과 + = "[" + nx + "," + ny + "]"; } 반환 결과; }} 클래스 노드 {int x; in y; 노드 (int x, int y) {this.x = x; this.y = y; }}4.
패키지 mvctest; // snakeview.javaimport javax.swing.*; import java.awt.*; import java.util.iterator; import java.util.linkedlist; import java.util.observable; import java.util.observable; import java.util.observable; java.util.observer; public class snakeview는 관찰자 {snakecontrol control = null; snakemodel model = null; JFrame 메인 프레임; 캔버스 페인트 칸바; Jlabel Labelscore; 공개 정적 최종 int canvaswidth = 200; 공개 정적 최종 int canvasheight = 300; 공개 정적 최종 int nodewidth = 10; 공개 정적 최종 int nodeHeight = 10; public snakeview (snakemodel 모델, snakecontrol control) {this.model = model; this.control = 컨트롤; 메인 프레임 = 새 JFrame ( "GreedSnake"); 컨테이너 cp = mainframe.getContentPane (); // 상단 점수 디스플레이 작성 labelscore = new Jlabel ( "score :"); cp.add (Labelscore, BorderLayout.north); // 중간 게임 디스플레이 영역 생성 PaintCanvas = new Canvas (); paintcanvas.setsize (canvaswidth + 1, canvasheight + 1); PaintCanvas.addkeylistener (대조군); cp.add (PaintCanvas, BorderLayout.Center); // 아래의 도움말 막대를 만듭니다. PALENBUTTOM.SETLAYOUT (New BorderLayout ()); Jlabel LabelHelp; labelHelp = New Jlabel ( "PageUp, Pagedown for Speed;", jlabel.center); PALENBUTTOM.ADD (LABELHELP, BORTHLAYOUT.NORTH); labelHelp = new Jlabel ( "시작을위한 Enter 또는 R 또는 S;", jlabel.center); PALENBUTTOM.ADD (LABELHELP, BORTHLAYOUT.CENTER); labelHelp = new Jlabel ( "일시 정지의 공간 또는 p", jlabel.center); PALENBUTTOM.ADD (LabelHelp, BorderLayout.South); cp.add (PanelButtom, BorderLayout.South); mainframe.addkeylistener (Control); mainframe.pack (); mainframe.setResizable (false); mainframe.setDefaultCloseOperation (jframe.exit_on_close); mainframe.setvisible (true); } void repaint () {그래픽 g = paintcanvas.getGraphics (); // 배경 G.SetColor (color.white)를 그리십시오. G.FillRect (0, 0, CanvasWidth, Canvasheight); // 뱀 G.SetColor (color.black)를 그립니다. Linkedlist Na = Model.NodearRay; 반복자 it = na.iterator (); while (it.hasnext ()) {node n = (node) it.next (); 추첨 (g, n); } // 음식 G.SetColor (color.red)를 그립니다. 노드 n = model.food; 추첨 (g, n); 업데이트 코어 (); } private void drawnode (그래픽 g, 노드 n) {g.fillRect (nx * nodewidth, ny * nodeHeight, nodewidth -1, nodeHeight -1); } public void updateCore () {String s = "score :" + model.score; labelscore.settext; } public void uddate (Observable O, Object Arg) {Repaint (); }}이 기사의 목적은 고전에 대해 회상하는 것이지만, 더 중요한 목적은 Java 프로그래밍을 잘 배우는 데 도움이되는 것입니다.