您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Android怎么開發(fā)數(shù)獨(dú)游戲的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
數(shù)獨(dú)游戲是一種源自18世紀(jì)末的瑞士的游戲,后在美國發(fā)展、并在日本得以發(fā)揚(yáng)光大的數(shù)學(xué)智力拼圖游戲。在每一個(gè)小九宮格中,分別填上1至9的數(shù)字,讓整個(gè)大九宮格每一列、每一行的數(shù)字都不重復(fù)。 數(shù)獨(dú)的玩法邏輯簡單,數(shù)字排列方式千變?nèi)f化,是鍛煉腦筋的好方法。
本文實(shí)現(xiàn)簡單的數(shù)獨(dú)游戲,通過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; //選定的坐標(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è)小格的長寬 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)使用過的數(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(); //取消對話框 } }); } for(int i=0;i<9;i++) { if(used[i]!=0) keys[used[i]-1].setVisibility(View.INVISIBLE); //將不可使用的數(shù)字對應(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>
感謝各位的閱讀!關(guān)于“Android怎么開發(fā)數(shù)獨(dú)游戲”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。