Android 实现扫雷小游戏实例代码
Android实现扫雷小游戏实例
最近学习Android应用编程,抽空做个小应用,大家熟悉的扫雷应用,练手用,
以下是实现代码:
MainActivity类
publicclassMainActivityextendsActivityimplementsOnClickListener,
OnLongClickListener{
//最外层布局
LinearLayouttextviews;
LinearLayoutbuttons;
int[][]map=newint[10][10];
//用来隐藏所有Button
List<Button>buttonList=newArrayList<Button>();
//-1
@Override
protectedvoidonCreate(BundlesavedInstanceState){
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地雷;
privatevoidinitData(){
//10个地雷显示*数组中是-1
//90个雷的边上是数字,其他是空白01-8
//100个数字从里面随机取走10个
//初始化
for(inti=0;i<10;i++){
for(intj=0;j<10;j++){
map[i][j]=0;
}
}
//抽取100个数99
random地雷=getRandom();
//丢入map
for(Integerinteger:random地雷){
inthang=integer/10;//98
intlie=integer%10;
//所有的地雷用-1代替
map[hang][lie]=-1;
}
//为所有的空白地点去设置数值
for(inti=0;i<10;i++){
for(intj=0;j<10;j++){
if(map[i][j]==-1)
continue;//继续下次循环
intsum=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(inti=0;i<10;i++){
for(intj=0;j<10;j++){
System.out.print(map[i][j]+"");
}
System.out.println();
}
}
privateSet<Integer>getRandom(){
//没有重复的
Set<Integer>set=newHashSet<Integer>();
while(set.size()!=10){
intrandom=(int)(Math.random()*100);
set.add(random);
}
returnset;
}
//创建视图
privatevoidinitView(){
intwidth=getResources().getDisplayMetrics().widthPixels/10;
LinearLayout.LayoutParamsparams=newLinearLayout.LayoutParams(width,
width);
for(inti=0;i<10;i++){
//每一条的布局
LinearLayouttvs=newLinearLayout(this);
tvs.setOrientation(LinearLayout.HORIZONTAL);
LinearLayoutbtns=newLinearLayout(this);
btns.setOrientation(LinearLayout.HORIZONTAL);
//添加内层的100个按钮和文本
for(intj=0;j<10;j++){
//底层的TextView
TextViewtv=newTextView(this);
tv.setBackgroundResource(R.drawable.textview_bg);
tv.setLayoutParams(params);
tv.setGravity(Gravity.CENTER);
if(map[i][j]==-1)
tv.setText("*");
elseif(map[i][j]!=0)
tv.setText(map[i][j]+"");
tvs.addView(tv);
//底层的Button
Buttonbtn=newButton(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
publicvoidonClick(Viewv){
intid=(Integer)v.getTag();
inthang=id/10;
intlie=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
publicvoid显示周围所有的空白(inti,intj){
//检测周围的元素,如果为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);
}
}
}
privatevoid隐藏button(inti,intj){
int位置=i*10+j;
buttonList.get(位置).setVisibility(View.INVISIBLE);
}
boolean判断是否需要递归(inthang,intlie){
//判断是否是现实的
int位置=hang*10+lie;
if(buttonList.get(位置).getVisibility()==View.INVISIBLE)
returnfalse;
else
returntrue;
}
privatebooleanisOver(inthang,intlie){
//OVER
if(map[hang][lie]==-1){
Toast.makeText(this,"GameOver",Toast.LENGTH_SHORT).show();
for(inti=0;i<buttonList.size();i++){
buttonList.get(i).setVisibility(View.INVISIBLE);
}
returntrue;
}
returnfalse;
}
//最多10个旗子
List<Integer>旗子=newArrayList<Integer>();
@Override
publicbooleanonLongClick(Viewv){
//插旗子
//1.有了旗子就取消
//2.没有就插旗
Buttonbtn=(Button)v;
inttag=(Integer)v.getTag();
if(旗子.contains(tag)){
//如果使用drawableTop对应的java代码的方法
//setCompoundDrawablesWithIntrinsicBounds
btn.setText("");
//intArrayList.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();
}
}
//消耗事件,
returntrue;
}
//是否胜利
publicbooleanisWin(){
intsum=0;
for(inti=0;i<buttonList.size();i++){
if(buttonList.get(i).getVisibility()==View.INVISIBLE)
sum++;
}
if(sum==90)
returntrue;
returnfalse;
}
}
xml
<LinearLayoutxmlns: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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!