完整工程已打包放在我的资源文件中 https://download.csdn.net/download/huangshuai147/11151692
package com.example.pushbox;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class GameMain extends Activity {
electricity elect;
public LinearLayout ll = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_main);
ll = (LinearLayout)findViewById(R.id.ll);
}
/*
* 通过判断用户点击按钮来做相应的动作
* 通过Intent携带数据,Game类根据数据判断应该加载的那类游戏视图
* continue= no是新游戏
* continue = yes是需要加载存储的游戏状态,来继续上一次未完成的游戏
* */
public void onClick(View view)
{
Intent in=null;
switch (view.getId())
{
case R.id.btn_newgame:
in=new Intent(GameMain.this, Game.class);
in.putExtra("continue", "no");//新游戏
startActivity(in);
break;
case R.id.btn_exit: //游戏退出
isFinish();
break;
case R.id.btn_about: //游戏介绍
in=new Intent(GameMain.this, about.class);
startActivity(in);
break;
case R.id.btn_continue: //继续游戏
in=new Intent(this, Game.class);
in.putExtra("continue", "yes");
startActivity(in);
break;
}
}
public void isFinish()
{
AlertDialog.Builder dl1 = new AlertDialog.Builder(this);
dl1.setTitle("Warnning!");
dl1.setMessage("Do you want exit?");
dl1.setPositiveButton("yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
GameMain.this.finish();
}
});
dl1.setNeutralButton("no", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dl1.create();
dl1.show();
}
@Override
protected void onPause()
{
// TODO Auto-generated method stub
super.onPause();
unregisterReceiver(elect);
}
@Override
protected void onResume()
{
// TODO Auto-generated method stub
super.onResume();
elect=new electricity();
IntentFilter intentFilter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(elect, intentFilter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater =new MenuInflater(this);
inflater.inflate(R.menu.activity_game_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId())
{
case R.id.music:
ll.setBackgroundResource(R.drawable.pc3);
Intent in=new Intent(GameMain.this,music.class);
startActivity(in);
break;
case R.id.help:
Log.i("info", "help");
Intent inn=new Intent(GameMain.this,help.class);
startActivity(inn);
ll.setBackgroundResource(R.drawable.pc4);
break;
case R.id.bgset:
findBgset();
ll.setBackgroundResource(R.drawable.pc2);
break;
case R.id.explain:
findAbout();
ll.setBackgroundResource(R.drawable.pc1);
break;
}
return super.onOptionsItemSelected(item);
}
public void findBgset()
{
AlertDialog.Builder dll = new AlertDialog.Builder(this);
final String[] Bgset = {"跑车1","跑车2","跑车3","跑车4"};
dll.setTitle("Which favorite's is select");
dll.setIcon(R.id.bgset);
dll.setItems(Bgset, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which)
{
String s="你的选择是:";
if(Bgset[which]=="跑车1")
{
s += "跑车1";
ll.setBackgroundResource(R.drawable.pc1);
}
else if(Bgset[which]=="跑车2")
{
s += "跑车2";
ll.setBackgroundResource(R.drawable.pc2);
}
else if(Bgset[which]=="跑车3")
{
s += "跑车3";
ll.setBackgroundResource(R.drawable.pc3);
}
else
{
s += "跑车4";
ll.setBackgroundResource(R.drawable.pc4);
}
Toast.makeText(GameMain.this,s,1000).show();
}
});
dll.create();
dll.show();
}
public void findAbout()
{
String s="最经典的推箱子游戏,类似的游戏你一定早就玩过。要控制搬运工上下左右移动,来将箱子推到指定地点记得几年前,《推箱子》在PC机上刮起了一股不小的益智类游戏的旋风,现在许多资深玩家也都对《推箱子》赞不绝口,可见有深度的益智类游戏是非常受大家欢迎的。 \n推箱子游戏1981年由日本人今林宏行首创,是在1982年12月由Thinking Rabbit 公司首次发行,名“仓库番”。箱子只可以推, 不可以拉, 而且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。\n推箱子游戏是一种老少皆宜的益智游戏,既可以开发青少年学生的智力,又可以防止老年痴呆症,全家一起攻关还可以促进家庭和睦,何乐而不为?";
Toast.makeText(GameMain.this,s,1000).show();
}
}
package com.example.pushbox;
import java.util.ArrayList;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
public class GameView extends View {
public int gate=Game.gate;
private int manx;
private int many;
private float xoff=10;
private float yoff=20;
private int tilesize;
public int maprow=0;
public int mapcolumn=0;
private int width=0;
private int heith=0;
private Bitmap pic[]=null;
final int WALL=1;
final int GOAL=2;
final int ROAD=3;
final int BOX=4;
final int BOXATGOAL=5;
final int MAN=6;
private Paint paint;
private Game game=null;
public int [][]map=null;
private int [][]tem;//原来的地图
float currentx;
float currenty;
public GameView(Context context, AttributeSet attrs)
{
super(context, attrs);
//实例化game,后面用
game=(Game)context;
/*WindowManager = manager = game.getWindowManager();
width = manager.getDefaultDisplay().getWidth();
heith = manager.getDefaultDisplay().getHeight(); */
//上面的那种获取宽高改成下面的那种
//获取当前游戏屏幕的宽和高
DisplayMetrics dm = getResources().getDisplayMetrics();
width= dm.widthPixels;
heith= dm.heightPixels;
this.setFocusable(true);
/*
* 这里不再是initMap()
* 我们需要判断一下,用户单击的时哪个按钮
* 如果是continue按钮,则需要使用存储的地图game.stored
* 如果是New Game按钮,则直接使用initMap()从MapList中调取地图*/
if(game.continue_game)
{
map=game.stored;
getMapdetail();
getmanposition();
}
else
{
initMap();
}
initpic();
}
public void initMap()
{
map=getmap(gate);
getMapdetail();
getmanposition();
list.clear();
}
public int [][]getmap(int grate){
return MapList.getmap(grate);
}
//获取地图的行列数,地图边距,每个图片的大小,保存当前游戏的原始地图
private void getMapdetail()
{
maprow=map.length;
mapcolumn=map[gate].length;
xoff=30;
yoff=60;
int t=maprow>mapcolumn?maprow:mapcolumn;
int s1=(int) Math.floor((width-2*xoff)/t);
int s2=(int) Math.floor((heith-xoff)/t);
tilesize=s1y&&(currentyx+tilesize)
{
moveRight();
}
if(currentxx&&(currentxy+tilesize){
moveDown();
}
if(currenty list=new ArrayList();
public void back()
{
if(list.size()>0)
{
CurrentMap proMap=list.get(list.size()-1);
map=proMap.getmap();
getmanposition();
list.remove(list.size()-1);
}
else
{
Toast.makeText(getContext(), "You Can't Back", 1).show();
}
}
public void storyMap(int map[][])
{
CurrentMap cMap=new CurrentMap(map);
list.add(cMap);
if(list.size()>10)
list.remove(0);
}
}
package com.example.pushbox;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.LinearLayout;
import android.widget.Toast;
public class Game extends Activity
{
public LinearLayout lll = null;
public static int gate=0;
GameView gameView;
//定义布尔值,表示游戏是继续 还是新游戏
public boolean continue_game;
private String s;
//s用来接收Intent传递的数据
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//默认是新游戏
continue_game=false;
//Intent传递过来的值
s=getIntent().getStringExtra("continue");
/*
* 假如接收的是yes,说明用户单击的是Continue按钮
* 那么,continue_game为真时,使用loadMap()来加载内存数据*/
if(s.equals("yes"))
continue_game=true;
if(continue_game)
loadMap();
setContentView(R.layout.game);
gameView=(GameView) findViewById(R.id.mygameview);
lll = (LinearLayout)findViewById(R.id.lll);//接收布局
}
//当界面运行时,根据用户的爱好
//调用Musichandle类的play()方法决定是否播放音乐
@Override
protected void onResume()
{
// TODO Auto-generated method stub
super.onResume();
if(music.isMusicCheck(this))
musicHandle.play(this, R.raw.bg);
}
//游戏暂停,调用Musichandle类的stop()方法停止音乐
@Override
protected void onPause()
{
// TODO Auto-generated method stub
super.onPause();
musicHandle.stop(this);
/*
* 游戏暂停时,游戏数据需要存储,游戏的地图信息,行列数都要存储
* savegame()的返回值时一个字符串,它的功能就是把二维数组转化为字符串
* maprow.mapcolumn保存的时游戏的行列数*/
//新添的代码
getPreferences(MODE_PRIVATE).edit().putLong("gate",gameView.gate).commit();
getPreferences(MODE_PRIVATE).edit().putString("maps",saveGame()).commit();
getPreferences(MODE_PRIVATE).edit().putLong("maprow",gameView.maprow).commit();
getPreferences(MODE_PRIVATE).edit().putLong("mapcolumn",gameView.mapcolumn).commit();
}
/*
* saveGame()的返回值时一个字符串,它的功能就是把一个二维数组转化成字符串
* 先把二维数组转化为一维数组
* 然后把 一维数组使用StringBuilder类的append()方法变为一个StringBuilder
* 最后使用Object类中的toString()方法把StringBuilder转化为String对象*/
public String saveGame()
{
int[] saved = new int[gameView.maprow * gameView.mapcolumn];
for (int i = 0; i < gameView.maprow; i++)
for (int j = 0; j < gameView.mapcolumn; j++)
{
saved[i * gameView.mapcolumn + j] = gameView.map[i][j];
}
StringBuilder buf = new StringBuilder();
for (int element : saved)
{
buf.append(element);
}
String s=buf.toString();
return s;
}
/*
* 如果取值不成功,则还是第一关
* first就是第一关转化的字符串*/
String first="0011100000121000001311111114342112346111111141000001210000011100";
public int[][]stored;
/*
* loadMap()的作用时在存储空间里取出字符串的游戏数值,并还原为二维数组*/
public void loadMap()
{
gate = (int)getPreferences(MODE_PRIVATE).getLong("gate",0);
String mapstring =getPreferences(MODE_PRIVATE).getString("maps", first);
int ii=(int) getPreferences(MODE_PRIVATE).getLong("maprow", 8);
int jj=(int) getPreferences(MODE_PRIVATE).getLong("mapcolumn", 8);
int []maps=new int [mapstring.length()];
for(int i=0;i
package com.example.pushbox;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class about extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.about);
}
}
package com.example.pushbox;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class electricity extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(intent.ACTION_BATTERY_CHANGED)){
int level=intent.getIntExtra("level", 0);
int total=intent.getIntExtra("scale", 100);
Toast.makeText(context, "当前电量是:"+(level*100)/total+"%",1).show();
}
}
}
package com.example.pushbox;
import android.app.Activity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
public class help extends Activity {
VideoView vv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.help);
vv=(VideoView) findViewById(R.id.videoview1);
vv.setVideoPath("android.resource://"+getPackageName()+"/"+R.raw.gate1);
vv.setMediaController(new MediaController(this));
vv.start();
vv.requestFocus();
}
}
package com.example.pushbox;
public class MapList {
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,3,3,6,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}
},
{
{0,1,1,1,1,1,1,1,0,0},
{0,1,3,3,3,3,3,1,1,1},
{1,1,4,1,1,1,3,3,3,1},
{1,6,3,3,4,3,3,4,3,1},
{1,3,2,2,1,3,4,3,1,1},
{1,1,2,2,1,3,3,3,1,0},
{0,1,1,1,1,1,1,1,1,0}
},
{
{0,1,1,1,1,0},
{1,1,3,3,1,0},
{1,3,6,4,1,0},
{1,1,4,3,1,1},
{1,1,3,4,3,1},
{1,2,4,3,3,1},
{1,2,2,3,2,1},
{1,1,1,1,1,1}
}
};
static int count=map.length;
public static int [][] getmap(int grade){
int temp[][];
if(grade>=0&&grade
package com.example.pushbox;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.IBinder;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.widget.Toast;
public class music extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.music_setting);
}
public static boolean isMusicCheck(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("music", true);
}
}
package com.example.pushbox;
import android.content.Context;
import android.media.MediaPlayer;
public class musicHandle {
private static MediaPlayer mp=null;
public static void play(Context context,int resource)
{
stop(context);
if(music.isMusicCheck(context))
{
mp=MediaPlayer.create(context, resource);
mp.setLooping(true);
mp.start();
}
}
public static void stop(Context context)
{
if(mp!=null)
{
mp.stop();
mp.release();
mp=null;
}
}
}