pushbox(2)

利用二维数组不同数字表示不同含义,然后在根据数字画出该位置的图像。

MapList.java(工具包,能够得到总共有多少关,得到各关的二维数组)


package edu.phshbox;

public class MapList {
/**
* 用不同的数字表示不同的含义,用三维数组表示各个关卡,
* 其中每个二维数组表示一关
* 0 nothing
* 1 wall
* 2 goal
* 3 road
* 4 box
* 5 box at goal
* 6 worker
* */
public static int[][][] map =
{
{
{ 0, 0, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 2, 1, 0, 0, 0 },
{ 0, 0, 1, 3, 1, 1, 1, 1 },
{ 1, 1, 1, 4, 3, 4, 2, 1 },
{ 1, 2, 3, 4, 6, 1, 1, 1 },
{ 1, 1, 1, 1, 4, 1, 0, 0 },
{ 0, 0, 0, 1, 2, 1, 0, 0 },
{ 0, 0, 0, 1, 1, 1, 0, 0 }
},
{
{ 1, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 6, 3, 3, 1, 0, 0, 0, 0 },
{ 1, 3, 4, 4, 1, 0, 1, 1, 1 },
{ 1, 3, 4, 3, 1, 0, 1, 2, 1 },
{ 1, 1, 1, 3, 1, 1, 1, 2, 1 },
{ 0, 1, 1, 3, 3, 3, 3, 2, 1 },
{ 0, 1, 3, 3, 3, 1, 3, 3, 1 },
{ 0, 1, 3, 3, 3, 1, 1, 1, 1 },
{ 0, 1, 1, 1, 1, 1, 0, 0, 0 }
}
};
//总共有多少关
public static int count = map.length;

public static int getCount() {
return count;
}
//得到第几关的图
public static int[][] getMap(int grade) {
if(grade<0&&grade>=count)
grade=0;
int row=map[grade].length;
int col=map[grade][0].length;

int[][] result=new int[row][col];
for(int i=0;i<row;i++){
System.arraycopy(map[grade], 0, result, 0,col);
}
return result;
}
}

GameMain.java


package edu.phshbox;

import android.os.Bundle;
import android.app.Activity;

public class GameMain extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game_main);
}
}

GameView.java


package edu.phshbox;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;

public class GameView extends View {
int width = 0;
int oxOff=15;
int oyOff=30;
GameMain gameMain = null;

public final int WALL=1;
public final int GOAL=2;
public final int ROAD=3;
public final int BOX=4;
public final int BOX_AT_GOAL=5;
public final int WORKER=6;

public static int picSize=30;
private int map[][]=null;
private int row=0;
private int col=0;
private static int grade=0;
private Bitmap picture[]=null;

public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
gameMain = (GameMain) context;
WindowManager win = gameMain.getWindowManager();
width = win.getDefaultDisplay().getWidth();
initMap();

reset();
initPicture();
}
public void reset(){
row=map.length;
col=map[0].length;
picSize=(int)Math.floor((width-oxOff-oyOff)/col);

Log.d("width",width+"");
Log.d("pageSize",picSize+"");
}
//初始化地图
private void initMap() {
map=MapList.getMap(grade);
//resetRowCol();
}
private void initPicture() {
//resetPicSize();
picture=new Bitmap[7];
loadPicture(WALL,R.drawable.wall);
loadPicture(GOAL,R.drawable.goal);
loadPicture(ROAD,R.drawable.road);
loadPicture(BOX,R.drawable.box);
loadPicture(BOX_AT_GOAL,R.drawable.box_at_goal);
loadPicture(WORKER,R.drawable.worker);
}
//加载图片
private void loadPicture(int key, int pictureId) {
Drawable drawable=getResources().getDrawable(pictureId);
Bitmap bitMap=Bitmap.createBitmap(picSize,picSize, Bitmap.Config.ARGB_8888);

drawable.setBounds(0, 0, picSize, picSize);
Canvas canvas=new Canvas(bitMap);
drawable.draw(canvas);
picture[key]=bitMap;
}
//根据所在位置的数字不同,画不同的图片到相应的位置上
@Override
protected void onDraw(Canvas canvas) {
Paint paint=new Paint();
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(map[i][j]>0)
canvas.drawBitmap(picture[map[i][j]], oxOff+picSize*j, oyOff+picSize*i, paint);
}
}
super.onDraw(canvas);
}
}

