Android Studio实现推箱子小游戏

Android Studio实现推箱子小游戏推箱子是一款非常受欢迎的益智游戏 游戏的玩法简单 但是需要玩家具备一定的逻辑思维能力和空间感知能力 因此深受广大玩家的喜爱

一、项目概述

推箱子是一款非常受欢迎的益智游戏,游戏的玩法简单,但是需要玩家具备一定的逻辑思维能力和空间感知能力,因此深受广大玩家的喜爱。在游戏中,玩家需要将箱子推到指定位置,每一关都有一个特定的目标,比如推动所有的箱子到指定位置,或者在规定的时间内完成任务等等。随着关卡的逐渐升级,游戏的难度也会逐渐增加,需要玩家更加灵活地运用头脑和策略,才能完成更高难度的挑战。

本次推箱子不仅可以锻炼玩家的逻辑思维和空间想象力,同时也能带来愉悦的游戏体验和编程乐趣。

二、开发环境

在这里插入图片描述

三、详细设计

MainActivity包含游戏介绍、游戏开始和退出。菜单栏和底部导航栏逻辑相同。

@Override public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()){ 
    case R.id.itm_start: Intent xgq = new Intent(MainActivity.this, GameLevelActivity.class); startActivity(xgq); break; case R.id.itm_intro: Intent i = new Intent(MainActivity.this, GameIntroActivity.class); startActivity(i); break; case R.id.itm_exit: finish(); break; } return super.onOptionsItemSelected(item); } 

定义游戏视图GameView,mManRect为搬运工所在的位置,getManRect()设置搬运工的位置,goToLevel()选择关卡,resetGame()开始新游戏,gotoNextLevel()进入下一关,gotoPrvLevel()进入上一关,onDraw()绘制游戏区域,绘制音效开关的图标。drawGameBoard()绘制游戏网格,drawSoundSwitch()绘制音效开关,drawDoneLabel()绘制完成标志,onTouchEvent()根据用户通过在游戏区域触摸来控制搬运工的行进。

