亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android游戲之?dāng)?shù)獨(dú)游戲開(kāi)發(fā)

 更新時(shí)間:2022年03月24日 12:10:26   作者:哈丨吅  
這篇文章主要為大家詳細(xì)介紹了Android游戲之?dāng)?shù)獨(dú)游戲開(kāi)發(fā)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

 數(shù)獨(dú)游戲是一種源自18世紀(jì)末的瑞士的游戲,后在美國(guó)發(fā)展、并在日本得以發(fā)揚(yáng)光大的數(shù)學(xué)智力拼圖游戲。在每一個(gè)小九宮格中,分別填上1至9的數(shù)字,讓整個(gè)大九宮格每一列、每一行的數(shù)字都不重復(fù)。 數(shù)獨(dú)的玩法邏輯簡(jiǎn)單,數(shù)字排列方式千變?nèi)f化,是鍛煉腦筋的好方法。

本文實(shí)現(xiàn)簡(jiǎn)單的數(shù)獨(dú)游戲,通過(guò)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);
  }
  //方格長(zhǎng)寬
  float width;
  float height;
  //選定的坐標(biāo)
  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);
    //每一個(gè)小格的長(zhǎng)寬
    this.width=w/9f;
    this.height=h/9f*2/3;
  }


  //繪圖函數(shù)
  @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);
      }
    }
    //繪制數(shù)字
    Paint numberPaint =new Paint();
    numberPaint.setColor(Color.BLACK);
    numberPaint.setStyle(Paint.Style.STROKE);
    numberPaint.setTextSize(height*0.75f);
    numberPaint.setTextAlign(Align.CENTER);

    //調(diào)節(jié)文字居中
    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){ //判斷點(diǎn)擊的是否是游戲界面
      int []t=mGame.getUsed(x, y);
      selectX=x;
      selectY=y;
      MyDialog mDialog=new MyDialog(getContext(), t, this); //調(diào)用自定義Dialog
      mDialog.show();
    }
    return super.onTouchEvent(event);
  }
  public void setTitle(int i){
    mGame.setTitle(i,selectX,selectY);
    invalidate(); //每次填寫一個(gè)數(shù) 都要重新進(jìn)行繪制
    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'; //字符轉(zhuǎn)化為整形
      }
  }
  //得到值
  public String getNumber(int x,int y){
    if(numbers[x-1][y-1]==0)
      return "";
    else
      return ""+numbers[x-1][y-1];
  }
  //算出已經(jīng)被用的數(shù)字
  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;
  }
  //設(shè)置選定的數(shù)字
  public void setTitle(int i,int x,int y){
    numbers[x][y]=i;
  }
  //判斷游戲結(jié)束
  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];

  //傳入已經(jīng)使用過(guò)的數(shù)字
  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);
    //設(shè)置標(biāo)題
    setTitle("可選數(shù)字");
    //設(shè)置布局文件
    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(); //取消對(duì)話框
        }
      });
    }
    for(int i=0;i<9;i++)
    {
      if(used[i]!=0)
        keys[used[i]-1].setVisibility(View.INVISIBLE); //將不可使用的數(shù)字對(duì)應(yīng)的Button設(shè)置為隱藏
    }
  }
}

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>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Flutter掃碼識(shí)別二維碼內(nèi)容

    詳解Flutter掃碼識(shí)別二維碼內(nèi)容

    這篇文章主要介紹了Flutter掃碼識(shí)別二維碼內(nèi)容的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Android開(kāi)發(fā)筆記 今天學(xué)到的一些屬性

    Android開(kāi)發(fā)筆記 今天學(xué)到的一些屬性

    離開(kāi)實(shí)驗(yàn)室之前再貼上今天下午自己學(xué)到的一些基礎(chǔ)知識(shí) 上午干嘛了呢,忙著數(shù)據(jù)恢復(fù)呢
    2012-11-11
  • Android模仿微信收藏文件的標(biāo)簽處理功能

    Android模仿微信收藏文件的標(biāo)簽處理功能

    這篇文章主要介紹了android模仿微信收藏文件的標(biāo)簽處理功能的相關(guān)資料,也可以刪除已編輯菜單,需要的朋友可以參考下
    2016-11-11
  • Android編程實(shí)現(xiàn)Home鍵的屏蔽,捕獲與修改方法

    Android編程實(shí)現(xiàn)Home鍵的屏蔽,捕獲與修改方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)Home鍵的屏蔽,捕獲與修改方法,實(shí)例分析了使用onAttachedToWindow捕獲Home鍵的相關(guān)技巧,需要的朋友可以參考下
    2016-06-06
  • Android圖片加載的緩存類

    Android圖片加載的緩存類

    這篇文章主要為大家詳細(xì)介紹了Android圖片加載的緩存類的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Flutter狀態(tài)管理Bloc使用示例詳解

    Flutter狀態(tài)管理Bloc使用示例詳解

    這篇文章主要為大家介紹了Flutter狀態(tài)管理Bloc使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Android自定義UI手勢(shì)密碼終結(jié)版

    Android自定義UI手勢(shì)密碼終結(jié)版

    這篇文章主要為大家詳細(xì)介紹了Android自定義UI手勢(shì)密碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android實(shí)現(xiàn)獲取簽名及公鑰的方法

    Android實(shí)現(xiàn)獲取簽名及公鑰的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)獲取簽名及公鑰的方法,可實(shí)現(xiàn)Android通過(guò)包名獲取相關(guān)簽名及公鑰的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android 限制顯示小數(shù)點(diǎn)后兩位的實(shí)現(xiàn)方法

    Android 限制顯示小數(shù)點(diǎn)后兩位的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇Android 限制顯示小數(shù)點(diǎn)后兩位的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Android事件分發(fā)機(jī)制示例分析

    Android事件分發(fā)機(jī)制示例分析

    在說(shuō)事件分發(fā)之前,我們先想一個(gè)問(wèn)題,在APP中我們點(diǎn)擊一個(gè)View的時(shí)候,事件是如何傳遞到這個(gè)View的呢?其實(shí)這就是我理解的事件分發(fā)機(jī)制。即當(dāng)手指點(diǎn)擊屏幕時(shí),事件傳遞到具體View的過(guò)程
    2022-08-08

最新評(píng)論