简单实现Android数独游戏

本文实例为大家分享了Android数独游戏的具体代码,供大家参考,具体内容如下

实现了点击了相关的单元格之后会显示出对话框提示可选数字。

原始的自定义对话框仍旧不能满足我们的要求,原始的自定义对话框只能够生成Bulider对象  然后通过LayoutInflater获取相应的View 对象
(其实就是Layout 布局文件)
其实也是可以的,只是我们不能再次进行一些其他的操作了,比如说我们即使设置了TableLayout但是我们不能够在上面完成任何操作,因为并不允许使用

自定义方法设置相关功能,只能推出一些新颖的自定义显示控件而已了。

至于控件,任何控件都可以复写

并且可以自定义View控件   当然也是可以自定义Button控件的。

具体代码:

package com.example.shudu; 

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView; 

public class ShuduView extends View{ 

 //单元格的宽度和高度
 private float width;
 private float height; 

 private Game game = new Game(); 

 public ShuduView(Context context) {
  super(context);
 } 

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  //计算当前 单元格的宽度和高度
  this.width = w/9f;
  this.height = h/9f;
  super.onSizeChanged(w, h, oldw, oldh);
 } 

 @Override
 protected void onDraw(Canvas canvas) {
  //生成用于绘制当前 背景色的画笔
  Paint backgroundPaint = new Paint(); 

  //设置背景颜色画笔的颜色
  backgroundPaint.setColor(getResources().getColor(R.color.shudu_background)); 

  //绘制背景色 左边界都是0 右边界位置是宽下边界是高 覆盖整个屏幕
  canvas.drawRect(0,0,getWidth(),getHeight(),backgroundPaint); 

  Paint darkPaint = new Paint();
  darkPaint.setColor(getResources().getColor(R.color.shudu_dark)); 

  Paint hilitePaint = new Paint();
  hilitePaint.setColor(getResources().getColor(R.color.shudu_hilite)); 

  Paint lightPaint = new Paint();
  lightPaint.setColor(getResources().getColor(R.color.shudu_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,getHeight(),lightPaint);
   canvas.drawLine(i*width+1,0,i*width+1,getHeight(),hilitePaint);
  } 

  for(int i=0;i<9;i++){
   if(i%3!=0){
    continue;
   }
   canvas.drawLine(0,i*height,getWidth(),i*height, darkPaint);
   canvas.drawLine(0,i*height+1,getWidth(),i*height+1, hilitePaint); 

   canvas.drawLine(i*width,0,i*width,getHeight(),darkPaint);
   canvas.drawLine(i*width+1,0,i*width+1,getHeight(),hilitePaint);
  } 

  //绘制文字
  Paint numberPaint = new Paint();
  numberPaint.setColor(Color.BLACK);
  //设置空心
  numberPaint.setStyle(Paint.Style.STROKE);
  //设置文字大小为0.75 单元格 大小
  numberPaint.setTextSize(height*0.75f);
  //设置文字居中对齐
  numberPaint.setTextAlign(Paint.Align.CENTER); 

  FontMetrics fm =numberPaint.getFontMetrics(); 

  float x = width/2; 

  float y = height/2-(fm.ascent+fm.descent)/2;
  System.out.println(y);
  //x默认是‘3'这个字符的左边在屏幕的位置,如果设置了
  //paint.setTextAlign(Paint.Align.CENTER);
  //那就是字符的中心,y是指定这个字符baseline在屏幕上的位置 

  for(int i=0;i<9;i++)
   for(int j=0;j<9;j++){
    //将getLocaString方法声明成public是有必要的 0 是空字符串 所以不显示的
    canvas.drawText(game.getLocaString(i,j),i*width+x,j*height+y, numberPaint);
   } 

  super.onDraw(canvas);
 } 

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if(event.getAction() !=MotionEvent.ACTION_DOWN ){
   return super.onTouchEvent(event);//其实return true;也是一样的
  }
  //返回值是float类型的
  int selectX = (int)(event.getX()/width);
  int selectY = (int)(event.getY()/height); 

  int used[] = game.getUsedNums(selectX, selectY);
  for(int i=0;i<used.length;i++){
   //byte int 都是length
   System.out.println(used[i]);
  } 

  StringBuffer sb = new StringBuffer();
  for(int i=0;i<used.length;i++){
   sb.append(used[i]);
  } 

  KeyDialog keyDialog = new KeyDialog(this.getContext(),used);
  keyDialog.show();
  //生成一个LayoutInflater对象
  //LayoutInflater layoutInflater = LayoutInflater.from(ShuduView.this); 这样写还是不行的
  //LayoutInflater layoutInflater = LayoutInflater.from(this.getContext());
  //使用LayoutInflater 对象根据一个布局文件 生成一个布局文件
  //View layoutView = layoutInflater.inflate(R.layout.dialog,null);
  //从生成好的layoutView当中,取出相应的控件
  //TextView textView = (TextView)layoutView.findViewById(R.id.usedTextId);
  //设置textView的内容为已经使用的内容为哪些
  //textView.setText(sb.toString());
  //生成一个对话框当的Builder对象
  //AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());
  //设置对话框所显示的内容
  //builder.setView(layoutView);
  //生成对话框对象,并将其显示出来
  //AlertDialog dialog = builder.create();
  //dialog.show(); 

  //return super.onTouchEvent(event);
  return true;//用于设置回调函数一直处于等待调用状态
 } 

}

