移动软件开发实验6推箱子

2024年夏季《移动软件开发》实验报告

姓名和学号?未知
本实验属于哪门课程?中国海洋大学24夏《移动软件开发》
实验名称?实验6:推箱子
博客地址?blog.csdn.net/astroiszz
Github仓库地址?gitee.com/astrome

一、实验目标

1、综合所学知识创建完整的推箱子游戏。

2、能够在开发过程中熟练掌握真机预览、调试等操作。

二、实验步骤

1.配置资源文件

将制作小程序需要的图片和数据文件分别存储在image文件夹和utils文件夹中的公用js文件中。

请添加图片描述

2.界面设计

导航栏设计。

请添加图片描述
请添加图片描述

首页设计。

首页分为标题和关卡列表两个部分,首先在app.wxss中统一对所有界面的容器和标题样式进行设计。

请添加图片描述

首页组件。

请添加图片描述
请添加图片描述

预览效果:

请添加图片描述

接下来设计游戏详情界面,为方便预览,首先添加编译模式。

请添加图片描述

界面组件及样式设计。

请添加图片描述
请添加图片描述

对效果进行预览。(按键中的标识后修改为箭头)

请添加图片描述

在data.js中保存地图数据,并向外暴露。

请添加图片描述

外部需要引用时在文件开始输入相应代码。

请添加图片描述

对首页关卡列表进行详细设计,添加数据并修改组件。

请添加图片描述
请添加图片描述

效果:

请添加图片描述

3.跳转逻辑实现

修改首页相关组件绑定事件并添加对应逻辑函数。

请添加图片描述
请添加图片描述

game.js在onLoad中添加代码获取参数并渲染画面。

请添加图片描述

在这里插入图片描述

现在可以正确响应点击事件。

4.画布绘制

先添加所需的数据字段。

请添加图片描述

用于记录地图数据、箱子数据、agent位置等。

编写函数初始化画布。

请添加图片描述

编写绘制函数。

请添加图片描述

现在可以正常绘制游戏画面。

在这里插入图片描述

5.游戏逻辑实现

修改按键组件,绑定点击事件。

请添加图片描述

请添加图片描述

接下来编写移动和重新开始的逻辑函数。(移动的逻辑函数不全部展示)

请添加图片描述
请添加图片描述

所有移动函数最后都需要重新绘制画面,并判断当前状况是否游戏成功。(判赢的函数后面编写)

请添加图片描述

重新开始。

请添加图片描述

判赢函数实现。

请添加图片描述
请添加图片描述

至此可以正常游戏。

三、程序运行结果

在这里插入图片描述

四、问题总结与体会

小程序制作过程中发现在编写绘制画布函数后进行预览时,按键显示异常。
请添加图片描述

修改按键宽度等操作没有效果,搜索之后发现是小程序开发引擎不完善导致的bug,删除相应代码可解决。

请添加图片描述
请添加图片描述

通过本次实验,再次熟悉了通过添加调试模式进行页面预览,以及运用公用js文件的操作。通过app.wxss进行全局样式设计可以避免代码冗余。对于wx:for的语法也更加熟悉。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Android 推箱子游戏源码,供参考: ```java public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final int ROWS = 6; // 行数 private static final int COLS = 6; // 列数 private int[][] map = new int[ROWS][COLS]; // 地图数组 private ImageView[][] imageViews = new ImageView[ROWS][COLS]; // 图片数组 private int manX, manY; // 人的坐标 private int[] targetX = new int[]{1, 1, 1, 4, 4, 4}; // 目标点坐标 private int[] targetY = new int[]{1, 2, 3, 1, 2, 3}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initMap(); initView(); } // 初始化地图 private void initMap() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (i == 0 || i == ROWS - 1 || j == 0 || j == COLS - 1) { map[i][j] = 1; // 外围为墙 } else { map[i][j] = 0; // 内部为空 } } } // 设置目标点 for (int i = 0; i < targetX.length; i++) { map[targetX[i]][targetY[i]] = 2; } // 设置人的初始位置 manX = ROWS / 2; manY = COLS / 2; map[manX][manY] = 3; } // 初始化界面 private void initView() { LinearLayout container = findViewById(R.id.container); container.removeAllViews(); for (int i = 0; i < ROWS; i++) { LinearLayout row = new LinearLayout(this); row.setOrientation(LinearLayout.HORIZONTAL); container.addView(row); for (int j = 0; j < COLS; j++) { ImageView imageView = new ImageView(this); imageView.setPadding(2, 2, 2, 2); imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); switch (map[i][j]) { case 0: imageView.setImageResource(R.drawable.box_empty); break; case 1: imageView.setImageResource(R.drawable.box_wall); break; case 2: imageView.setImageResource(R.drawable.box_target); break; case 3: imageView.setImageResource(R.drawable.box_man); break; case 4: imageView.setImageResource(R.drawable.box_box); break; } row.addView(imageView); imageViews[i][j] = imageView; } } findViewById(R.id.btn_up).setOnClickListener(this); findViewById(R.id.btn_down).setOnClickListener(this); findViewById(R.id.btn_left).setOnClickListener(this); findViewById(R.id.btn_right).setOnClickListener(this); } // 移动箱子 private void moveBox(int x, int y, int dx, int dy) { int nextX = x + dx; int nextY = y + dy; if (map[nextX][nextY] == 0) { // 下一格为空 map[nextX][nextY] = 4; // 移动箱子 map[x][y] = 3; // 移动人 } else if (map[nextX][nextY] == 2) { // 下一格为目标点 map[nextX][nextY] = 6; // 箱子进入目标点 map[x][y] = 3; // 移动人 } initView(); } // 移动人 private void moveMan(int dx, int dy) { int nextX = manX + dx; int nextY = manY + dy; if (map[nextX][nextY] == 0 || map[nextX][nextY] == 2) { // 下一格为空或为目标点 map[manX][manY] = map[manX][manY] == 3 ? 0 : 2; // 人离开或进入目标点 manX = nextX; manY = nextY; map[manX][manY] = 3; // 移动人 } else if (map[nextX][nextY] == 4) { // 下一格为箱子 moveBox(nextX, nextY, dx, dy); } initView(); checkWin(); } // 检查是否胜利 private void checkWin() { for (int i = 0; i < targetX.length; i++) { if (map[targetX[i]][targetY[i]] != 6) { // 目标点上没有箱子 return; } } Toast.makeText(this, "You win!", Toast.LENGTH_SHORT).show(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_up: moveMan(-1, 0); break; case R.id.btn_down: moveMan(1, 0); break; case R.id.btn_left: moveMan(0, -1); break; case R.id.btn_right: moveMan(0, 1); break; } } } ``` 该源码实现的是一个简单的 6x6 的推箱子游戏,地图、图片等资源需要自己准备。实现的思路是通过一个二维数组来表示地图,通过 ImageView 数组来显示图片,并在移动时修改数组元素并更新界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值