Android游戲之?dāng)?shù)獨(dú)游戲開發(fā)
數(shù)獨(dú)游戲是一種源自18世紀(jì)末的瑞士的游戲,后在美國發(fā)展、并在日本得以發(fā)揚(yáng)光大的數(shù)學(xué)智力拼圖游戲。在每一個小九宮格中,分別填上1至9的數(shù)字,讓整個大九宮格每一列、每一行的數(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); //每一個小格的長寬 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(); //每次填寫一個數(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>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開發(fā)筆記 今天學(xué)到的一些屬性
離開實(shí)驗(yàn)室之前再貼上今天下午自己學(xué)到的一些基礎(chǔ)知識 上午干嘛了呢,忙著數(shù)據(jù)恢復(fù)呢2012-11-11Android編程實(shí)現(xiàn)Home鍵的屏蔽,捕獲與修改方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)Home鍵的屏蔽,捕獲與修改方法,實(shí)例分析了使用onAttachedToWindow捕獲Home鍵的相關(guān)技巧,需要的朋友可以參考下2016-06-06Android實(shí)現(xiàn)獲取簽名及公鑰的方法
這篇文章主要介紹了Android實(shí)現(xiàn)獲取簽名及公鑰的方法,可實(shí)現(xiàn)Android通過包名獲取相關(guān)簽名及公鑰的功能,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10Android 限制顯示小數(shù)點(diǎn)后兩位的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Android 限制顯示小數(shù)點(diǎn)后兩位的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01