首页 > 系统 > Android > 正文

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

2019-12-12 04:13:37
字体:
来源:转载
供稿:网友

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>

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表