그래픽 인터페이스를 통해 매우 진지하게 쓴 Java 버전의 뱀 게임, 메뉴 작동, 키보드 모니터링, 가속, 감속, 카운트 스코어, 이동 속도 설정, 게임 배경 색상 설정 등을 가속화 할 수 있습니다! 완전히 수정했기 때문에 버그가 없어야합니다.
다음은 프로젝트의 다양한 패키지와 클래스 간의 계층 적 관계입니다.
게임의 기본 실행 인터페이스는 다음과 같습니다.
다음은 몇 가지 코드입니다. 자세한 소스 코드는이 링크를 참조하십시오 : Greedy Snake의 소스 코드 다운로드
뱀 수업 :
패키지 com.huowolf.entities; import java.awt.color; java.awt.graphics 가져 오기; Java.awt.Point 가져 오기; java.util.hashset 가져 오기; java.util.linkedList 가져 오기; java.util.set import; com.huowolf.listener.snakelistener import; import com.huowolf.util.global; 공개 클래스 뱀 {// 방향을 나타내는 상수 공개 정적 최종 int = 1; 공개 정적 최종 int down = -1; 공개 정적 최종 int 왼쪽 = 2; 공개 정적 최종 int 권리 = -2; // Liser Group Private Set <SnakElistener> 리스너 = New Hashset <snakelistener> (); // 스토리지 목록 구조 개인 링크드리스트 <point> body = new LinkedList <point> (); 사적인 부울 생활; // 개인 부울 일시 중지입니다. // 게임이 개인 int OldDirection, NewDirection; // 새롭고 오래된 방향 소개 (이동 시간 내에 유효하지 않은 방향을 피) 개인 포인트 Oldtail; // Old Tail (음식을 먹을 때 사용) Private int FoodCount = 0; // 음식의 양을 먹은 개인 색상 헤드 콜러; 개인 컬러 바디 컬러; 개인 int 수면 시간; 공개 부울 islife () {return life; } public int getseptime () {return sleeptime; } public void setsleeptime (int sleeptime) {this.sleeptime = sleeptime; } public void setheadcolor (Color HeadColor) {this.headcolor = headcolor; } public void setbodyColor (Color BodyColor) {this.bodyColor = BodyColor; } public void init () {int x = global.width/2; int y = global.height/2; for (int i = 0; i <3; i ++) {body.addlast (new Point (x-, y)); } 구정 = newDirection = 오른쪽; FoodCount = 0; 삶 = 참; 일시 정지 = 거짓; if (sleeptime == 0) {sleeptime = 300; }} // 뱀의 노드를 지우는 메소드 (새 게임을 시작하는 데 사용) public void clear () {body.clear (); } public void setLife (부울 생활) {this.life = life; } public boolean getPause () {return pause; } public void setPause (부울 일시 정지) {this.pause = pause; } // 일시 정지 상태를 변경하는 메소드 공개 void changePause () {pause =! pause; } // 뱀을 위해 죽는 방법 public void die () {life = false; } // public void move () {if (! (OldDirection + newDirection == 0)) {OldDirection = newDirection; } // 세부 사항 oldtail = body.removelast (); int x = body.getfirst (). x; int y = body.getfirst (). y; 스위치 (구 정리) {case up : y-; if (y <0) {y = global.height -1; } 부서지다; 케이스 다운 : y ++; if (y> = global.height) {y = 0; } 부서지다; 왼쪽 사례 : x-; if (x <0) {x = global.width-1; } 부서지다; 사례 오른쪽 : x ++; if (x> = global.width) {x = 0; } 부서지다; } point newhead = new Point (x, y); // 헤드 바디를 추가합니다 .addfirst (Newhead); } // 방향 변경 public void Changeirection (int direction) {newDirection = Direction; } // 음식을 먹는 음식 공개 void eatfood () {body.addlast (Oldtail); FoodCount ++; } // 공개 int getFoodCount () {Return FoodCount; } // 뱀은 자신의 몸을 먹는다. 공개 부울 iseatbody () {for (int i = 1; i <body.size (); i ++) {if (body.get (i) .equals (this.gethead ())) true; } false를 반환합니다. } // 뱀의 머리 공개 포인트를 나타내는 노드를 가져옵니다 gethead () {return body.getfirst (); } // 자체 표시 공개 void drawme (그래픽 g) {if (bodycolor == null) {g.setColor (새 색상 (0x3333ff)); } else {g.setColor (BodyColor); } for (point p : body) {G.FillRoundRect (px*global.cell_size, py*global.cell_size, global.cell_size, global.cell_size, global.cell_size, 15,12); } drawhead (g); } // Snakehead Draw Public void Drawhead (그래픽 g) {if (headcolor == null) g.setcolor (color.yellow); else {g.setColor (HeadColor); } g.fillRoundRect (gethead (). x * global.cell_size, gethead (). } // 내부 클래스 개인 클래스 SnakedRiver는 runnable {public void run () {while (life) {if (pause == false) {move (); for (snakelistener l : 청취자) l.snakemoved (뱀. this); } try {thread.sleep (sleeptime); } catch (InterruptedException e) {e.printstacktrace (); }}}}}} // 스레드를 시작하는 메소드 공개 void begin () {new 스레드 (new snakedriver ()). start (); } // 청취자 추가 공개 void addsnakelistener (snakelistener l) {if (l! = null) {haresers.add (l); }} // 속도를 높이고 public void speedup () {if (sleeptime> 50) {sleeptime- = 20; }} // public void speeddown () {if (sleeptime <700) {sleeptime+= 20; }}}음식 수업 :
패키지 com.huowolf.entities; import java.awt.color; java.awt.graphics 가져 오기; Java.awt.Point 가져 오기; import com.huowolf.util.global; 공공 수업 음식 확장 지점 {개인 정적 최종 최종 긴 SerialversionUid = 1L; 개인 컬러 푸드 컬러; 공개 void setfoodColor (Color FoodColor) {this.FoodColor = FoodColor; } public color getFoodColor () {Return FoodColor; } public void newfood (point p) {setLocation (p); } public boolean isfoodeated (뱀 뱀) {return this.equals (snake.gethead ()); } public void drawme (그래픽 g) {if (foodColor == null) {G.SetColor (color.red); } else {g.setColor (FoodColor); } g.fill3drect (x*global.cell_size, y*global.cell_size, global.cell_size, global.cell_size, true); }}지상 클래스
패키지 com.huowolf.entities; import java.awt.color; java.awt.graphics 가져 오기; Java.awt.Point 가져 오기; java.util.random import; import com.huowolf.util.global; 공공 계급 지상 {private boolean [] [] rocks = new boolean [global.width] [Global.height]; 개인 int mapType = 1; public int getmaptype () {return maptype; } public void setMapType (int mapType) {this.maptype = mapType; } //지면 초기화 (돌을 맑게) 공개 void clear () {for (int x = 0; x <global.width; x ++) for (int y = 0; y <global.height; y ++) 암석 [x] [y] = false; } / *** 스톤 생성* / public void generateRocks1 () {for (int x = 0; x <global.width; x ++) 암석 [x] [0] = Rocks [x] [global.height -1] = true; for (int y = 0; y <global.height; y ++) 암석 [0] [y] = 암석 [global.width -1] [y] = true; } public void generaterocks2 () {for (int y = 0; y <6; y ++) {rocks [0] [y] = true; 암석 [Global.width -1] [y] = true; 암석 [0] [Global.height -1 -y] = true; 암석 [Global.width -1] [Global.height -1 -y] = true; } for (int y = 6; y <global.height -6; y ++) {rocks [6] [y] = true; 암석 [Global.width -7] [y] = true; }} public void generaterocks3 () {for (int x = 4; x <14; x ++) 암석 [x] [5] = true; (int j = 5; j <15; j ++) 암석 [21] [j] = true; (int y = 13; y <20; y ++) 암석 [14] [y] = true; for (int x = 2; x <10; x ++) 암석 [x] [17] = true; for (int i = 10; i <global.width-3; i ++) 암석 [i] [global.height-3] = true; } // 뱀이 석재 공개 부울을 먹는다 (뱀 뱀) {for (int x = 0; x <global.width; x ++) {for (int y = 0; y <global.height; y ++) {if [x] [y] [y] [y] [y] [y] [y] [x == snake.gethead (x == snake.gethead (x & y =)). 진실; }} 거짓을 반환합니다. } public point getpoint () {random random = new random (); int x = 0, y = 0; do {x = random.nextInt (global.width); y = random.nextInt (Global.height); } while (rocks [x] [y] == true); 새로운 포인트 (x, y)를 반환합니다. } // 디스플레이 메소드 public void drawme (그래픽 g) {g.setcolor (color.dark_gray); for (int x = 0; x <global.width; x ++) {for (int y = 0; y <global.height; y ++) {if (rocks [x] [y] == true) {g.fill3drect (x*global.cell_size, y*global.cell_size, global.cell_size, global.cell_size, true); }}}}}}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.