基于Android的推箱子小游戏 源码
16lz
2022-05-26
完整工程已打包放在我的资源文件中 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {GameMain.this.finish();}});dl1.setNeutralButton("no", new DialogInterface.OnClickListener() {@Overridepublic 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传递的数据@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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()方法决定是否播放音乐@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();if(music.isMusicCheck(this))musicHandle.play(this, R.raw.bg);}//游戏暂停,调用Musichandle类的stop()方法停止音乐@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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 {@Overridepublic 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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;}}}
<?xml version="1.0" encoding="utf-8"?>
更多相关文章
- Android学习札记48:将TextView中的指定文字转换为表情显示
- android 开源项目列表
- Android横竖屏切换的解决方法
- android猜数字游戏
- android 动画学习系列(一)
- Activity之间传递类对象
- Android(安卓)build.gradle buildConfigField 配置数组
- Android开发便签9:在android资源文件中定义字符串数组
- Android(安卓)如何判断CPU是32位还是64位