자바 뱀 탐식 게임 실현
새로운 콘 텐 츠 교류 와 가입 을 환영 합 니 다.
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 고전 게임 모음
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.