国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android游戲之數獨游戲開發

2019-10-22 18:19:58
字體:
來源:轉載
供稿:網友

 數獨游戲是一種源自18世紀末的瑞士的游戲,后在美國發展、并在日本得以發揚光大的數學智力拼圖游戲。在每一個小九宮格中,分別填上1至9的數字,讓整個大九宮格每一列、每一行的數字都不重復。 數獨的玩法邏輯簡單,數字排列方式千變萬化,是鍛煉腦筋的好方法。

本文實現簡單的數獨游戲,通過mars的視頻教程完成編程
1.自定義View:

package com.example.administrator.shudugame;/** * Created by Administrator on 2016/9/19. */import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Align;import android.graphics.Paint.FontMetrics;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class MyView extends View{  public MyView(Context context, AttributeSet attrs) {    super(context, attrs);  }  //方格長寬  float width;  float height;  //選定的坐標  int selectX;  int selectY;  MyGame mGame=new MyGame();  //獲得屏幕尺寸  @Override  protected void onSizeChanged(int w, int h, int oldw, int oldh) {    super.onSizeChanged(w, h, oldw, oldh);    //每一個小格的長寬    this.width=w/9f;    this.height=h/9f*2/3;  }  //繪圖函數  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    //畫背景    Paint bgPaint=new Paint();    bgPaint.setColor(getResources().getColor(R.color.bg));    canvas.drawRect(0,0,getWidth(),getHeight()*2/3f, bgPaint);    //線條畫筆    Paint darkPaint =new Paint();    darkPaint.setColor(getResources().getColor(R.color.dark));    Paint hilitePaint =new Paint();    hilitePaint.setColor(getResources().getColor(R.color.hilite));    Paint lightPaint =new Paint();    lightPaint.setColor(getResources().getColor(R.color.light));    //繪制線條    for(int i=0;i<9;i++){      canvas.drawLine(0, i*height,getWidth(),i*height,lightPaint);      canvas.drawLine(0, i*height+1,getWidth(),i*height+1,hilitePaint);      canvas.drawLine(i*width, 0,i*width,getWidth()+width*0.4f,lightPaint);      canvas.drawLine(i*width+1,0,i*width+1,getWidth()+width*0.4f,hilitePaint);      if(i%3==0){        canvas.drawLine(0, i*height,getWidth(),i*height,darkPaint);        canvas.drawLine(0, i*height+3,getWidth(),i*height+3,hilitePaint);        canvas.drawLine(i*width, 0,i*width,getWidth()+width*0.4f,darkPaint);        canvas.drawLine(i*width+3, 0,i*width+3,getWidth()+width*0.4f,hilitePaint);      }    }    //繪制數字    Paint numberPaint =new Paint();    numberPaint.setColor(Color.BLACK);    numberPaint.setStyle(Paint.Style.STROKE);    numberPaint.setTextSize(height*0.75f);    numberPaint.setTextAlign(Align.CENTER);    //調節文字居中    FontMetrics fMetrics=numberPaint.getFontMetrics();    float x=width/2;    float y=height/2-(fMetrics.ascent+fMetrics.descent)/2;    for(int i=0;i<9;i++)    {      for(int j=0;j<9;j++)      {        canvas.drawText(mGame.getNumber(i+1, j+1), i*width+x, y+j*height, numberPaint);      }    }  }  //觸摸事件  @Override  public boolean onTouchEvent(MotionEvent event) {    int x=(int)(event.getX()/width);    int y=(int)(event.getY()/height);    if(x<=8 && y<=8){ //判斷點擊的是否是游戲界面      int []t=mGame.getUsed(x, y);      selectX=x;      selectY=y;      MyDialog mDialog=new MyDialog(getContext(), t, this); //調用自定義Dialog      mDialog.show();    }    return super.onTouchEvent(event);  }  public void setTitle(int i){    mGame.setTitle(i,selectX,selectY);    invalidate(); //每次填寫一個數 都要重新進行繪制    mGame.youWin();  }}

2.新建MyGame類:

package com.example.administrator.shudugame;import android.content.Context;import android.content.DialogInterface;import android.support.v7.app.AlertDialog;/** * Created by Administrator on 2016/9/19. */public class MyGame {  Context context;  String data="008309100" +      "900060004" +      "007504800" +      "036000540" +      "001000600" +      "042000970" +      "005907300" +      "600010008" +      "004608200";  int numbers[][] =new int[9][9];  public MyGame(){    //初始化data    for(int i=0;i<9;i++)      for(int j=0;j<9;j++)      {        numbers[i][j]=data.charAt(i+j*9)-'0'; //字符轉化為整形      }  }  //得到值  public String getNumber(int x,int y){    if(numbers[x-1][y-1]==0)      return "";    else      return ""+numbers[x-1][y-1];  }  //算出已經被用的數字  public int[] getUsed(int x,int y){    int c[]=new int[9];    //x列    for(int i=0;i<9;i++)    {      if(numbers[x][i]!=0)      {        c[numbers[x][i]-1]=numbers[x][i];      }    }    //y排    for(int i=0;i<9;i++)    {      if(numbers[i][y]!=0)      {        c[numbers[i][y]-1]=numbers[i][y];      }    }    //小九宮格    x=(x/3)*3;    y=(y/3)*3;    for(int i=0;i<9;i++)    {      if(numbers[x+i%3][y+i/3]!=0)      {        c[numbers[x+i%3][y+i/3]-1]=numbers[x+i%3][y+i/3];      }    }    return c;  }  //設置選定的數字  public void setTitle(int i,int x,int y){    numbers[x][y]=i;  }  //判斷游戲結束  public void youWin(){    int t=0;    for (int i=0;i<9;i++){      for (int j=0;j<9;j++){        if (numbers[i][j]!=0){           t++;        }      }    }    if (t==81){      AlertDialog.Builder builder=new AlertDialog.Builder(context);      builder.setTitle("Tips")          .setMessage("You Win !")          .setPositiveButton("Restart", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {            }          })          .setNegativeButton("Exit", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {              System.exit(0);            }          }).show();    }  }}

3.自定義Dialog類:

package com.example.administrator.shudugame;/** * Created by Administrator on 2016/9/19. */import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.view.View;public class MyDialog extends Dialog{  MyView mView;  View keys[]=new View[9];  int []used=new int[9];  //傳入已經使用過的數字  public MyDialog(Context context, int[] useed, MyView m) {    super(context);    this.mView=m;    this.used=useed;  }  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    //設置標題    setTitle("可選數字");    //設置布局文件    setContentView(R.layout.table);    int id[]=new int[]{R.id.bt1,R.id.bt2,R.id.bt3,R.id.bt4,        R.id.bt5,R.id.bt6,R.id.bt7,R.id.bt8,R.id.bt9};    for(int i=0;i<9;i++)    {      final int t=i+1;      keys[i]=findViewById(id[i]);      keys[i].setOnClickListener(new View.OnClickListener() {        public void onClick(View v) {          mView.setTitle(t);          dismiss(); //取消對話框        }      });    }    for(int i=0;i<9;i++)    {      if(used[i]!=0)        keys[used[i]-1].setVisibility(View.INVISIBLE); //將不可使用的數字對應的Button設置為隱藏    }  }}

4.在MainActivity中,在onCreate()方法: 更改:setContentView(R.layout.activity_main); 為 setContentView(new MyView(this,attrs));

5.新建table.xml:

<?xml version="1.0" encoding="utf-8"?><TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:stretchColumns="*" >  <TableRow    android:id="@+id/row1"    android:layout_width="wrap_content"    android:layout_height="wrap_content" >    <Button      android:id="@+id/bt1"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="1" />    <Button      android:id="@+id/bt2"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="2" />    <Button      android:id="@+id/bt3"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="3" />  </TableRow>  <TableRow    android:id="@+id/row2"    android:layout_width="wrap_content"    android:layout_height="wrap_content" >    <Button      android:id="@+id/bt4"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="4" />    <Button      android:id="@+id/bt5"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="5" />    <Button      android:id="@+id/bt6"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="6" />  </TableRow>  <TableRow    android:id="@+id/row3"    android:layout_width="wrap_content"    android:layout_height="wrap_content" >    <Button      android:id="@+id/bt7"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="7" />    <Button      android:id="@+id/bt8"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="8" />    <Button      android:id="@+id/bt9"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="9" />  </TableRow></TableLayout>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丹凤县| 平利县| 敦煌市| 宁化县| 贵港市| 突泉县| 甘肃省| 清镇市| 辽中县| 内黄县| 宿松县| 长葛市| 琼海市| 惠东县| 夏邑县| 新密市| 杨浦区| 克拉玛依市| 邢台县| 师宗县| 旌德县| 芮城县| 大庆市| 南汇区| 蓬莱市| 桐庐县| 南丹县| 格尔木市| 龙井市| 凤冈县| 太仓市| 财经| 延长县| 西宁市| 丹巴县| 张家港市| 读书| 延安市| 祥云县| 固原市| 阿合奇县|