Android贪吃蛇游戏实现

说明:贪吃蛇游戏是一款比较经典的休闲游戏,这是我做的第一个Android项目,会存在一些问题,文章包括项目的部分源码以及运行界面的一些图片,项目也参考学习了许多大佬的文章,会在文章最后面贴出参考文章,包括源码的链接,有什么问题也请大家指正。

登录与注册

登录界面和注册界面的后台数据采用了Android自带的sqlite数据库进行存储,通过sqlite的助手类对用户添加和用户的登录进行操作,这里贴一些关于登录和注册的方法。

 //添加新用户,即注册
    public long insertUserData(UserData userData) {
   
        String userName=userData.getUserName();
        String userPwd=userData.getUserPwd();
        ContentValues values = new ContentValues();
        values.put(USER_NAME, userName);
        values.put(USER_PWD, userPwd);
        return mSQLiteDatabase.insert("users", ID, values);
    }
    //根据用户名找用户,可以判断注册时用户名是否已经存在
    public int findUserByName(String userName){
   

        int result=0;
        String Query = "Select * from users where USER_NAME =?";
        Cursor cursor = mSQLiteDatabase.rawQuery(Query,new String[] {
    userName });
        if(cursor!=null){
   
            result=cursor.getCount();
            Log.w("result=",String.valueOf(result));
            cursor.close();
        }
        return result;
    }
    //根据用户名和密码找用户,用于登录
    public int findUserByNameAndPwd(String userName,String pwd){
   
        int result=0;
        String Query = "Select * from users where USER_NAME =? and USER_PWD =?";
        Cursor mCursor = mSQLiteDatabase.rawQuery(Query,new String[] {
    userName,pwd});
        if(mCursor!=null){
   
            result=mCursor.getCount();
            mCursor.close();
        }
        return result;
    }

游戏界面

在这里插入图片描述

一、主游戏界面

主游戏界面包括了小蛇的运动界面,上方的暂停对话框、分数显示的TextView,以及下方的方向键采用了ImageButton。主要说一下小蛇运动界面的实现,这是我参考了一位大佬的做法,先在Android写一个View的子类,将界面划分为32*32的小方格坐标存储在一个二维数组中,然后新建一个蛇运动的界面类,将界面的一些图片填入到方格中。

    Bitmap[] mTileArray;            //放置图片的数组
    int[][] mTileGrid;              //存放各坐标对应的图片
    //加载三幅小图片,包括墙,蛇身,蛇头
    public void loadTile(int key, Drawable tile) {
   
        Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        tile.setBounds(0, 0, mTileSize, mTileSize);
        tile.draw(canvas);
        mTileArray[key] = bitmap;
    }
    @Override
    public void onSizeChanged(int w, int h, int oldw, int oldh){
   
        //地图数组初始化
        mXTileCount = (int) Math.floor(w / mTileSize);
        mYTileCount = (int) Math.floor(h / mTileSize);
        //够分成一格的分成一格, 剩下不够一格的分成两份,左边一份,右边一份
        mXOffset = ((w - (mTileSize * mXTileCount)) / 2);
        mYOffset = ((h - (mTileSize * mYTileCount)) / 2);
        mTileGrid = new int[mXTileCount][mYTileCount];
        clearTiles();
    }
    //给界面的二维数组赋值,坐标存放想要放的图片
    public void setTile(int tileindex, int x, int y) {
   
        mTileGrid[x][y] = tileindex;
    }

二、食物的生成

食物是通过random产生随机坐标,存放到食物的Arraylist中,然后调用父类的方法将图片画在view上。

    private ArrayList<Coordinate> mFoodList = new ArrayList<Coordinate>(); // 存储食物的所有坐标的数组
     private static final Random RNG = new Random();//随机生成食物的坐标
 private void updateFood() {
   
        for (Coordinate c : mFoodList) {
   
            setTile(snakebody, c.x, c.y);
        }
    }
 private void addRandomFood() {
   
        Coordinate newCoord = null;
        boolean found = false;
        while (!found) {
   
            int newX = 1+RNG.nextInt(28);//坐标0-22+1
            int newY = 3+RNG.nextInt(20);//坐标0-23+3
            newCoord = new Coordinate(newX, newY);
            boolean collision = false;
            int snakelength = mSnakeTrail.size();
            //遍历snake, 看新添加的apple是否在snake体内, 如果是,重新生成坐标
            for (int index = 0; index < snakelength; index++) {
   
                if
  • 4
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值