• android Snake(3)


    添加两个苹果到主界面

    Coordinate定义坐标,其中有能够判断是否相等的equals方法,用以判断两个坐标是否相等。MyRandom随机数生成类,封装random能够控制随机数产生的范围,产生随机坐标。SnakeView中判断产生的苹果是否重复,如果重复再产生一个,直到不重复为止。

    Coordinate.java

    package edu.hhxy.util;
    
    public class Coordinate {
        public int row;
        public int column;
    
        public Coordinate(int row, int column) {
            super();
            this.row = row;
            this.column = column;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + column;
            result = prime * result + row;
            return result;
        }
    
        public boolean equals(Coordinate obj) {
            if (column != obj.column)
                return false;
            if (row != obj.row)
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            return "Coordinate [row=" + row + ", column=" + column + "]";
        }
    }

    MyRandom.java

    package edu.hhxy.util;
    
    import java.util.Random;
    public class MyRandom {
        public static Random RNG = new Random();
        public static int MAXROWS = 0;
        public static int MAXCOLUMNS = 0;
        //限定隨機數產生的範圍
        public void reset(int rows, int columns) {
            MAXROWS = rows;
            MAXCOLUMNS = columns;
        }
        //得到一個座標
        public Coordinate getCoordinate() {
            int newR = 1 + RNG.nextInt(MAXROWS - 2);
            int newC = 1 + RNG.nextInt(MAXCOLUMNS - 2);
            return new Coordinate(newR, newC);
        }
    }

    SnakeView

    package edu.hhxy.view;
    
    import java.util.ArrayList;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.os.Handler;
    import android.os.Message;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.View;
    import android.widget.TextView;
    import edu.hhxy.mysnakegame.R;
    import edu.hhxy.util.Coordinate;
    import edu.hhxy.util.MyRandom;
    
    public class SnakeView extends BasicView {
        private int mMode = READY;
        public static final int PAUSE = 0;
        public static final int READY = 1;
        public static final int RUNNING = 2;
        public static final int LOSE = 3;
    
        public static final int RED_STAR = 1;
        public static final int YELLOW_STAR = 2;
        public static final int GREEN_STAR = 3;
        public static final int BITMAP_ARRAY_SIZE = 4;
    
        private TextView mStatusText;
        private ArrayList<Coordinate> appleList = new ArrayList<Coordinate>();
        // //////////////////
        private long period = 500L;
        private long lastMove = 0L;
    
        @SuppressLint("HandlerLeak")
        class Refresh extends Handler {// 开启子线程,定时对界面刷新
    
            @Override
            public void handleMessage(Message msg) {
                SnakeView.this.update();
                SnakeView.this.invalidate();
                super.handleMessage(msg);
            }
    
            public void delayed(long times) {
                this.removeMessages(0);// 把栈顶消息清空
                sendMessageDelayed(obtainMessage(0), times);
            }
        }
    
        private Refresh gameFresh = new Refresh();
    
        // //////////////////
    
        public SnakeView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            initGame();
        }
    
        public SnakeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initGame();
        }
    
        /*
         * 初始化SnakeView加载图片
         */
        private void initGame() {
            setFocusable(true);
            /* 调用父类方法设置bitMap大小 */
            resetBitmapArray(BITMAP_ARRAY_SIZE);
            /* 调用父类加載picture資源 */
            loadPicture(GREEN_STAR,
                    this.getResources().getDrawable(R.drawable.greenstar));
            loadPicture(YELLOW_STAR,
                    this.getResources().getDrawable(R.drawable.yellowstar));
            loadPicture(RED_STAR,
                    this.getResources().getDrawable(R.drawable.redstar));
        }
    
        public void setTextView(TextView findViewById) {
            mStatusText = findViewById;
        }
    
        public void setMode(int newMode) {
            int oldMode = mMode;
            mMode = newMode;
    
            if (newMode == RUNNING & oldMode != RUNNING) {
                mStatusText.setVisibility(View.INVISIBLE);
                update();
                return;
            }
            CharSequence str = "";
            if (newMode == READY) {
                str = "Snake
     Press Up to Play";
            }
            if (newMode == LOSE) {
                str = "Game Over
    ";
            }
    
            mStatusText.setText(str);
            mStatusText.setVisibility(View.VISIBLE);
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent msg) {
            // 判断是否隐藏主界面,显示当前界面
            if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
                if (mMode == READY | mMode == LOSE) {
                    initNewGame();
                    setMode(RUNNING);
                    update();
                    return (true);
                }
                return (true);
            }
            return super.onKeyDown(keyCode, msg);
        }
    
        private void initNewGame() {
            appleList.clear();
            addRandomApple();
            addRandomApple();
        }
    
        private void addRandomApple() {
            MyRandom myRandom = new MyRandom();
            myRandom.reset(rows, columns);
            Coordinate coordinate = null;
            boolean collsion = false,found=false;
            while (!found) {
                coordinate = myRandom.getCoordinate();
                collsion = false;
                for (Coordinate c : appleList) {
                    if (c.equals(coordinate)) {
                        collsion = true;
                    }
                }
                found=!collsion;
            }
            appleList.add(coordinate);
            Log.d("SIZE",appleList.size()+"");
        }
    
        public void update() {
            if (mMode == RUNNING) {
                long now = System.currentTimeMillis();
                if (now - lastMove > period)// 如果当前时间离最近一次刷新的时间大于period,就刷新,同时更新lastMove
                {
                    clearMaps();
                    // 更新墙
                    updateWalls();
                    // 更新苹果
                    updateApple();
                    gameFresh.delayed(period);
                    lastMove = now;
                }
            }
        }
    
        private void updateApple() {
            for (Coordinate c : appleList) {
                setMaps(YELLOW_STAR, c.row, c.column);
            }
        }
    
        /*
         * 初始墙
         */
        private void updateWalls() {
            for (int x = 0; x < columns; x++) {
                setMaps(GREEN_STAR, 0, x);
                setMaps(GREEN_STAR, rows - 1, x);
            }
            for (int y = 1; y < rows - 1; y++) {
                setMaps(GREEN_STAR, y, 0);
                setMaps(GREEN_STAR, y, columns - 1);
            }
            Log.d("freshed", "freshed wall");
        }
    }

    运行结果:

  • 相关阅读:
    GCD
    SQLite
    将博客搬至CSDN
    Extjs 4 总结
    spring mvc 复杂参数注入
    7/12 聊天室结束
    7/10
    7/6一些知识点
    随便写写
    spring boot 入门操作(三)
  • 原文地址:https://www.cnblogs.com/jianfengyun/p/3767557.html
Copyright © 2020-2023  润新知