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

首頁 > 系統 > Android > 正文

Android游戲之數獨游戲開發

2019-12-12 01:27:44
字體:
來源:轉載
供稿:網友

 數獨游戲是一種源自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>

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天津市| 龙泉市| 吴堡县| 屏东市| 舞阳县| 辽阳市| 绍兴市| 林芝县| 信宜市| 宁南县| 原平市| 德江县| 余江县| 格尔木市| 绥宁县| 江油市| 三原县| 高邑县| 寿阳县| 玉田县| 嘉禾县| 锡林浩特市| 台北县| 屏东县| 西华县| 南部县| 大冶市| 淄博市| 开原市| 隆昌县| 临沧市| 墨竹工卡县| 高雄市| 深圳市| 洛隆县| 新泰市| 拜泉县| 金溪县| 滦南县| 长宁区| 玛曲县|