在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → 数独游戏

数独游戏

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:16.59M
  • 下载次数:39
  • 浏览次数:444
  • 发布时间:2015-11-25
  • 实例类别:Android平台开发
  • 发 布 人:ouy3xx
  • 文件格式:.zip
  • 所需积分:20
 相关标签: 游戏

实例介绍

【实例简介】

自己根据经理的要求和界面独立做的一款游戏,尚未发布,根据Android基础教程的书扩展的一个Android应用,大家可以自己下载下来玩一玩,可以作为毕业论文或者不错的程序当做研究研究!

【实例截图】

【核心代码】


//PuzzleView .java 数独自定义控制界面
package com.youba.sudoku.activity;

import com.youba.sudoku.R;
import com.youba.sudoku.activity.GameActivity;
import com.youba.sudoku.tools.Tools;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class PuzzleView extends View {
private static final String TAG = "Sudoku";
private float width;
private float height;
private int selX;
private int selY;
private final GameActivity game;
private final Rect selRect = new Rect();
private float x;
private float y;
private Paint gameNum;
private Paint foreground;
private Paint selectedNumBackground;

public PuzzleView(Context context) {
super(context);
this.game = (GameActivity) context;
setFocusable(true);
setFocusableInTouchMode(true);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
width = w / 9f;
height = h / 9f;
getRect(selX, selY, selRect);
Log.e(TAG, "width" width "height" height);
super.onSizeChanged(w, h, oldw, oldh);
}

@Override
protected void onDraw(final Canvas canvas) {
// 游戏初始数字背景设置
Paint num_background = new Paint();
num_background.setColor(getResources().getColor(R.color.game_num_color));
// 游戏空白位置设置
Paint zero_background = new Paint();
zero_background.setColor(getResources().getColor(R.color.selected_zero_none));
Rect r = new Rect();
for (int i = 0; i < 9; i ) {
for (int j = 0; j < 9; j ) {
if (this.game.getTileString(i, j).equals("")) {
getRect(i, j, r);
canvas.drawRect(r, zero_background);
} else {
getRect(i, j, r);
canvas.drawRect(r, num_background);
}
}
}
gameNum = new Paint(Paint.ANTI_ALIAS_FLAG);
gameNum.setColor(getResources().getColor(R.color.selected_zero));
gameNum.setStyle(Style.FILL);
gameNum.setFakeBoldText(true);
gameNum.setAntiAlias(true);
gameNum.setTextSize(height * 0.5f);
gameNum.setTextScaleX(width / height);
gameNum.setTextAlign(Paint.Align.CENTER);

foreground = new Paint(Paint.ANTI_ALIAS_FLAG);
foreground.setColor(getResources().getColor(R.color.puzzle_foreground));
foreground.setStyle(Style.FILL);
foreground.setFakeBoldText(true);
foreground.setAntiAlias(true);
foreground.setTextSize(height * 0.5f);
foreground.setTextScaleX(width / height);
foreground.setTextAlign(Paint.Align.CENTER);
FontMetrics fm = foreground.getFontMetrics();
x = width / 2;
y = height / 2 - (fm.ascent fm.descent) / 2;
selectedNumBackground = new Paint(Paint.ANTI_ALIAS_FLAG);
selectedNumBackground.setStyle(Style.FILL);
selectedNumBackground.setColor(getResources().getColor(R.color.options_menu));
obviousNumbers(canvas, r);
// 数字键是否可用,剩余的数字按键
game.setNumButtonFailed();
// 将游戏的数字背景绘制到界面上,三种状态,初始数字,空白,已经填了
if (game.isTouch) {
if (this.game.getTileString(selX, selY).equals("")) {
selectedFont(canvas);
game.GameNumberClickableTrue(true);
} else {
if (game.puzzle[selX selY * 9] == game.puzzleAnswer[selX selY * 9]) {
selectedSameFont(canvas);
game.GameNumberClickableTrue(false);
} else {
selectedFont(canvas);
game.GameNumberClickableTrue(true);
if (mThread == null) {
mThread = new MyThread();
mThread.start();
} else {
mThread.run();
}
if (isWrong) {
game.GameNumberClickableTrue(false);
if (game.isOpenSound) {
game.playNumWrongSound();
}
RectF rectF = new RectF(selX * width, selY * height, (selX 1) * width, (selY 1) * height);
float centerX = rectF.centerX();
float centerY = rectF.centerY();
float left = rectF.left / 2 centerX / 2;
float top = rectF.top / 2 centerY / 2;
float right = rectF.right / 2 centerX / 2;
float bottom = rectF.bottom / 2 centerY / 2;
rectF.set(left, top, right, bottom);
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_error), null, rectF, null);
// ///////////////////////////////////////////////////此处的打叉代码无法适应各个屏幕的手机///////////////////////////////////////////////////////////
// canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),
// R.drawable.ic_error), selX * width width/5, selY *
// height height/5, foreground);
isWrong = false;
}
}
}
}
LineKuang(canvas);
// 是否已经完成游戏
if (game.isShowing) {
game.succeedThisGame();
}
game._numCountOne = 0;
game._numCountTwo = 0;
game._numCountThree = 0;
game._numCountFour = 0;
game._numCountFive = 0;
game._numCountSix = 0;
game._numCountSeven = 0;
game._numCountEight = 0;
game._numCountNine = 0;
}