新增加的类

package com.example.shudu; 

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View; 

//该类用于实现Dialog,实现自定义的对话框功能 这样的非Activity 其实就是一个组件 都是
//都是需要Context的参数的 在运用的时候用来表明 是哪一个应用程序调用了他
public class KeyDialog extends Dialog{
 //用来存放代表对话框中的按钮对象
 private final View keys[] = new View[9];// Button能够这样使用 他的父类自然也能够
 private final int used[]; 

 //Context 是必须的 第二个参数int[] used保存着当前单元格已经使用过的数字
 public KeyDialog(Context context,int[] used) {
  super(context);
  this.used = used;
 } 

 //当一个Dialog第一次显示的时候,会调用其onCreate方法
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  //设置对话框的标题
   setTitle("KeyDialog");
   //设置布局文件
   setContentView(R.layout.keypad);
   //设置出九个按钮
   findViews();
   for(int i=0;i<used.length;i++){
    if(used[i]!=0){
     System.out.println(used[i]);
     //利用View的成员变量和View的方法setVisibility使按钮不可见。
     keys[used[i]-1].setVisibility(View.INVISIBLE);
    }
   }
 } 

 private void findViews(){
  keys[0] = findViewById(R.id.keypad_1);
  keys[1] = findViewById(R.id.keypad_2);
  keys[2] = findViewById(R.id.keypad_3);
  keys[3] = findViewById(R.id.keypad_4);
  keys[4] = findViewById(R.id.keypad_5);
  keys[5] = findViewById(R.id.keypad_6);
  keys[6] = findViewById(R.id.keypad_7);
  keys[7] = findViewById(R.id.keypad_8);
  keys[8] = findViewById(R.id.keypad_9);
 } 

}

TableLayout

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
  >
  <TableRow> 

  <Button
  android:id="@+id/keypad_1"
  android:text="1"
  >
  </Button>  

  <Button
  android:id="@+id/keypad_2"
  android:text="2"
  >
  </Button> 

  <Button
  android:id="@+id/keypad_3"
  android:text="3"
  >
  </Button>
  </TableRow> 

  <TableRow> 

  <Button
  android:id="@+id/keypad_4"
  android:text="4"
  >
  </Button>  

  <Button
  android:id="@+id/keypad_5"
  android:text="5"
  >
  </Button> 

  <Button
  android:id="@+id/keypad_6"
  android:text="6"
  >
  </Button>
  </TableRow> 

  <TableRow> 

  <Button
  android:id="@+id/keypad_7"
  android:text="7"
  >
  </Button>  

  <Button
  android:id="@+id/keypad_8"
  android:text="8"
  >
  </Button> 

  <Button
  android:id="@+id/keypad_9"
  android:text="9"
  >
  </Button>
  </TableRow> 

</TableLayout> 

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

您可能感兴趣的文章:

  • Android下SDL2实现五子棋游戏
  • Android五子棋游戏程序完整实例分析
  • Android 实现扫雷小游戏实例代码
  • Android实现微信摇骰子游戏
  • Android实现疯狂连连看游戏之开发游戏界面(二)
  • Android实现疯狂连连看游戏之状态数据模型(三)
  • Android实现疯狂连连看游戏之游戏效果预览(一)
  • Android实现疯狂连连看游戏之实现游戏逻辑(五)
  • android自定义view实现推箱子小游戏
  • Android利用ViewDragHelper轻松实现拼图游戏的示例
  • Android开发实现的简单五子棋游戏示例
(0)