private void drawGameBoard(Canvas canvas) { 
    Rect destRect = new Rect(); for (int r = 0; r < mGameData.getBoardRowNum(); r++ ) for (int c = 0; c < mGameData.getBoardColumnNum(); c++){ 
    int topleft_x = (int)(mTopLeft_x + c * mColumnWidth); int topleft_y = (int)(mTopLeft_y + r * mRowHeight); destRect.set(topleft_x, topleft_y,(int)(topleft_x + mColumnWidth) + 2, (int)(topleft_y + mRowHeight) + 2);//+2是为了去除墙体之间的缝隙 if (mGameData.hasFlag(r, c)) canvas.drawBitmap(GameBitmaps.mFlagBitmap, null, destRect, null); StringBuffer []gameState = mGameData.getGameState(); //根据网格的状态绘制:盒子、旗子、空闲、人、墙、盒子旗子、人旗子 switch (gameState[r].charAt(c)){ 
    case GameInitialData.BOX: canvas.drawBitmap(GameBitmaps.mBoxBitmap, null, destRect, null); break; case GameInitialData.FLAG: canvas.drawBitmap(GameBitmaps.mFlagBitmap, null, destRect, null); break; case GameInitialData.NOTHING: break; case GameInitialData.MAN: canvas.drawBitmap(GameBitmaps.mManBitmap, null, destRect, null); break; case GameInitialData.WALL: // destRect.set(destRect.left, destRect.top, destRect.right+2, destRect.bottom + 2); //+2是为了去除墙体之间的缝隙 canvas.drawBitmap(GameBitmaps.mWallBitmap, null, destRect, null); break; case GameInitialData.BOX_FLAG: canvas.drawBitmap(GameBitmaps.mFlagBitmap, null, destRect, null); canvas.drawBitmap(GameBitmaps.mBoxBitmap, null, destRect, null); break; case GameInitialData.MAN_FLAG: canvas.drawBitmap(GameBitmaps.mFlagBitmap, null, destRect, null); canvas.drawBitmap(GameBitmaps.mManBitmap, null, destRect, null); break; } } } 

GameData类为所有关卡的数据,游戏区域不足11列,左右两边加上若干空白列凑足11列,行数不足11行,使得墙体图片看起来偏大也添加若干空行,go()方法为搬运工从(srcRow, srcColumn)移动到(destRow, destColumn),recordMoveInfo()记录移动的信息,方便重新绘制,isGameOver()判断所有箱子是否到达目的地。

public boolean undoMove(){ 
    if (mGameSteps.isEmpty()) return false; GameStepData step = mGameSteps.remove(mGameSteps.size() - 1); // logUndoOneStep(step); assert(mManPostion.isEqualTo(step.getManCurrentPosition())); restoreInitialState(step.getManCurrentPosition().row, step.getManCurrentPosition().column); int manRow = step.getManPrvPosition().row; int manColumn = step.getManPrvPosition().column; mManPostion.set(manRow, manColumn); mGameState[manRow].setCharAt(manColumn, 'M'); TCell boxPrvPos = step.getBoxPrvPosition(); TCell boxCurPos = step.getBoxCurrentPosition(); if (boxPrvPos != null && boxCurPos != null){ 
    //assert mGameState[boxCurPos.row].charAt(boxCurPos.column) == 'B'; restoreInitialState(boxCurPos.row, boxCurPos.column); mGameState[boxPrvPos.row].setCharAt(boxPrvPos.column, 'B'); } return true; } 

GameBitmaps为游戏中每种状态的位图,loadBitmaps()加载位图,releaseBitmaps()释放所有位图资源。

public static void releaseBitmaps(){ 
    //game board releaseBmp(mBoxBitmap); releaseBmp(mManBitmap); releaseBmp(mWallBitmap); releaseBmp(mFlagBitmap); releaseBmp(mDoneBitmap); releaseBmp(mSoundOpenBitmap); releaseBmp(mSoundCloseBitmap); } 

GameInitialData类为游戏初始化数据,先定义final char静态常量,说明游戏区域单格放一个,给了第一关和第二关的默认图案。readConfig()方法读取assets文件夹下的test_level_list.txt,是所有关卡的样式。
在这里插入图片描述

 public static final char NOTHING = ' '; //该单格啥也没有 public static final char BOX = 'B'; //该单格放的是箱子 public static final char FLAG = 'F'; //红旗,表示箱子的目的地 public static final char MAN = 'M'; //搬运工 public static final char WALL = 'W'; //墙 public static final char MAN_FLAG = 'R'; //搬运工 + 红旗 public static final char BOX_FLAG = 'X'; //箱子 + 红旗 

GameSound类定义游戏音效,mOneSetpMusicId为移动一步的music,mMoveBoxMusicId为移动箱子的music,mGameOverMusicId为游戏结束的音效,mSoundAllowed表示是否允许音效。

 //关闭音效 public static void releaseSound(){ 
    if (mSoundPool == null) return; mSoundPool.unload(mOneSetpMusicId); mSoundPool.unload(mMoveBoxMusicId); mSoundPool.unload(mGameOverMusicId); mSoundPool.release(); } 

LevelInitialData类为每关的单格数据,TCell类为单格坐标,PrfsManager类存储过关难度。

 public static void setPassedLevel(Context context, int level){ 
    mPassedLevels = context.getSharedPreferences(PRFS_PASSED_LEVEL_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = mPassedLevels.edit(); editor.putBoolean(KEY_PASSED_LEVEL_PREFIX + level, true); editor.commit(); } public static boolean getPassedLevel(Context context, int level){ 
    mPassedLevels = context.getSharedPreferences(PRFS_PASSED_LEVEL_NAME, Context.MODE_PRIVATE); return mPassedLevels.getBoolean(KEY_PASSED_LEVEL_PREFIX + level, false); //false是默认值,没有关卡level的首选项值时返回false } 

四、运行演示

Android Studio实现推箱子小游戏

五、项目总结

推箱子小游戏是一款非常经典的益智游戏。在Android上实现推箱子小游戏可以锻炼学生的逻辑思维能力和Android开发技能。需要注意的是,推箱子小游戏的实现需要涉及到一些算法和逻辑处理,因此需要具备一定的编程经验和逻辑思维能力。下面总结下游戏的实现步骤:

  1. 创建一个Android项目,并在布局文件中添加一个二维数组的格子布局,用于展示游戏地图。
  2. 在代码中定义游戏地图的二维数组,并初始化地图数据。
  3. 实现游戏角色的移动功能:根据用户的操作,判断游戏角色是否可以向前移动,如果可以移动,更新地图数据和角色位置,刷新游戏地图。
  4. 实现游戏的胜利判定:判断地图上的目标点是否都被箱子占据,如果是,则游戏胜利。
  5. 实现游戏的失败判定:判断箱子是否被挤到了角落,如果是,则游戏失败。
  6. 在布局文件中添加游戏控制按钮,用于控制游戏角色的移动。
  7. 实现游戏控制按钮的事件,根据用户的操作调用游戏角色移动函数。
  8. 在游戏结束时,弹出游戏结束提示框,询问用户是否重新开始游戏。

完成以上步骤后,就可以实现一个简单的推箱子小游戏了。可以根据需要添加一些额外的功能,例如计分系统、关卡系统等。

六、源码获取

想要立即拥有这篇文章的源代码?没问题!两种方式任你选:💻直接下方CSDN专属下载链接,轻松get√;🎁或者,只需动动手指指关注公众号《萌新加油站》,回复下方关键词即刻解锁!快来探索你的技术宝藏,开启编程新旅程吧!🚀

1️⃣直接右侧链接下载源代码 Android推箱子小游戏
2️⃣直接右侧链接下载课设报告 Android推箱子课设报告
3️⃣关注公众号萌新加油站 后台回复:推箱子

🚀这有你错过的精彩内容🚀
Android Studio实现五子棋小游戏
Android Studio实现知乎日报App
Android Studio实现贪吃蛇小游戏
Android Studio实现文艺阅读App
Android Studio实现多功能日记本

使人人都深知淫欲之害,立志如山,守身如玉,不但不做任何邪淫之事,即使夫妻间正当的性关系也懂得节制。从此世上的鳏夫、寡妇、孤儿和丧子的老人,必将日见减少。富裕、长寿、健康、安宁,人人都可得到。自己与家人从此平安吉祥,国家和社会从此和谐安定。

今天的文章 Android Studio实现推箱子小游戏分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-15 16:46
下一篇 2024-12-15 16:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/87019.html