자바 뱀 탐식 게임 실현

8021 단어 자바탐식 사
최근 JAVA 와 JSwing 이 탐식 뱀 연습 을 시작 하 였 습 니 다.참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.

새로운 콘 텐 츠 교류 와 가입 을 환영 합 니 다.
JSwing 을 사 용 했 습 니 다.다음은 구체 적 인 사고 입 니 다.
이루어지다
 * 뱀:
싱글 체인 시트 로 머리 와 꼬리 를 기록 하고 뱀 전 체 는 lattice 격자 로 나 뉘 어 map 에 넣 습 니 다.
 * 이동:
나 는 실현 하 는 과정 에서 가장 얻 기 어 려 운 것 이 오히려 뱀의 정의 와 실현 이라는 것 을 발견 했다.뱀 을 어떻게 단독 적 으로 표현 할 것 인 가 를 계속 생각 했 지만 뱀 을 단독으로 실현 하면 세부 적 인 부분 이 실현 되 기 가 매우 번 거 로 웠 다.
사실 뱀 이 움 직 이 는 것 은 한 발 을 끌 고 온몸 을 움 직 이 는 것 이 아니 라 몸 에 변화 가 없 는 것 이다.관건 은 두 가지 이다.
머리 이동
b.꼬리 의 움직임
실현:
뱀 을 지도의 작은 칸 에 직접 구현 하고 하위 클래스 나 Array List 등 을 따로 설정 하지 않 으 며 맵 에 뱀 머리의 좌 표를 추가 하여 맵 이 뱀 머리 에 따라 뱀의 좌 표를 바 꿀 수 있 도록 한다(변수 교환 과 유사).머리 에 x,y 를 따로 설정 하고 이동 하 는 방향(정적 변수 x 와 y 로 도 사용 할 수 있 지만 차이 가 없습니다)으로 몸 에 next 지침 을 설정 합 니 다.next.next 가 꼬리 가 아니라면 변 하지 않 습 니 다.next 가 꼬리 라면 자신의 꼬리 를 꼬리 로 설정 하고 next 를 바 꾸 어 일반 지도 블록 으로 만 듭 니 다.(리 프 레 시 방법)
 * 제어 방향:
키보드 이벤트 사용,현재 wasd 4 개 만 설정
 * 창 디자인:
view extends JPanel,디 스 플레이 제어,Lattice 에서 Graphics.draw(...)를 호출 하여 각 칸 에 표시 합 니 다.
다음은 핵심 맵 부분 코드(자동 이동,음식 검사,길이 증가 등 포함)입 니 다.

import codes.myGame.snake.cell.Lattice;
 
import java.util.Random;
 
public class Smap {
 private boolean getFood = false;//      ,     true,      autoChange       
 private boolean gameOver = false;
 private boolean directionChange = false;//                         ,      
 private int MAP_SIZE;
 private Lattice[][] map;
 private int directionX = 0;//               
 private int directionY = 1;//               
 private int[] head = new int[2];//        
 private int[] food = new int[2];//         
 
 public Smap(int size) {
 MAP_SIZE = size;
 map = new Lattice[MAP_SIZE][MAP_SIZE];
 for(int i=0;i<size;i++){
 for (int j = 0 ;j<size;j++){
 map[i][j] = new Lattice();
 }
 }
 map[MAP_SIZE/2][MAP_SIZE/2].setHead(true,map[MAP_SIZE/2][MAP_SIZE/2-1]);//          ,       
 head[0] = MAP_SIZE/2;
 head[1] = MAP_SIZE/2;
 map[MAP_SIZE/2][MAP_SIZE/2-1].setRear(true,null);
 this.randFood();
 }
 
 //        
 public void autoChange(){
 this.setHead();
 if(food[0]==head[0] && food[1]==head[1]){//            ,      
 getFood = true;
 }
 if(!gameOver)this.setRear();
 if(getFood)this.randFood();
 directionChange = false;
 }
 
 //      ,           ,               
 //setDirection setHead          ,     , synchronized  
 //(  ,           ,           setHead     )
 public synchronized void setDirection(int x,int y){
 if(directionY!=y && directionX!=x &&!directionChange){
 directionX = x;
 directionY = y;
 directionChange = true;
 }
 }
 
 public boolean gameOver(){
 return gameOver;//     ,  gameOver
 }
 private synchronized void setHead(){
 int i = head[0];
 int j = head[1];
 head[0] = ( head[0] + directionX + MAP_SIZE)%MAP_SIZE;
 head[1] = ( head[1] + directionY + MAP_SIZE )%MAP_SIZE;
 if(map[head[0]][head[1]].isBody())gameOver = true;
 map[head[0]][head[1]].setHead(true,map[i][j]);
 map[i][j].setBody(true,null);
 map[i][j].setHead(false,null); //  null         
 }
 
