说明:贪吃蛇游戏是一款比较经典的休闲游戏,这是我做的第一个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