Beginning Android Games 2 nd Edition(19)ゲームWorld類を読む

3260 ワード

このクラスの機能は主に以下のとおりです.
1.食いしん坊ヘビの実例を追跡し、「汚れ」の実例を生成し、ゲームの世界に「汚れ」が1つしか存在しないことを保証する
2.時間軸を基準として、貪食ヘビを更新する方法を提供する(0.5秒ごとにセルを移動する距離)
3.ゲームのスコアを追跡し、「汚れ」の10倍を食べる
4.「汚れ」を1つ食べるごとに、ヘビの移動速度を増やし、ゲームの挑戦性を高める
5.食いしん坊ヘビが生きているかどうかを追跡し、ゲームが終わるべきかどうかを判断する
6.ヘビを食いしばって「汚れ」を食べた後、新しい「汚れ」を生成する
package com.badlogic.androidgames.mrnom;

import java.util.Random;

public class World {
    static final int WORLD_WIDTH = 10;
    static final int WORLD_HEIGHT = 13;
    static final int SCORE_INCREMENT = 10;
    static final float TICK_INITIAL = 0.5f;
    static final float TICK_DECREMENT = 0.05f;

    public Snake snake;
    public Stain stain;
    public boolean gameOver = false;;
    public int score = 0;
    //        
    boolean fields[][] = new boolean[WORLD_WIDTH][WORLD_HEIGHT];
    Random random = new Random();
    float tickTime = 0;
    float tick = TICK_INITIAL;
    //      ,    
    public World() {
        snake = new Snake();
        placeStain();
    }

    //    
    private void placeStain() {
    	//           false
        for (int x = 0; x < WORLD_WIDTH; x++) {
            for (int y = 0; y < WORLD_HEIGHT; y++) {
                fields[x][y] = false;
            }
        }
        //      
        int len = snake.parts.size();
        //                true
        for (int i = 0; i < len; i++) {
            SnakePart part = snake.parts.get(i);
            fields[part.x][part.y] = true;
        }
        //         
        int stainX = random.nextInt(WORLD_WIDTH);
        int stainY = random.nextInt(WORLD_HEIGHT);
        
        //           (  false   )
        while (true) {
            if (fields[stainX][stainY] == false)
                break;
            stainX += 1;
            //x,y          ,      0    
            if (stainX >= WORLD_WIDTH) {
                stainX = 0;
                stainY += 1;
                if (stainY >= WORLD_HEIGHT) {
                    stainY = 0;
                }
            }
        }
        //               
        stain = new Stain(stainX, stainY, random.nextInt(3));
    }

    public void update(float deltaTime) {
        if (gameOver)
            return;

        tickTime += deltaTime;

        while (tickTime > tick) {
            tickTime -= tick;
            snake.advance();
            //       ,    
            if (snake.checkBitten()) {
                gameOver = true;
                return;
            }

            SnakePart head = snake.parts.get(0);
            //       ,                 
            if (head.x == stain.x && head.y == stain.y) {
            	//       ,    10 
                score += SCORE_INCREMENT;
                //eat         
                snake.eat();
                //        ,      ,    
                if (snake.parts.size() == WORLD_WIDTH * WORLD_HEIGHT) {
                    gameOver = true;
                    return;
                } else {
                    placeStain();
                }

                //  100 ,        0.05 ,TICK_DECREMENT      ,tick        
                if (score % 100 == 0 && tick - TICK_DECREMENT > 0) {
                    tick -= TICK_DECREMENT;
                }
            }
        }
    }
}