package com.haha;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent;
import android.view.View;
public class MyGame extends Activity {
int hard=8;//困难程度
int lvl=0;//当前游戏级别
int selX=0,selY=0;//保存当前选择的对象的坐标
int unitw;//单位长度
MyView myView;//自定义视图
int[][] data=new int[9][9];
int[][] oldData=new int[9][9];
private void setGameTitle(String title){
setTitle("数独[第"+(lvl+1)+"/"+easyData.length+"关]"+title+" -- blog.csdn.net/lijun7788");
}
//初始化游戏
private void initGame(){
if(lvl>easyData.length-1){
msg("您已经通关了!!");
return;
}
String strData=easyData[lvl];
for(int i=0;i<strData.length();i++){
if(Math.random()*10>hard){
data[i%9][i/9]=0;
}
else{
data[i%9][i/9]=Integer.parseInt(""+strData.charAt(i));
}
oldData[i%9][i/9]=data[i%9][i/9];
}
selX=selY=0;
myView.clearFocus();
setGameTitle("");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView=new MyView(this);
setContentView(myView);
initGame();
}
//键盘事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_DOWN: selY++;break;
case KeyEvent.KEYCODE_DPAD_UP: selY--;break;
case KeyEvent.KEYCODE_DPAD_LEFT: selX--;break;
case KeyEvent.KEYCODE_DPAD_RIGHT: selX++;break;
case KeyEvent.KEYCODE_0: setData(0);break;
case KeyEvent.KEYCODE_1: setData(1);break;
case KeyEvent.KEYCODE_2: setData(2);break;
case KeyEvent.KEYCODE_3: setData(3);break;
case KeyEvent.KEYCODE_4: setData(4);break;
case KeyEvent.KEYCODE_5: setData(5);break;
case KeyEvent.KEYCODE_6: setData(6);break;
case KeyEvent.KEYCODE_7: setData(7);break;
case KeyEvent.KEYCODE_8: setData(8);break;
case KeyEvent.KEYCODE_9: setData(9);break;
default:
return super.onKeyDown(keyCode, event);
}
if(selY>8) selY=0;
if(selY<0) selY=8;
if(selX>8) selX=0;
if(selX<0) selX=8;
chkGameOver();
myView.clearFocus();
return true;
}
//检查程序是否结束
private void chkGameOver() {
if(isOver()){
setGameTitle("通过了");
}
else{
setGameTitle("");
}
}
private boolean isOver(){
//判断横向的
for(int i=0;i<9;i++){
for(int j=0;j<9-1;j++){
if(data[i][j]==0) return false;
for(int k=j+1;k<9;k++){
if(data[i][j]==data[i][k])
return false;
}
}
}
//判断纵向的
for(int i=0;i<9;i++){
for(int j=0;j<9-1;j++){
for(int k=j+1;k<9;k++){
if(data[j][i]==data[k][i])
return false;
}
}
}
for(int i=0;i<9;i++){
for(int j=0;j<9-1;j++){
for(int k=j+1;k<9;k++){
if(data[i/3*3+j/3][i%3*3+j%3]==data[i/3*3+k/3][i%3*3+k%3])
return false;
}
}
}
return true;
}
//设置数据
private void setData(int n) {
//原有数据为零的可以清除和放置数据
if(oldData[selX][selY]==0)
data[selX][selY]=n;
}
//自己从MyView派生一个View对象用于绘图
class MyView extends View{
//点击事件
@Override
public boolean onTouchEvent(MotionEvent event) {
//计算点击区域
int n=(int) (event.getX()/unitw);
int m=(int) (event.getY()/unitw);
if(n<9){selX=n;}
if(m<9){selY=m;}
clearFocus();//重绘
return super.onTouchEvent(event);
}
public MyView(Context context) {
super(context);
setFocusable(true);//允许获得焦点
setFocusableInTouchMode(true);
}
//计算单位长度
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
unitw= ((w>h)?h:w)/9;
}
//绘图
@Override
protected void onDraw(Canvas canvas) {
int w=unitw;
super.onDraw(canvas);
//画背景
Paint background= createPaint(Color.parseColor("#E8F2FE"));
canvas.drawRect(0,0,getWidth(),getHeight(),background);
//画水平细
for(int i=0;i<=9;i++){
canvas.drawLine(i*w-1, 0, i*w-1,9*w, createPaint(Color.parseColor((i%3!=0)?"#999999":"#999999")));
canvas.drawLine(i*w, 0, i*w,9*w,
createPaint((i%3!=0)?Color.WHITE:Color.BLACK)
);
}
//画垂直线
for(int i=0;i<=9;i++){
canvas.drawLine(0,i*w-1, 9*w,i*w-1, createPaint(Color.parseColor((i%3!=0)?"#999999":"#999999")));
canvas.drawLine(0,i*w, 9*w,i*w, createPaint((i%3!=0)?Color.WHITE:Color.BLACK));
}
if(selX>-1 && selY>-1){
canvas.drawRect(getRect(),createPaint(Color.parseColor("#0000FF")) );
}
//画数据
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
String dat=""+data[i][j];
if(!dat.equals("0")){
int c=Color.RED;
if(oldData[i][j]==0){
if(i==selX && j==selY)
c=Color.WHITE;
else
c=Color.BLACK;
}
canvas.drawText(dat, i*w+w/3, j*w+w/2+5,createPaint(
c
) );
}
}
}
}
//获取要绘制的矩形范围
private RectF getRect() {
return new RectF(selX*unitw+2, selY*unitw+2, selX*unitw+unitw-4,selY*unitw+unitw-4);
}
//创建一个填充画笔
private Paint createPaint(int color){
Paint p=new Paint();
p.setColor(color);
return p;
}
}
//重来
private void reDo(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
data[i][j]=oldData[i][j];
}
}
selX=selY=0;
myView.clearFocus();
}
//解题
private void showAll(){
String strData=easyData[lvl];
for(int i=0;i<strData.length();i++){
data[i%9][i/9]=Integer.parseInt(""+strData.charAt(i));
}
myView.clearFocus();
}
//对话框
private void msg(String msg){
new AlertDialog.Builder(this).setTitle("数独[hahaman李君出品]").setMessage(msg).show();
}
//难易程度
private void selHard(){
new AlertDialog.Builder(this).setTitle("数独[hahaman李君出品]").setItems(new String[]{"简单","中等","困难"},new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int n) {
if(n==0) hard=7;
if(n==1) hard=6;
if(n==2) hard=5;
lvl=0;
initGame();
}
}).show();
}
private void closeGame(){
this.finish();
}
OnMenuItemClickListener mitemClick=new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem mItem) {
if(mItem.getTitle().equals("重来")){
reDo();
}
if(mItem.getTitle().equals("解题")){
showAll();
}
if(mItem.getTitle().equals("难易程度")){
selHard();
}
if(mItem.getTitle().equals("退出")){
closeGame();
}
if(mItem.getTitle().equals("重出题")){
initGame();
}
if(mItem.getTitle().equals("下一关")){
if(lvl>easyData.length-1){
msg("已经通关了!");
return true;
}
lvl++;
initGame();
}
return true;
}
};
//创建菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("重出题").setOnMenuItemClickListener(mitemClick);
menu.add("重来").setOnMenuItemClickListener(mitemClick);
menu.add("解题").setOnMenuItemClickListener(mitemClick);;
menu.add("下一关").setOnMenuItemClickListener(mitemClick);;
menu.add("难易程度").setOnMenuItemClickListener(mitemClick);;
menu.add("退出").setOnMenuItemClickListener(mitemClick);
return super.onCreateOptionsMenu(menu);
}
//关卡数据
private final String[] easyData =new String[]{
"427659183153278469986413725842531976571964832369827541618792354294
- 1
- 2
- 3
前往页