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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!