Android 实现扫雷小游戏实例代码

Android 实现扫雷小游戏实例

最近学习Android 应用编程,抽空做个小应用,大家熟悉的扫雷应用,练手用,

以下是实现代码:

MainActivity 类

public class MainActivity extends Activity implements OnClickListener, OnLongClickListener { // 最外层布局 LinearLayout textviews; LinearLayout buttons; int[][] map = new int[10][10]; // 用来隐藏所有Button List<Button> buttonList = new ArrayList<Button>(); // -1 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textviews = (LinearLayout) findViewById(R.id.textviews); buttons = (LinearLayout) findViewById(R.id.buttons); initData(); initView(); } Set<Integer> random地雷; private void initData() { // 10个地雷 显示* 数组中是-1 // 90个 雷的边上是数字,其他是空白 0 1-8 // 100个数字 从里面随机取走10个 // 初始化 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { map[i][j] = 0; } } // 抽取100个数 99 random地雷 = getRandom(); // 丢入map for (Integer integer : random地雷) { int hang = integer / 10;// 98 int lie = integer % 10; // 所有的地雷用-1代替 map[hang][lie] = -1; } // 为所有的空白地点去设置数值 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (map[i][j] == -1) continue; // 继续下次循环 int sum = 0; // 左上角 if (i != 0 && j != 0) {// 防止下标越界 if (map[i - 1][j - 1] == -1) sum++; } // 上面 if (j != 0) { if (map[i][j - 1] == -1) sum++; } // 右上角 if (j != 0 && i != 9) { if (map[i + 1][j - 1] == -1) sum++; } // 左边 if (i != 0) { if (map[i - 1][j] == -1) sum++; } // 右边 if (i != 9) { if (map[i + 1][j] == -1) sum++; } // 左下角 if (j != 9 && i != 0) { if (map[i - 1][j + 1] == -1) sum++; } if (j != 9) { if (map[i][j + 1] == -1) sum++; } if (j != 9 && i != 9) { if (map[i + 1][j + 1] == -1) sum++; } map[i][j] = sum; } } // 打印看看 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.print(map[i][j] + " "); } System.out.println(); } } private Set<Integer> getRandom() { // 没有重复的 Set<Integer> set = new HashSet<Integer>(); while (set.size() != 10) { int random = (int) (Math.random() * 100); set.add(random); } return set; } // 创建视图 private void initView() { int width = getResources().getDisplayMetrics().widthPixels / 10; LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, width); for (int i = 0; i < 10; i++) { // 每一条的布局 LinearLayout tvs = new LinearLayout(this); tvs.setOrientation(LinearLayout.HORIZONTAL); LinearLayout btns = new LinearLayout(this); btns.setOrientation(LinearLayout.HORIZONTAL); // 添加内层的100个按钮和文本 for (int j = 0; j < 10; j++) { // 底层的TextView TextView tv = new TextView(this); tv.setBackgroundResource(R.drawable.textview_bg); tv.setLayoutParams(params); tv.setGravity(Gravity.CENTER); if (map[i][j] == -1) tv.setText("*"); else if (map[i][j] != 0) tv.setText(map[i][j] + ""); tvs.addView(tv); // 底层的Button Button btn = new Button(this); btn.setBackgroundResource(R.drawable.button); btn.setLayoutParams(params); btn.setTag(i * 10 + j); btn.setOnClickListener(this); btn.setOnLongClickListener(this); buttonList.add(btn); btns.addView(btn); } textviews.addView(tvs); buttons.addView(btns); } } @Override public void onClick(View v) { int id = (Integer) v.getTag(); int hang = id / 10; int lie = id % 10; // 隐藏按钮,显示底下的数据 v.setVisibility(View.INVISIBLE); isOver(hang, lie); // 判断点击的是否是一个数字 if (map[hang][lie] == 0) { // 开始递归 显示周围所有的空白(hang, lie); } if (isWin()) { Toast.makeText(this, "游戏胜利", Toast.LENGTH_SHORT).show(); } } // 显示周围所有的button public void 显示周围所有的空白(int i, int j) { // 检测周围的元素,如果为0 继续调用自身,并且显示 // 不是,就显示button // 从左上角开始 // 左上角 // 先显示自己 buttonList.get(i * 10 + j).setVisibility(View.INVISIBLE); if (i != 0 && j != 0) {// 防止下标越界 if (map[i - 1][j - 1] == 0) { if (判断是否需要递归(i - 1, j - 1)) 显示周围所有的空白(i - 1, j - 1); } else { 隐藏button(i - 1, j - 1); } } // 上面 if (j != 0) { if (map[i][j - 1] == 0) { if (判断是否需要递归(i, j - 1)) 显示周围所有的空白(i, j - 1); } else { 隐藏button(i, j - 1); } } // 右上角 if (j != 0 && i != 9) { if (map[i + 1][j - 1] == 0) { if (判断是否需要递归(i + 1, j - 1)) 显示周围所有的空白(i + 1, j - 1); } else { 隐藏button(i + 1, j - 1); } } // 左边 if (i != 0) { if (map[i - 1][j] == 0) { if (判断是否需要递归(i - 1, j)) 显示周围所有的空白(i - 1, j); } else { 隐藏button(i - 1, j); } } // 右边 if (i != 9) { if (map[i + 1][j] == 0) { if (判断是否需要递归(i + 1, j)) 显示周围所有的空白(i + 1, j); } else { 隐藏button(i + 1, j); } } // 左下角 if (j != 9 && i != 0) { if (map[i - 1][j + 1] == 0) { if (判断是否需要递归(i - 1, j + 1)) 显示周围所有的空白(i - 1, j + 1); } else { 隐藏button(i - 1, j + 1); } } if (j != 9) { if (map[i][j + 1] == 0) { if (判断是否需要递归(i, j + 1)) 显示周围所有的空白(i, j + 1); } else { 隐藏button(i, j + 1); } } if (j != 9 && i != 9) { if (map[i + 1][j + 1] == 0) { if (判断是否需要递归(i + 1, j + 1)) 显示周围所有的空白(i + 1, j + 1); } else { 隐藏button(i + 1, j + 1); } } } private void 隐藏button(int i, int j) { int 位置 = i * 10 + j; buttonList.get(位置).setVisibility(View.INVISIBLE); } boolean 判断是否需要递归(int hang, int lie) { // 判断是否是现实的 int 位置 = hang * 10 + lie; if (buttonList.get(位置).getVisibility() == View.INVISIBLE) return false; else return true; } private boolean isOver(int hang, int lie) { // OVER if (map[hang][lie] == -1) { Toast.makeText(this, "GameOver", Toast.LENGTH_SHORT).show(); for (int i = 0; i < buttonList.size(); i++) { buttonList.get(i).setVisibility(View.INVISIBLE); } return true; } return false; } // 最多10个旗子 List<Integer> 旗子 = new ArrayList<Integer>(); @Override public boolean onLongClick(View v) { // 插旗子 // 1. 有了旗子 就取消 // 2. 没有就插旗 Button btn = (Button) v; int tag = (Integer) v.getTag(); if (旗子.contains(tag)) { // 如果使用drawableTop 对应的java代码的方法 // setCompoundDrawablesWithIntrinsicBounds btn.setText(""); // int ArrayList.remove(int);//下标 旗子.remove((Integer) tag); } else { // 没有插旗就需要插旗,判断数量是否超过了上限 if (旗子.size() != 10) { 旗子.add(tag); btn.setText("∉ " + 旗子.size()); btn.setTextColor(Color.RED); } else { Toast.makeText(this, "没有旗子了", Toast.LENGTH_SHORT).show(); } } // 消耗事件, return true; } // 是否胜利 public boolean isWin() { int sum = 0; for (int i = 0; i < buttonList.size(); i++) { if (buttonList.get(i).getVisibility() == View.INVISIBLE) sum++; } if (sum == 90) return true; return false; } }

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical" > <FrameLayout android:id="@+id/framelayout" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:id="@+id/textviews" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> <LinearLayout android:id="@+id/buttons" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > </LinearLayout> </FrameLayout> </LinearLayout>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-10-03 07:12:25

Android 实现扫雷小游戏实例代码的相关文章

纯JavaScript 实现flappy bird小游戏实例代码_javascript技巧

前言: <flappy bird>是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红.2014年2月,<Flappy Bird>被开发者本人从苹果及谷歌应用商店撤下.2014年8月份正式回归APP STORE,正式加入Flappy迷们期待已久的多人对战模式.游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍. 正文: 接下来就是一步一步来实现它 步骤1:页面布局,这儿就不多说了,页面内容如下:

Android植物大战僵尸小游戏_Android

Android植物大战僵尸小游戏全部内容如下: 相关下载:Android植物大战僵尸小游戏 具体代码如下所示: package com.example.liu.mygame; import com.example.liu.mygame.global.Config; import com.example.liu.mygame.tools.DeviceTools; import com.example.liu.mygame.view.GameView; import android.os.Bundl

Android高仿2048小游戏实现代码_Android

刚开始进入Splash界面: 1.SplashActivity.Java(两秒后进入开始界面,Splash界面的布局只有一个图片,在博客后,会展示给大家看) public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a

Android高仿2048小游戏实现代码

刚开始进入Splash界面: 1.SplashActivity.Java(两秒后进入开始界面,Splash界面的布局只有一个图片,在博客后,会展示给大家看) public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a

Android实现2048小游戏_Android

本文实例介绍了Android实现2048小游戏的相关代码,分享给大家供大家参考,具体内容如下 根据界面,主要实现4*4的格子方块比较麻烦,其他的都挺简单的.总体为实现4*4的格子,自定义GridLayout,并在其中添加触摸监听事件,进行一系列的操作,从而实现游戏的逻辑,最后再添加动画效果即可完成. 下面是设计思路: 一.GameView的设计 首先自定义一个类,继承GridLayout,添加两个构造方法 public class GameView extends GridLayout { //

Android实现2048小游戏

本文实例介绍了Android实现2048小游戏的相关代码,分享给大家供大家参考,具体内容如下 根据界面,主要实现4*4的格子方块比较麻烦,其他的都挺简单的.总体为实现4*4的格子,自定义GridLayout,并在其中添加触摸监听事件,进行一系列的操作,从而实现游戏的逻辑,最后再添加动画效果即可完成. 下面是设计思路: 一.GameView的设计 首先自定义一个类,继承GridLayout,添加两个构造方法 public class GameView extends GridLayout { //

Android 底部导航控件实例代码_Android

一.先给大家展示下最终效果 通过以上可以看到,图一是简单的使用,图二.图三中为结合ViewPager共同使用,而且都可以随ViewPager的滑动渐变色,不同点是图二为选中非选中两张图片,图三的选中非选中是一张图片只是做了颜色变化. 二. 需求 我们希望做可以做成这样的,可以在xml布局中引入控件并绑定数据,在代码中设置监听回调,并且配置使用要非常简单! 三.需求分析 根据我们多年做不明确需求项目的经验,以上需求还算明确.那么我们可以采用在LinearLayout添加子View控件,这个子Vie

Android 动态添加Fragment的实例代码_Android

1.fragment1布局及代码 布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width=&quo

Android自定义控件下拉刷新实例代码_Android

实现效果: 图片素材: --> 首先, 写先下拉刷新时的刷新布局 pull_to_refresh.xml: <resources> <string name="app_name">PullToRefreshTest</string> <string name="pull_to_refresh">下拉可以刷新</string> <string name="release_to_refre