DevStore首页 > DEV资源 > 源码下载 > 源码详情

android扫雷源码

 
猫猫熊 | 2014-12-26 17:14    浏览量(6258)    评论(5)    收藏(5)
功能分类:休闲益智 支持平台:Android 运行环境:Eclipse
开发语言:Java 开发工具:Eclipse 源码大小:1.23MB
下载源码 1070 人下载

源码简介

扫雷游戏源码,功能不多说,参考windows XP经典扫雷。
不一样的是标记需要长按才可以,并且具有本地排行功能。
该游戏可以通过代码设置难度,修改MainActivity中的LEVEL的值即可直接修改棋子的个数,雷的个数也会跟着进行调整。(使用手机测试不要修改的太大,不然很难点)
扫雷苦手の福音:为了方便测试,在每盘游戏开始前会在Logcat中打印整个棋盘,跟着点就没有问题了。

源码截图

  • 游戏截图
  • 游戏胜利截图
  • 游戏排行
  • 调高难度截图~囧~
DevStore所有源码来自用户上传分享,版权问题及牵扯到商业纠纷均与DevStore无关。

源码片段

package com.example.saolei.view;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.saolei.R;
import com.example.saolei.adapter.LeiAdapter;
import com.example.saolei.dao.UserScoreDao;
import com.example.saolei.entity.ItemEntity;
import com.example.saolei.entity.UserScoreEntity;
import com.example.saolei.util.VibratorUtil;

public class MainActivity extends Activity {
	
	/**难度设置,通过直接改变这个变量可以修改游戏难度(棋盘的旗子个数)*/
	private static final int LEVEL = 10;
	
	private GridView gv;
	private LeiAdapter adapter;
	private Button startBtn;
	private Timer timer;
	private int howTime;
	private Handler handler;
	private TextView showTimeTv;
	private boolean isGameing = false;
	private UserScoreDao dao;
	
	private static final int MESSAGE_UPDATE_TIME = 1;
	private void initView(){
		dao = new UserScoreDao(this);
		showTimeTv = (TextView)findViewById(R.id.time);
		/**游戏开始后启动定时器,并通过该handler更新游戏已用时间*/
		handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				if(msg.what == MESSAGE_UPDATE_TIME){
					showTimeTv.setText("已用时间:"+howTime+"秒");
				}
			}
		};
		startBtn = (Button) findViewById(R.id.startbtn);
		gv = (GridView) findViewById(R.id.gv);
		//用来计时的定时器
		timer = new Timer();
		adapter = new LeiAdapter(LEVEL, this,gv);
		gv.setNumColumns(LEVEL);
		gv.setAdapter(adapter);
	}
	
	/**开始游戏需要进行的任务*/
	private void startGame(){
		timer.cancel();
		timer = new Timer();
		isGameing = true;
		howTime = 0;
		adapter = new LeiAdapter(LEVEL, MainActivity.this, gv);
		gv.setAdapter(adapter);
		timer.schedule(new TimerTask() {
			
			@Override
			public void run() {
				howTime++;
				handler.sendEmptyMessage(MESSAGE_UPDATE_TIME);
			}
		}, 0, 1000);
	}
	
	/**游戏结束后的状态调整*/
	private void stopGame(){
		timer.cancel();
		isGameing = false;
	}
	
	private void addListener(){
		/**点击开始按钮则充值状态*/
		startBtn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				((Button)v).setText("重新开始");
				startGame();
			}
		});
		
		/**长按为单元格添加旗子标记*/
		gv.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView parent, View view,
					int position, long id) {
				if(!isGameing){     //游戏没开始,则长按不生效
					return true;
				}
				ItemEntity entity = adapter.getItem(position);
				if(entity.isShow()){        //该单元格是显示状态,则长按不生效
					return true;
				}
				entity.setBiaoJi(!entity.isBiaoJi());   //将旗子标记位置返
				adapter.notifyDataSetChanged();
				//添加成功后提供震动反馈,需要权限
				VibratorUtil.Vibrate(MainActivity.this, 500);
				return true;
			}
			
		});
		gv.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView parent, View view,
					int position, long id) {
				if(!isGameing){   //游戏没开始,则点击不生效
					return;
				}
				ItemEntity entity = adapter.getItem(position);
				if(entity.isBiaoJi()){    //该单元格被标记,则点击不生效
					return;
				}
				if(!entity.isShow()){
					if(entity.isLei()){    //点击的单元格是雷,则游戏结束
						entity.setShow(true);
						stopGame();
						Toast.makeText(MainActivity.this, "游戏失败,请重新来过", 0).show();
						adapter.showLei();
						adapter.showBiaoJi();
						return;
					}
					//点击的是空白单元格,则显示周围无害的单元格(模仿window扫雷的功能)
					if(entity.getLeiCount() == 0 &&!entity.isLei()){
						adapter.shouNoLei(position);
					}
					entity.setShow(true);
					//判断游戏是否胜利
					if(adapter.isWin()){
						stopGame();
						View dialogView = getLayoutInflater().inflate(R.layout.dialog_win_name, null);
						final EditText et = (EditText) dialogView.findViewById(R.id.editText1);
						new AlertDialog.Builder(MainActivity.this).setTitle("恭喜").setPositiveButton("递交成绩", new Dialog.OnClickListener() {
							
							@Override
							public void onClick(DialogInterface dialog, int which) {
								String userName = et.getText().toString().trim();
								if(userName == null || "".equals(userName)){
									Toast.makeText(MainActivity.this, "请输入用户名", 0).show();
								}else{
									UserScoreEntity entity= new UserScoreEntity(userName, howTime);
									dao.addUser(entity);
									Intent intent = new Intent(MainActivity.this,PaiHangActivity.class);
									startActivity(intent);
								}
							}
						}).setNegativeButton("取消", null).setView(dialogView).create().show();;
					}
					adapter.notifyDataSetChanged();
				}
			}
			
		});
	}

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

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
  •   赞(1) 赞 +1 赞(1) 已赞
  •   收藏(5) 收藏 +1 已收藏 取消
  •   下载(1070)
