基于Android的推箱子小游戏 源码

完整工程已打包放在我的资源文件中  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;
		}
		
	}
}

 




    

    
        
            
                

                
                 
        
        
        
        
    	
         
        
        
         
         
         
         
          
        
    

 

 

 

 

 

你可能感兴趣的:(Android)