android推箱子游戏源码
时间: 2023-07-29 15:14:38 浏览: 142
Android推箱子游戏源代码
以下是一个简单的 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 数组来显示图片,并在移动时修改数组元素并更新界面。
阅读全文