项目目录

  • 一、项目概述
  • 二、开发环境
  • 三、详细设计
  • 四、运行演示
  • 五、项目总结
  • 六、源码获取

一、项目概述

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

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

二、开发环境

三、详细设计

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

@Overridepublic 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 boardreleaseBmp(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. 在游戏结束时,弹出游戏结束提示框,询问用户是否重新开始游戏。

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

六、源码获取

关注公众号《萌新加油站》,后台回复:推箱子

点此直接下载源码:

Android Studio实现推箱子小游戏相关推荐

  1. android开发--推箱子小游戏(二)

    一.前言 迎来第二章的更新啦:使用ListView实现关卡的选择. 本章的内容有点小复杂,毕竟涉及使用了安卓开发中最难用也是最常用的控件之一:ListView 本章可以说是复杂但是单一吧.主要是想大家 ...

  2. c 语言推箱子vs,C语言推箱子小游戏教程

    作者GitHub-Pages个人主页 本教程GitHub-Pages链接 本教程百度云下载地址 本教程编写于2016/11/22 Dawson Lee edited this page on Beij ...

  3. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  4. 简单的c语言推箱子程序,完整版本的推箱子小游戏,最简单的纯C语言打造

    /*推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左 ...

  5. c#推箱子小游戏代码_推箱子小游戏V1.0制作

    小游戏实践 推箱子简易版 大家好,我是努力学习争取成为优秀的Game Producer的路人猿,今天来一起做一个推箱子的简易版本V1.0!下面跟我一起做吧~ 我们用到的软件如下: 编辑类 Visual ...

  6. 移动平台开发项目(推箱子小游戏)

    项目目的:实现一个推箱子小游戏 项目架构:使用三个活动类 项目功能: 能在touch中的Action_down动作下,实现小人推着箱子走的效果,全部箱子到达旗帜为过关. 能使用底部Button键来前后 ...

  7. win32GDI函数编程实现推箱子小游戏

    利用GDI绘图函数实现推箱子小游戏,代码源于上一篇博客 C语言控制台推箱子. 实现方法很简单,把字符用绘图函数绘出的图形替换即可. 从字符控制台到win32界面编程,更加形象化. 代码量大增,主程序就 ...

  8. C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流

    C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流 说明:学做了4关推箱子, 仅供初学者参考可用g++ 编译,可以将内容复制到TXT文件,将后缀改为".cp ...

  9. 手把手教你使用Python实现推箱子小游戏(附完整源码)

    文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Pytho ...

最新文章

  1. css学习入门篇(1)
  2. 前端之旅,正式启航~【前端学习路线图+配套学习视频+师长指点】
  3. C#性能优化:延迟初始化LazyT
  4. Kafka 3.0重磅发布,都更新了些啥?
  5. HDU1864(01背包)
  6. python语_Python 基本语法
  7. awk 正则表达式、正则运算符详细介绍
  8. qt creator 设置按键颜色_Qt编写自定义控件30-颜色多态按钮
  9. l298n电机哪一端为正_L298N是如何控制直流电机正反转的
  10. 操作系统第四版习题答案大全
  11. PLC通过485与单片机通讯示例
  12. HTML5_用语义化标记重新定义博客
  13. delphi mysql 删除_Delphi如何清空日志文件
  14. AQS队列到底是什么?
  15. 人工智能软件怎么开发
  16. macbook安装typescript环境added 1 package, and audited 2 packages in 26sfound 0 vulnerabilities代表成功了
  17. 动作捕捉技术在四足仿生机器人研究中的应用
  18. ubuntu中用vscode编译调试C\C++
  19. k210 C语言开发-3 使用SD卡
  20. Laplace变换的来源

热门文章

  1. 微信公众号的注册(实例:订阅号)
  2. WPF中,Combox的SelectedItem属性绑定成功后,未能默认显示上一次选择的结果。
  3. java毕业设计基于Bootstrap的读书网站设计与实现(附源码、数据库)
  4. DIP后焊元器件的标准焊接步骤
  5. 中关村软件园机房项目进度汇报
  6. 数字化转型新CP | 云原生+边缘计算 实践分享
  7. 霍尔效应实验背景及实验目的
  8. 手机木马网站服务器,快速查找网站木马
  9. Win10笔记本开启WiFi提示“无法启动承载网络”解决方法
  10. Nordic开发问题记录