您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Android怎么開發數獨游戲的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
數獨游戲是一種源自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>
感謝各位的閱讀!關于“Android怎么開發數獨游戲”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。