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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 简单实现Android数独游戏

    本文实例为大家分享了Android数独游戏的具体代码,供大家参考,具体内容如下 实现了点击了相关的单元格之后会显示出对话框提示可选数字. 原始的自定义对话框仍旧不能满足我们的要求,原始的自定义对话框只能够生成Bulider对象  然后通过LayoutInflater获取相应的View 对象 (其实就是Layout 布局文件) 其实也是可以的,只是我们不能再次进行一些其他的操作了,比如说我们即使设置了TableLayout但是我们不能够在上面完成任何操作,因为并不允许使用 自定义方法设置相关功能,

  • java数独游戏完整版分享

    本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下 自己写的数独游戏,共9关,代码如下: 1.DoShudu类用于产生数独数组 import java.util.Random; public class DoShudu { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[][] cells=newshudu(); //ce

  • 简单实现java数独游戏

    本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下 打算把javaFx需要的组件装好以后直接用javaFx的,但似乎eclipse的版本不对,安装了也不能用... 数独代码是在之前寒假受命写的,学了一个月java的成果,现在看来有些不足但毕竟是第一个程序,就直接放上来,数独终盘的实现直接用了暴力,时间复杂度有点高,懒得改了直接放代码 终盘实现: import java.util.Random; public class SudokuPuzzleGenerator { pri

  • 基于Android实现数独游戏

    本文实例为大家分享了Android实现数独游戏的具体代码,供大家参考,具体内容如下 1.在src中有4个Java类: 其中代码分别是: Game.java: package com.example.test1; import android.R.integer; public class Game { public final String str="360000000004230800000004200" +"070460003820000014500013020"

  • java版数独游戏核心算法(一)

    之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏. 现在将全部代码分享出来和大家学习交流,当然代码中有着各种各样的问题和不足之处,望各位朋友批评指点. 以下是生成数独地图的核心算法,算法不是很好,也是之前参考过网上的一些思想: package hlc.shudu.src; /* * 数独的帮助类,里面提供数据所需的所有算法 */ public class ShuduHelper { //数独地图数组 pr

  • java版数独游戏界面实现(二)

    本文实例为大家分享了java版数独游戏界面实现的具体代码,供大家参考,具体内容如下 实现效果图: 这里写图片描述 主函数用于启动程序: package hlc.shudu.app; import hlc.shudu.src.ShuduHelper; import hlc.shudu.ui.ShuduMainFrame; public class AppStart { public static void main(String[] args) { ShuduMainFrame mainFrame

  • Android自定义View实现数独游戏

    先说一下数独游戏的规则: 1.在整个横坐标和纵坐标的9个格子上只能填土1-9的数字且不重复 2.在当前3*3 的格子上填入1-9数字且不重复 先给大家看效果图 项目思路 1.UI呈现:这个放在 GameView 类里面         显示原始数据         显示当然用户填写的数据         显示用户当前点击的位置         显示候选区数据 2.逻辑处理:这个是放在Matrix类里面的     原始数据:游戏开始的时候就要创建出来的,     当前数据:用户填写上去的实时数据

  • Android应用实践之数独游戏开发

    数独游戏是一种源自18世纪末的瑞士的游戏,后在美国发展.并在日本得以发扬光大的数学智力拼图游戏.拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格.在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列.每一行的数字都不重复. 数独的玩法逻辑简单,数字排列方式千变万化.不少教育者认为数独是锻炼脑筋的好方法,上外语阅读课的时候外教老师就很喜欢带我们玩这个,乐此不疲,老外的教学方式还是很受欢迎的.但是每次玩这个游戏的时候都要发一张数独游戏卡,嫌麻烦,就想着写一个demo放自

  • Android游戏之数独游戏开发

    数独游戏是一种源自18世纪末的瑞士的游戏,后在美国发展.并在日本得以发扬光大的数学智力拼图游戏.在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列.每一行的数字都不重复. 数独的玩法逻辑简单,数字排列方式千变万化,是锻炼脑筋的好方法. 本文实现简单的数独游戏,通过mars的视频教程完成编程 1.自定义View: package com.example.administrator.shudugame; /** * Created by Administrator on 2016/9/1

  • Android实现疯狂连连看游戏之开发游戏界面(二)

    连连看的游戏界面十分简单,大致可以分为两个区域: --游戏主界面区 --控制按钮和数据显示区 1.开发界面布局 本程序使用一个RelativeLayout作为整体的界面布局元素,界面布局上面是一个自定义组件,下面是一个水平排列的LinearLayout. 下面是本程序的布局文件:/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andr

  • android实现数独游戏机器人

    本文实例为大家分享了android实现数独游戏机器人的具体代码,供大家参考,具体内容如下 针对该应用的数独机器人,填答案逻辑未完成,主要原因在于游戏响应触屏事件参数有待调整,简单的使用input tap,界面响应不正常. import sys   posinfo0={(0,0):8,          (2,1):3,(3,1):6,          (1,2):7,(4,2):9,(6,2):2,          (1,3):5,(5,3):7,          (4,4):4,(5,4

  • JQuery开发的数独游戏代码

    用了很多Jquery的插件,支持鼠标滚轮选数字.没有什么高深的技术点.工作原因很长时间没有更新了,具体代码都有些记不清了,欢迎大家来拍砖.截图:演示地址:http://demo.jb51.net/js/jsukudo/index.html下载地址:jsukudo20081110v0.3.0.5.zip 下载列表:http://code.google.com/p/jsukudo/downloads/list 用到的JS文件 文件名 出处 说明 blockUI.js http://malsup.co

  • Android实现疯狂连连看游戏之加载界面图片和实现游戏Activity(四)

    正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法会随机从res/drawable目录中取得N张图片. 下面是res/drawable目录视图: 为了让getPlayImages()方法能随机从res/drawable目录中取得N张图片,具体实现分为以下几步: 通

  • Android植物大战僵尸小游戏

    Android植物大战僵尸小游戏全部内容如下: 相关下载:Android植物大战僵尸小游戏 具体代码如下所示: package com.example.liu.mygame; import com.example.liu.mygame.global.Config; import com.example.liu.mygame.tools.DeviceTools; import com.example.liu.mygame.view.GameView; import android.os.Bundl

随机推荐