 //                 ,                 
 private void setRear(){
 if(!getFood){
 Lattice temp = map[head[0]][head[1]];
 while (!temp.next.isRear())temp = temp.next;
 temp.next().setRear(false,null);
 temp.setRear(true,null);
 temp.setBody(false,null);
 }
 }
 
 private void randFood(){
 getFood = false;
 map[food[0]][food[1]].setFood(false);//          
 boolean flag = false;//       
 Random random = new Random();
 int x = random.nextInt(MAP_SIZE);
 int y = random.nextInt(MAP_SIZE);
 while (!flag){
 x = random.nextInt(MAP_SIZE);
 y = random.nextInt(MAP_SIZE);
 if(!map[x][y].isHead() && !map[x][y].isRear() &&!map[x][y].isBody())flag = true;
 }
 map[x][y].setFood(true);
 food[0] = x;
 food[1] = y;
 }
 
 public Lattice get(int row, int col){
 return map[row][col];
 }
 
 public int getMAP_SIZE() {
 return MAP_SIZE;
 }
}
다음은 디 스 플레이 부분의 코드 입 니 다.
디 스 플레이 는 두 부분 으로 나 뉘 는데 하 나 는 Graphics.draw()방법 으로 하나의 셀 을 그립 니 다.다른 하 나 는 view 류 를 JPanel 에서 계승 합 니 다.그림 그리 기 담당

public class Lattice {
 private boolean isBody = false;
 private boolean isHead = false;
 private boolean isFood = false;
 private boolean isRear = false;
 public Lattice next = null;
 
 
 public void setHead(boolean bool,Lattice next){
 isHead = bool;
 if(next!=null)this.next = next;
 }
 public void setBody(boolean bool,Lattice next){
 isBody = bool;
 if(next!=null)this.next = next; //     null ,      next
 }
 public void setRear(boolean bool,Lattice next){
 isRear = bool;
 this.next = next;
 }
 public void setFood(boolean bool){
 isFood = bool;
 }
 
 public Lattice next(){
 return next;
 }
 
 public boolean isHead(){
 return isHead;
 }
 public boolean isFood(){
 return isFood;
 }
 public boolean isRear(){
 return isRear;
 }
 public boolean isBody(){
 return isBody;
 }
 
 
 
 public void refresh(){
 if(isHead){
 isBody = true;
 isHead = false;
//          ?(   DirectionX,Y  Smap ,     )
 }else if(isBody){
 if(next.isRear){
 next.isRear = false;
 isRear = true;
 isBody = false;
 }
 }
 }
//          
 public void draw(Graphics g, int x, int y, int size) {
 g.setColor(black);
 g.drawRect(x, y, size, size);
 if ( isHead ) {
 g.setColor( red);
 g.fillRect(x, y, size, size);
 }else if ( isBody || isRear) {
 g.setColor(black);
 g.fillRect(x, y, size, size);
 }else if(isFood){
 g.setColor( blue);
 g.fillRect(x, y, size, size);
 }
 }
}
view 부분:

import codes.myGame.snake.cell.Lattice;
import javax.swing.*;
import java.awt.*;
 
 
public class View extends JPanel {
 private static final long serialVersionUID = -5258995676212660595L;
 private static final int GRID_SIZE = 32; //       
 private Smap thisMap;
 
 public View(Smap map) {
 thisMap = map;
 }
 
 @Override
 public void paint(Graphics g) {
 super.paint(g);
 int size = thisMap.getMAP_SIZE();
 for (int row = 0; row< size; row++ ) {
 for (int col = 0; col< size; col++ ) {
 Lattice lattice = thisMap.get(row, col);
 if ( lattice != null ) {
 lattice.draw(g, col*GRID_SIZE, row*GRID_SIZE, GRID_SIZE);//        
 }
 }
 }
 }
 @Override
 public Dimension getPreferredSize() {//   div  
 return new Dimension(thisMap.getMAP_SIZE()*GRID_SIZE+1, thisMap.getMAP_SIZE()*GRID_SIZE+1);
 }
}
더 많은 재 미 있 는 클래식 게임 을 통 해 주 제 를 실현 하고 여러분 에 게 공유 합 니 다.
C++클래식 게임 모음
python 클래식 게임 모음
python 러시아 블록 게임 집합
JavaScript 클래식 게임 을 계속 합 니 다.
javascript 고전 게임 모음
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기