Android 实现扫雷小游戏实例代码
程序员文章站
2024-02-23 11:00:22
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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!