网络资源模板--基于 Android Studio 实现的推箱子游戏

目录

一、项目测试视频

二、项目简介

三、项目测试环境

四、项目详情设计

Get 项目模板源码


一、项目测试视频

网络资源模板--基于Android studio 实现推箱子游戏

二、项目简介

推箱子小游戏是一款非常经典的益智游戏。在Android上实现推箱子小游戏可以锻炼学生的逻辑思维能力和Android开发技能。需要注意的是,推箱子小游戏的实现需要涉及到一些算法和逻辑处理,因此需要具备一定的编程经验和逻辑思维能力。下面总结下游戏的实现步骤:
1.创建一个Android项目,并在布局文件中添加一个二维数组的格子布局,用于展示游戏地图,在代码中定义游戏地图的二维数组,并初始化地图数据。
2.实现游戏角色的移动功能:根据用户的操作,判断游戏角色是否可以向前移动,如果可以移动,更新地图数据和角色位置,刷新游戏地图。
3.实现游戏的胜利判定:判断地图上的目标点是否都被箱子占据,如果是,则游戏胜利。
4.实现游戏的失败判定:判断箱子是否被挤到了角落,如果是,则游戏失败。
5.在布局文件中添加游戏控制按钮,用于控制游戏角色的移动。
6.实现游戏控制按钮的点击事件,根据用户的操作调用游戏角色移动函数。在游戏结束时,弹出游戏结束提示框,询问用户是否重新开始游戏,
6.完成以上步骤后,就可以实现一个简单的推箱子小游戏了。可以根据需要添加一些额外的功能,例如计分系统、关卡系统等,

三、项目测试环境

10c1df080775455d8425e63a8c46fe36.png

四、项目详情设计

3965987708d94067a39acb824d7c464e.png

这段代码是一个简单的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);
    }
}

b7709619b8e642c38ad1b222c8238372.png

<?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>

2db863bed10d4a0ebc0a2e35e8dd326f.png

3fda90443a15463b938c4f52f2debbba.png

`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 项目模板源码

👇👇👇快捷获取方式👇👇👇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值