Android 小项目练手——扫雷

这两天 闲的没事想起来写一个 小游戏练练手,也为了巩固 基础知识吧 ,这段时间我会定期的 写一些小项目。  今天第一篇: 扫雷——Android 版


第一: 新建项目

  1: 布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


       <LinearLayout
           android:layout_centerInParent="true"
        android:id="@+id/linear_map"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >




    </LinearLayout>


</RelativeLayout>


2 MainActivity

package com.farsight.test0816;


import java.util.Random;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;


public class MainActivity extends Activity {


private LinearLayout linearMap;
private final int wight = 10;
private final int hight = 10;
private int boomNumber = 20;
private Boom[][] map = new Boom[wight][hight];
private ImageView imageView;
private ImageView im; // 内部类中的 imageview
private int ID = 0;
private int imageX;
private int imageY;
private int boomCount = 0;
private int[] countID = new int[] { R.drawable.s1, R.drawable.s2,
R.drawable.s3, R.drawable.s4, R.drawable.s5, R.drawable.s6,
R.drawable.s7, R.drawable.s8, };


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearMap = (LinearLayout) findViewById(R.id.linear_map);

initMap();
initUiMap();
addBoom();
printMap();

}

/**
* 初始化地图
*/
private void initUiMap() {
// 设置 布局属性
LayoutParams lp = new LayoutParams(60, 60);
for (int i = 0; i < hight; i++) {
// 创建 横向 布局
final LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.HORIZONTAL);
for (int j = 0; j < wight; j++) {
imageView = new ImageView(this);
imageView.setImageResource(R.drawable.s);
imageView.setId(ID);
// 把图片加入到布局中 同时把属性作为 imageview 的属性加入
layout.addView(imageView, lp);
map[i][j].setID(ID);
ID++;
// 图片设置监听
imageView.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
im = (ImageView) v;
int id = im.getId();
changeLocation(id);
if (selectBoom(imageX, imageY)) {
im.setImageResource(R.drawable.bomb);
Toast.makeText(MainActivity.this, "完蛋了!!",
Toast.LENGTH_SHORT).show();
} else {
// im.setImageResource(R.drawable.flag);
manyBoom(imageX, imageY);
if (boomCount > 0) { // 当周围雷的个数大于0 时显示雷个数
changeIcon(boomCount);
boomCount = 0;
} else {
showNoBoom();
}


}


}
});
}
// 把布局 加入到xml 中的布局中
linearMap.addView(layout);
}


}


// 初始化二维数组
public void initMap() {
for (int i = 0; i < hight; i++) {
for (int j = 0; j < wight; j++) {
map[i][j] = new Boom();
}
}
}


// 加入地雷
public void addBoom() {
int x;
int y;
Random random = new Random();
for (int i = 1; i <= boomNumber; i++) {
do {
x = random.nextInt(10);
y = random.nextInt(10);
} while (map[y][x].getBoom());
map[x][y].setBoom(true);
}
}


// 查询某个位置是否有雷
public boolean selectBoom(int x, int y) {


if (map[x][y].getBoom()) {
return true;
} else {
return false;
}


}


// 把 ID 转为 x Y值
public void changeLocation(int im) {
switch (im / 10) {
case 0:
imageX = 0;
imageY = im;
break;
case 1:
imageX = 1;
imageY = im % 10;
break;
case 2:
imageX = 2;
imageY = im % 20;
break;
case 3:
imageX = 3;
imageY = im % 30;
break;


case 4:
imageX = 4;
imageY = im % 40;
break;


case 5:
imageX = 5;
imageY = im % 50;
break;


case 6:
imageX = 6;
imageY = im % 60;
break;


case 7:
imageX = 7;
imageY = im % 70;
break;


case 8:
imageX = 8;
imageY = im % 80;
break;


case 9:
imageX = 9;
imageY = im % 90;
break;


case 10:
imageX = hight - 1;
imageY = wight - 1;
break;
}
}


// 打印地图
private void printMap() {
for (Boom[] item : map) {
for (Boom boom : item) {
System.out.print(boom.getBoom() ? 1 : 0);
}
System.out.println();


}
}


// 遍历 某个点 对应周围的地雷数
private int manyBoom(int x, int y) {
for (int i = (x == 0 ? x : x - 1); (x == hight - 1 ? i <= x
: i <= x + 1); i++) { // 横向循环 y坐标在外面
for (int j = (y == 0 ? y : y - 1); (y == wight - 1 ? j <= y
: j <= y + 1); j++) {
if (selectBoom(i, j)) {
boomCount++;
}
}
}

return boomCount;
}


// 显示周围雷的个数
private void changeIcon(int bcount) {
im.setImageResource(countID[bcount - 1]);
}


// 显示没有雷的
private void showNoBoom() {
im.setImageResource(R.drawable.s0);
}


}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值