目录
一、项目测试视频
网络资源模板--基于Android studio 实现推箱子游戏
二、项目简介
推箱子小游戏是一款非常经典的益智游戏。在Android上实现推箱子小游戏可以锻炼学生的逻辑思维能力和Android开发技能。需要注意的是,推箱子小游戏的实现需要涉及到一些算法和逻辑处理,因此需要具备一定的编程经验和逻辑思维能力。下面总结下游戏的实现步骤:
1.创建一个Android项目,并在布局文件中添加一个二维数组的格子布局,用于展示游戏地图,在代码中定义游戏地图的二维数组,并初始化地图数据。
2.实现游戏角色的移动功能:根据用户的操作,判断游戏角色是否可以向前移动,如果可以移动,更新地图数据和角色位置,刷新游戏地图。
3.实现游戏的胜利判定:判断地图上的目标点是否都被箱子占据,如果是,则游戏胜利。
4.实现游戏的失败判定:判断箱子是否被挤到了角落,如果是,则游戏失败。
5.在布局文件中添加游戏控制按钮,用于控制游戏角色的移动。
6.实现游戏控制按钮的点击事件,根据用户的操作调用游戏角色移动函数。在游戏结束时,弹出游戏结束提示框,询问用户是否重新开始游戏,
6.完成以上步骤后,就可以实现一个简单的推箱子小游戏了。可以根据需要添加一些额外的功能,例如计分系统、关卡系统等,
三、项目测试环境
四、项目详情设计
这段代码是一个简单的Android应用程序,它创建了一个包含三个按钮的主界面。每个按钮都有自己的点击事件监听器,分别用于显示游戏介绍、开始游戏和退出应用。此外,还实现了选项菜单,提供了与按钮相同的功能。
package com.example.gamebox_01;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnGameIntro = (Button) findViewById(R.id.btn_game_intro);
btnGameIntro.setOnClickListener((View.OnClickListener) new BtnGameIntro_ClickListener());
Button btnGameStart = (Button) findViewById(R.id.btn_start_game);
btnGameStart.setOnClickListener(new BtnStart_ClickListener());
Button btnExit = (Button) findViewById(R.id.btn_exit);
btnExit.setOnClickListener(new BtnExit_ClickListener());
}
private class BtnGameIntro_ClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, GameIntroActivity.class);
startActivity(i);
}
}
private class BtnStart_ClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
Intent xgq = new Intent(MainActivity.this, GameLevelActivity.class);
startActivity(xgq);
}
}
private class BtnExit_ClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
finish();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main_act, menu);
return super.onCreateOptionsMenu(menu);
}
@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);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_game_ui"
android:src="@drawable/game_sample"
android:layout_width="320dp"
android:layout_height="0dp"
android:layout_weight="3"
android:layout_gravity="center_horizontal"/>
<ListView
android:id="@+id/lv_game_intro"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4">
</ListView>
</LinearLayout>
`GameInitialData` 类是一个用于存储游戏初始数据的工具类。它包含了游戏的各种常量定义、游戏关卡的初始化数据以及读取配置文件的方法。在这个类中,游戏的各种元素如墙壁、箱子、搬运工等都被用字符表示,并且提供了两个预设的游戏关卡的初始化数据。除此之外,还有一个方法用于从配置文件中读取游戏关卡的数据。
package com.example.gamebox_01;
import android.content.res.Resources;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class GameInitialData {
public static final int DEFAULT_ROW_NUM = 11;
public static final int DEFAULT_COLUMN_NUM = 11;
public static ArrayList<LevelInitialData> GameLevels = new ArrayList<>();
//游戏区单元格放了什么
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'; //箱子 + 红旗
public static final String [] LEVEL_1 = {
" WWWW ",
" WF W ",
" WB W ",
" WM W ",
" WWWW ",
" ",
" "
};
public static final String [] LEVEL_2 = {
" ",
" ",
" WWWWWWW ",
" W FFB W ",
" W W B W ",
" W W W W ",
" W BMW W ",
" WFB W ",
" WFWWWWW ",
" WWW ",
" ",
" "
};
public static void addInitGameData(){
GameLevels.add(new LevelInitialData(7, 7, LEVEL_1));
GameLevels.add(new LevelInitialData(12, 12, LEVEL_2));
}
public static final String CONFIG_FILE_NAME = "level_list.txt";
// public static final String CONFIG_FILE_NAME = "test_level_list.txt";
public static void readInitialData(Resources res, String confgFileName) throws IOException {
try {
InputStreamReader inputReader = new InputStreamReader(res.getAssets().open(confgFileName) );
BufferedReader bufReader = new BufferedReader(inputReader);
readConfig(bufReader);
} catch (IOException e) {
// Toast.makeText(context, "无法打开配置文件,程序不得不退出。", Toast.LENGTH_LONG).show();
throw e;
}
}
private static void readConfig(BufferedReader bufReader) throws IOException {
String line = "";
while ((line = bufReader.readLine()) != null) {
line = line.trim();
if (line.length() < 3) continue; //该行内容无效
if (line.charAt(0) == '\\' && line.charAt(1) == '\\') continue; //注释行
if (line.charAt(0) == '[' && line.charAt(line.length() - 1) == ']') {
String label = line.substring(1, line.length() - 1); //不包括line.length() - 1
if (Character.isDigit(label.charAt(0))) { //关卡
int level = Integer.parseInt(label);
String strRowColumnNum = bufReader.readLine();
LevelInitialData levelData = readRowColumnNum(strRowColumnNum);
for (int r = 0; r < levelData.mRowNum; r++) {
levelData.mInitialState[r] = bufReader.readLine();
if (levelData.mInitialState[r] == null)
throw new IOException("配置文件中,第" + level + "关的行数不足。");
if (levelData.mInitialState[r].length() < levelData.mColumnNum)
throw new IOException("配置文件中,第" + level + "关第" + r + "行的列数不足。");
}
GameLevels.add(levelData);
}
}
}
}
private static LevelInitialData readRowColumnNum(String strRowColumnNum) {
StringTokenizer stringTokenizer = new StringTokenizer(strRowColumnNum);
String strRowNum = stringTokenizer.nextToken(); //默认以空格作为分隔符
String strColumnNum = stringTokenizer.nextToken();
int rowNum = Integer.parseInt(strRowNum);
int columnNum = Integer.parseInt(strColumnNum);
LevelInitialData levelData = new LevelInitialData(rowNum, columnNum);
return levelData;
}
}
Get 项目模板源码
👇👇👇快捷获取方式👇👇👇