MyThread mThread;

class MyThread extends Thread {
@Override
public synchronized void run() {
// 子线程中通过handler发送消息给handler接收,由handler去更新TextView的值
try {
Thread.sleep(sleep);
Message msg = new Message();
msg.what = UPDATE;
handler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

int sleep = 0;
boolean isWrong = false;
int UPDATE = 0;//
int UPDATE1 = 1;// 设置打叉效果
int UPDATE2 = 2;// 清楚错误数字
private Handler handler = new Handler() {

@SuppressLint("HandlerLeak")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
UPDATE = 1;
invalidate();
sleep = 50;
break;
case 1:
UPDATE = 2;
isWrong = true;
sleep = 50;
invalidate();
break;
case 2:
UPDATE = 0;
setSelectedZero();
sleep = 0;
invalidate();
break;
default:
break;
}
super.handleMessage(msg);
}
};

/**
* 显示数字
* 
* @param canvas
* @param r
*/
private void obviousNumbers(final Canvas canvas, Rect r) {
for (int i = 0; i < 9; i ) {
for (int j = 0; j < 9; j ) {
// 如果是游戏初始数字,那么显示灰黑色,否则显示橙色
if (this.game.getTileString(i, j).equals(this.game.getGamePuzzleTileString(i, j))) {
// 初始数字设置,背景设置
canvas.drawText(this.game.getGamePuzzleTileString(i, j), i * width x, j * height y, gameNum);
} else {
// 填入的数字
getRect(i, j, r);
canvas.drawRect(r, selectedNumBackground);
canvas.drawText(this.game.getTileString(i, j), i * width x, j * height y, foreground);
}
}
}
}

/**
* 九宫格以及九条边框线
* 
* @param canvas
*/
private void LineKuang(final Canvas canvas) {
// 添加九宫格以及边框边沿线背景
// 边框
Paint puzzle_kuang = new Paint(Paint.DITHER_FLAG);// 创建一个画笔
puzzle_kuang.setStyle(Style.FILL_AND_STROKE);// 设置非填充
puzzle_kuang.setStrokeWidth(1);// 笔宽1像素
puzzle_kuang.setColor(getResources().getColor(R.color.puzzle_nine));// 设置为红笔
puzzle_kuang.setAntiAlias(true);// 锯齿不显示
// 三横线
Paint puzzle_three = new Paint(Paint.DITHER_FLAG);// 创建一个画笔
puzzle_three.setStyle(Style.FILL_AND_STROKE);// 设置非填充
puzzle_three.setStrokeWidth(1);// 笔宽1像素
puzzle_three.setColor(getResources().getColor(R.color.puzzle_three));// 设置为红笔
puzzle_three.setAntiAlias(true);// 锯齿不显示
// 九横线
Paint puzzle_nine = new Paint(Paint.DITHER_FLAG);// 创建一个画笔
puzzle_nine.setStyle(Style.FILL_AND_STROKE);// 设置非填充
puzzle_nine.setStrokeWidth(1);// 笔宽1像素
puzzle_nine.setColor(getResources().getColor(R.color.puzzle_nine));// 设置为红笔
puzzle_nine.setAntiAlias(true);// 锯齿不显示
for (int i = 0; i < 10; i ) {
if (i == 0) {
canvas.drawLine(0, i * height, getWidth(), i * height, puzzle_kuang);
canvas.drawLine(i * width, 0, i * width, getHeight(), puzzle_kuang);
} else if (i == 9) {
canvas.drawLine(0, i * height, getWidth(), i * height, puzzle_kuang);
canvas.drawLine(i * width, 0, i * width, getHeight(), puzzle_kuang);
} else {
if (i % 3 != 0) {
if (i == 4) {
canvas.drawLine(0, i * height, getWidth(), i * height, puzzle_nine);
canvas.drawLine(i * width, 0, i * width, getHeight(), puzzle_nine);
} else {
canvas.drawLine(0, i * height, getWidth(), i * height, puzzle_nine);
canvas.drawLine(i * width, 0, i * width, getHeight(), puzzle_nine);
}
}
}
}
for (int i = 0; i < 10; i ) {
if (i % 3 == 0) {
if (i == 0 || i == 9)
continue;
canvas.drawLine(0, i * height, getWidth(), i * height, puzzle_three);
canvas.drawLine(i * width, 0, i * width, getHeight(), puzzle_three);
}
}
}

/**
* 修改单元格中的数字,算法要改变,只有唯一数才正确
* 
* @param tile
*/
public void setSelectedTile(int tile) {
game.setTile(selX, selY, tile);
if (game.puzzle[selX selY * 9] == game.puzzleAnswer[selX selY * 9]) {
if (game.isOpenSound) {
game.playDingSound();
}
}
invalidate();
}

/**
* 擦除单元格中的数字
* 
*/
public void setSelectedZero() {
game.setTile(selX, selY, 0);
invalidate();
}

/**
* 设置空白位置白色背景
* 
* @param canvas
*/
private void setZeroNumWhiteBackground(Canvas canvas) {
canvas.drawRect(selRect, selectedNumBackground);
}

/**
* 设置蓝色空心边框
* 
* @param canvas
*/
// private void setZeroNumBlueFrame(Canvas canvas) {
// Paint mPaint = new Paint();
// mPaint.setStyle(Paint.Style.STROKE);
// mPaint.setStrokeWidth(2);
// mPaint.setColor(getResources().getColor(R.color.selected_zero_kuang));
// canvas.drawRect(selRect, mPaint);
// }
private void setZeroNumBlueFrame(Canvas canvas) {
Paint mPaint = new Paint();
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setColor(getResources().getColor(R.color.selected_zero_kuang));
canvas.drawRect(selRect, mPaint);
getRect2(selX, selY, selRect);
setZeroNumWhiteBackground(canvas);
}

/**
* 设置界面为点击空白状态
* 
* @param canvas
*/
private void selectedFont(Canvas canvas) {
Log.d(TAG, "selRect=" selRect);
Paint selected = new Paint();
selected.setColor(getResources().getColor(R.color.puzzle_zero_others));
for (int i = 0; i < 9; i ) {
for (int j = 0; j < 9; j ) {
if (i == selX || j == selY) {
getRect3(i, j, selRect);
if (!(i == selX && j == selY)) {
canvas.drawRect(selRect, selected);
} else {
setZeroNumWhiteBackground(canvas);
setZeroNumBlueFrame(canvas);
}
} else {
continue;
}
}
}
for (int i = 0; i < 9; i ) {
for (int j = 0; j < 9; j ) {
// 如果是游戏初始数字,那么显示灰黑色,否则显示橙色
if (this.game.getTileString(i, j).equals(this.game.getGamePuzzleTileString(i, j))) {
// 初始数字设置,背景设置
canvas.drawText(this.game.getGamePuzzleTileString(i, j), i * width x, j * height y, gameNum);
} else {
// 填入的数字
canvas.drawText(this.game.getTileString(i, j), i * width x, j * height y, foreground);
}
}
}
}

/**
* 获取rect位置
* 
* @param x
* @param y
* @param rect
*/
private void getRect(int x, int y, Rect rect) {
rect.set((int) (x * width), (int) (y * height), (int) (x * width width), (int) (y * height height));
}

private void getRect2(int x, int y, Rect rect) {
rect.set((int) (x * width) 3, (int) (y * height) 3, (int) (x * width width) - 2, (int) (y * height height) - 2);
}

private void getRect3(int x, int y, Rect rect) {
rect.set((int) (x * width) 1, (int) (y * height) 1, (int) (x * width width), (int) (y * height height));
}

/**
* 设置界面为点击数字状态
* 
* @param canvas
*/
private void selectedSameFont(Canvas canvas) {
Log.d(TAG, "selRect=" selRect);
Paint selectedNum = new Paint();
selectedNum.setColor(getResources().getColor(R.color.puzzle_selected_same_num));
Paint gameNum = new Paint();
gameNum.setColor(getResources().getColor(android.R.color.white));
gameNum.setStyle(Style.FILL);
gameNum.setFakeBoldText(true);
gameNum.setAntiAlias(true);
gameNum.setTextSize(height * 0.5f);
gameNum.setTextScaleX(width / height);
gameNum.setTextAlign(Paint.Align.CENTER);
// 计算相同数字的位置并且都凸显出蓝色
for (int i = 0; i < 9; i ) {
for (int j = 0; j < 9; j ) {
if (game.puzzle[i j * 9] == game.puzzle[selX 9 * selY]) {
// Log.d(TAG, "onTouchEvent: x" i ", y" j);
getRect3(i, j, selRect);
canvas.drawRect(selRect, selectedNum);
canvas.drawText(this.game.getTileString(i, j), i * width x, j * height y, gameNum);
}
}
}
}

/**
* 触摸事件触发
*/
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
game.isTouch = true;
if (event.getAction() != MotionEvent.ACTION_DOWN)
return super.onTouchEvent(event);
if (!game.isSucceed) {
select((int) (event.getX() / width), (int) (event.getY() / height));
game.showKyepadOrError(selX, selY);
Log.d(TAG, "onTouchEvent: x " selX ", y " selY);
invalidate();
return true;
} else {
return false;
}
}

/**
* 键盘输入,重新定位位置,刷新界面,这里可以判定下位置是数字还是空白
* 
* @param x
* @param y
*/
private void select(int x, int y) {
invalidate(selRect);
selX = Math.min(Math.max(x, 0), 8);
selY = Math.min(Math.max(y, 0), 8);
getRect(selX, selY, selRect);
invalidate(selRect);
}

}


标签: 游戏

实例下载地址

数独游戏

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警