运行结果:

时间: 2024-08-06 17:23:13

pushbox(2)的相关文章

pushbox(4)

在此之前,先修复以往的一个bug,因为前面的MapList是通过static方法得到二维数组的,因此不论调用 public static int[][] getMap(int grade)该方法多少此,都将得到同一块二维数组的引用,如果一个改变,则应一个也会改变.而判断某一关是否过关比较的way[][]和may[][]的目标位置是否都变成了箱子,因此就会有一个bug.解决办法,修改MapList,从三维数组重新拷贝出一个二维数组.MapList.java package edu.pushbox;

pushbox(3)

控制worker的移动,推动箱子到目标位置. Point.java(点,用以计算人当前的位置) package edu.pushbox.util; public class Point { public int row; public int column; public Point(int row, int column) { this.row = row; this.column = column; } } Position.java(1,通过传入的二维数组,计算出人的位置,2,通过对二维数

pushbox(5功能完善)

实现屏幕的渐渐展开 main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_paren

hdu1732 Pushbox bfs 细节比较多,需要注意

题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1732/ 题目就是推箱子游戏,有三个箱子和三个洞,最终目标状态就是三个箱子到三个洞中,所以我们搜索的状态就是人的位置和箱子的位置,因为总共8个状态值,而且横纵坐标的范围也不大,所以我们可以考虑一个8维的数组来存储状态. 代码如下: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll

C语言版推箱子

推箱子源代码初步: 1 #include<stdio.h> 2 #include<conio.h> 3 #include<stdlib.h> 4 #define boolean int 5 #define true 1 6 #define false 0 7 8 #define ROWS 10 9 //之所以定义为11,是因为字符串的尾部的\0 10 #define COLUMNS 11 11 12 //根据程序定义或者文件读入来构建地图,然后把他绘制到屏幕上 13 v

《Android源码设计模式解析与实战》读书笔记(十一)

第十一章.命令模式 命令模式是行为型模式之一.总体来说并不难理解,只是比较繁琐,他会将简单的调用关系解耦成多个部分,增加类的复杂度,但是即便如此,命令模式的结构依然清晰. 1.定义 将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化:对请求排队或者记录请求日志,以及支持可撤销的操作. 2.使用场景 (1)需要抽出待执行的动作,然后以参数的形式提供出来. (2)在不同的时刻指定.排列和执行请求.一个命令对象可以有与初始请求无关的生存期. (3)需要支持操作取消. (4)支持修改日志功

使用 C# 开发智能手机软件:推箱子(四)

这是"使用 C# 开发智能手机软件:推箱子"系列文章的第四篇. 在这篇文章中,介绍 Common/FindPath.cs 源程序文件. using System; using System.Drawing; using System.Collections.Generic; namespace Skyiv.Ben.PushBox.Common { /// <summary> /// 寻找最短路线 /// </summary> static class FindP

jQuery版推箱子游戏详解和源码

前言 偶然间看到很多用js写游戏的感觉很炫酷的样子,所以就想试试,就看了一些资料和某前端站点的视屏.于是乎就自己动手实践了一下,上推箱子截图 感觉很丑陋,但是功能是实现了.再说貌似大多都是这样的吧,这一关其实还是有点难度的,我做完之后想检测一下下一关正确么,居然还玩了以后才通关. 如果你看到这张图让你想起了你童年的回忆,说明你老了,这里可以试玩一下(很遗憾没有链接地址,最后又源码可以下载). css布局 主要考虑的是地图是怎么动态生成的,地图中有灰色的,还有墙,箱子,蓝色,红色背景,人物.先看c

使用 C# 开发智能手机软件:推箱子(十二)

这是"使用 C# 开发智能手机软件:推箱子"系列文章的第十二篇.在这篇文章中,介绍 Window/AboutDlg.cs 源程序文件. 这个源程序文件包括 AboutDlg 类,该类继承自 System.Windows.Forms.Form 类.表示推箱子的"关于"对话框.例如以下图所看到的:     以下是 Window/AboutDlg.Designer.cs 源程序的部分代码: namespace Skyiv.Ben.PushBox.Window { part