评论(5)
sanai1992

sanai1992 2015-07-08 17:52:37

感谢楼主分享,不错哦~
回复(0) 赞(1) 赞(2)
烟雨蒙蒙

烟雨蒙蒙 2015-02-02 17:42:27

先看一下吧,想学习
回复(0) 赞(0) 赞(1)
小小兄

小小兄 2015-01-08 09:24:52

感谢楼主分享 哈哈
回复(0) 赞(0) 赞(1)
unicorncc

unicorncc 2014-12-30 00:21:17

感谢楼主分享,,楼主有没有对不规则图形的算法有研究啊?比如,给你一个不规则图形的边框,然后点击图形中间,给不规则图形上色!如果可以的话?想向你学习,请教哈!
回复(3) 赞(2) 赞(3)
 
  • 猫猫熊:
    回复@unicorncc:如果是读取的图片貌似确实不能用这种方法。不然你就尝试用Bitmap的getPixel方法取出所有颜色值形成一个二维数组,然后用这个扫雷的遍历方法进行填充呢?
    回复2015-01-09 09:58:30
  • unicorncc:
    你好。我试着实现了好几天了。没有成功哦!如果是加载一张jpg的不规则的黑色线框图案的图片,比如一个动漫的图片去填充,也是按这种思路吗?
    回复2015-01-08 15:57:06
  • 猫猫熊:
    这个没有仔细研究过。简单分析下有两个重点吧,一是填充不规则图形,这个android中有现成的类,只要不规则图形可以用path描述,就可以通过canvas的API进行填充。参考之前我做的画图板吧http://www.devstore.cn/code/info/529.html。二是判断点击的点是否在不规则图形内,这个简单考虑就是判断点击的点与圈外某个点(如原点)之间的连线与path的交点个数。偶数(包括0)则点击的点在圈外,基数则点击的点在圈内。可以按这个思路尝试下吧
    回复2014-12-30 13:02:15
w2518915

w2518915 2014-12-27 21:01:56

研究了下,算法的确实现挺简单,但若想动态配置游戏等级,只通过配置 LEVEL值恐怕是不够的,还需要仔细研究下。
回复(1) 赞(0) 赞(1)
 
  • 猫猫熊:
    嗯,就是闲暇时间搞的小游戏,又是圣诞节弄得,晚上还要陪女友逛街,就没细研究扫雷的数据结构。就当是练习做的,抛砖引玉吧。那个动态配置level还需要什么其他注意的,我就简单测试了一下其他难度,也没有分开做排行,嫌麻烦。不然我就做一个设置难度的选项了
    回复2014-12-27 22:10:01
  • 推荐
  • 审核
  • 收录
  • 获取活力值

源码上传作者

  • 14 能力值
  • 6 源码
  • 0 评测
  • 0 资料
擅长: 解析 xml 扫雷

热门源码