相关推荐

  • Android下SDL2实现五子棋游戏

    本文实例介绍了Android下用SDL2实现一个简单的五子棋游戏,分享给大家供大家参考,具体内容如下 1. Five.c // Five.c // SDL2 五子棋 // gcc -mwindows -o Five Five.c FiveData.c FiveData.h -lSDL2 -lSDL2main -lSDL2_image -lSDL2_ttf //#define _DEBUG_ #include <stdio.h> #include <string.h> #includ

  • Android实现微信摇骰子游戏

    过年怎么可以不玩红包娱乐一下呢,微信里的摇骰子大小和石头剪刀布就是不错的游戏方式. 使用Java的Random函数很容易实现,以骰子为例: 1.骰子摇动的动画,使用animation-list帧动画实现 2.生成1~6的随机数,1 + new Random().nextInt(6) 以下是代码实现,文末提供图片资源下载: package com.zms.dicedemo; import java.util.Random; import android.app.Activity; import a

  • Android五子棋游戏程序完整实例分析

    最近学习了五子棋的课程,感觉挺不错.然后自己写了个关于五子棋的android程序,从中还是能够学习到很多东西的.现在我们开始今天五子棋程序的编写历程.程序的源码请参见友情链接: 好了,我们现在开始一步步的构建出项目来,首先是如下的项目结构图: 运行的效果图: 一些前期做准备的代码 1. 主活动类MainActivity,在菜单中加入了再来一局的功能: public class MainActivity extends AppCompatActivity { private ChessBoardV

  • Android 实现扫雷小游戏实例代码

    Android 实现扫雷小游戏实例 最近学习Android 应用编程,抽空做个小应用,大家熟悉的扫雷应用,练手用, 以下是实现代码: MainActivity 类 public class MainActivity extends Activity implements OnClickListener, OnLongClickListener { // 最外层布局 LinearLayout textviews; LinearLayout buttons; int[][] map = new in

  • android自定义view实现推箱子小游戏

    本文实例为大家分享了android推箱子游戏的具体实现代码,供大家参考,具体内容如下 自定义view: package com.jisai.materialdesigndemo.tuixiangzhi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import androi

  • Android利用ViewDragHelper轻松实现拼图游戏的示例

    前言 最近一段时间看了一些介绍ViewDragHelper的博客,感觉这是一个处理手势滑动的神奇,看完以后就想做点东西练练手,于是就做了这个Android拼图小游戏. 先上个效果图 源码 https://github.com/kevin-mob/Puzzle ViewDragHelper 其实ViewDragHelper并不是第一个用于分析手势处理的类,gesturedetector也是,但是在和拖动相关的手势分析方面gesturedetector只能说是勉为其难. 关于ViewDragHelp

  • Android实现疯狂连连看游戏之状态数据模型(三)

    对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游戏逻辑的重要步骤. 1.定义数据模型 连连看的界面是一个NxM的"网格",每个网格上显示一张图片.而这个网格只需要一个二维数组来定义即可,而每个网格上所显示的图片,对于底层数据模型来说,不同的图片对于着不同的数值即可. 对于上图所示的数据模型,只要让数值为0的网格上不绘制图片,其他数值的网

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

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

  • Android实现疯狂连连看游戏之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的初始化设置信息. GameService:负责游戏的逻辑实现. 其中GameConf的代码如下:cn\oyp\link\utils\GameConf.java package cn.oyp.link.utils; import android.content.Context; /** * 保存游戏配置的对象

  • Android开发实现的简单五子棋游戏示例

    本文实例讲述了Android开发实现的简单五子棋游戏.分享给大家供大家参考,具体如下: 我刚刚在Android上写的一个五子棋的小程序,在这里跟大家分享一下. 写完以后感觉Android的SDK,虽然也是使用Java的,但是跟Java ME还是有很大不一样. 首先就是Android的SDK没有实现所有的Java ME标准,原来运行在KJava上的应用程序是不能在Android上直接跑的. 另外就是Android的SDK有大量的API是Android自己的,需要开发人员去了解. Android的开

  • Android实现疯狂连连看游戏之游戏效果预览(一)

    今天看完了李刚老师的<疯狂Android讲义>一书中的第18章<疯狂连连看>,从而学会了如何编写一个简单的Android疯狂连连看游戏. 开发这个流行的小游戏,难度适中,而且能充分激发学习热情,适合Android初学者来说是一个不错的选择.对于该游戏的开发,需要重点掌握单机游戏的界面分析和数据建模能力:游戏玩家严重看到的是游戏界面,但是在开发者眼中看到的应该是数据模型.除此之外,单机游戏通常需要一个比较美观的界面,需要通过自定义View来实现游戏主界面. 开发连连看游戏除了需要理解

随机推荐