数独游戏(日语:数独 すうどく)是一种源自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>
6.结果展示:
                             



												

Android 游戏开发之 数独游戏相关推荐

  1. 使用Android studio开发一个数独游戏APP 系列第一讲

    数独是一种需要进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并且满足每一行.每一列.每一个粗线宫内的数字均含1-9,不能重复.随着各种报刊杂志刊登了数独游戏,也让越 ...

  2. 使用Android studio开发一个数独游戏APP 系列第二讲

    游戏主界面类名称:MainActivity.java,负责显示游戏主操作界面,提供调用其他类的接口. 其中issave变量用于控制是否显示继续游戏按钮,当第一次运行游戏时,不显示该按钮,所以设置一个b ...

  3. 【邀您参加】Android大讲堂-Android游戏开发之捕鱼游戏

    来源:华清远见嵌入式培训中心 ● 揭开Android底层架构的神秘面纱 Android应用开发与底层开发一网打尽! ● 全程免费 网络直播 实时互动 业内专家精辟讲解 项目案例透彻分析 作为目前全球最 ...

  4. 基于cocos2d-x的快速的游戏开发--回合制游戏

    2019独角兽企业重金招聘Python工程师标准>>> #基于cocos2d-x的快速的游戏开发--回合制游戏 开发时间:3天 开发工具:cocos2d-x和cocostudio 开 ...

  5. 小游戏开发怎么选游戏引擎

    前言 小游戏开发怎么选游戏引擎 微信小游戏现在非常的火,当我们下定决心做微信小游戏开发的时候, 面临我们的第一个问题是怎么选一个H5的游戏引擎, 那么今天本尊就来给大家分析一下目前能开发各大平台H5小 ...

  6. flex 联机游戏开发 - 四国军棋游戏:(三) 核心类

    通过前面的练习 flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子 我们已经成功地用不到200行的代码绘制出了一个漂亮的棋盘,现在,我们开始进入游戏的核心类设计阶段.四国军棋的游戏逻辑还是比较复 ...

  7. flex 联机游戏开发 - 四国军棋游戏:(三) 核心类设计

    通过前面的练习 flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子 我们已经成功地用不到200行的代码绘制出了一个漂亮的棋盘,现在,我们开始进入游戏的核心类设计阶段.四国军棋的游戏逻辑还是比较复 ...

  8. 微信小游戏开发教程-2D游戏原理讲解

    微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...

  9. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

最新文章

  1. [LeetCode]题解(python):150-Evaluate Reverse Polish Notation
  2. Android ProGuard使用要点!
  3. 计算机视觉编程——增强现实基础
  4. HTML 5.2 新特性介绍
  5. Linux / OpenWRT / 目录功能说明
  6. 为什么安装了Microsoft .NET Framework 4之后我的电脑网卡启动会变得很慢很慢。。...
  7. 【渝粤题库】陕西师范大学210001儿童心理学 作业(高起专、高起本)
  8. crmeb pc端模板下载_PC端人人影视下载速度如何提高
  9. YUV格式转换RGB(基于opencv)
  10. python多线程下载_python3 多线程下载
  11. APP自动化测试系列之Appium环境安装
  12. 打表找规律-灯泡状态数
  13. 阿里否认马云辞职;刘强东继续管京东;滴滴开始全程录音 | 极客头条
  14. 一场暴雨引发的装机日记
  15. spss常态检验_利用SPSS检验数据是否符合正态分布
  16. OA办公——SwebUI开源应用解决方案
  17. 玲听 | 蚂蚁金服布局区块链核心3问
  18. 小游戏流量变现瓶颈,新增长点是超级App?
  19. 【黄啊码】PHP配合微信公众号生成推广二维码
  20. PostgreSQL在Linux和Windows安装和入门基础教程

热门文章

  1. 多层PCB HDI堆栈
  2. java导出标底文件_投标文件怎样导出XML格式
  3. 第1章第5节:如何使用模板创建风格统一的幻灯片 [PowerPoint精美幻灯片实战教程]
  4. 可爱行销力量大:可爱的冰淇淋勺会让消费者想一直挖、一直挖
  5. laravel配置QQ邮箱发送邮件
  6. PDF文件转图片怎么弄?这个方法值得收藏
  7. 研究生周报(第十六周)
  8. 蓝屏代码0x00000077解决方法
  9. 基于springboot的手机app端支付宝实名认证
  10. 《淘宝店铺经营管理一册通》一一1.7 淘宝店铺经营管理一册通