




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android怎么开发数独游戏
这篇文章给大家分享的是有关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(newMyView(this,attrs));5.新建table.xml:<?xml
version="1.0"
encoding="utf-8"?>
<TableLayout
xmlns:android="/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"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB3709T 038-2025泰山茶 山地低产茶园提升改造技术规程
- 海南九乐再生资源回收与利用有限公司水稳站项目环评报告表
- 项目资金评分表
- 海航技术附件维修事业部海口复材车间新租赁厂房及APU新试车台项目环评报告表
- 店铺硅酸钙板施工方案
- 隔墙板做砖胎膜的施工方案
- 福建省泉州市2025届高中毕业班质量监测 (三)物理试题(含答案)
- 地板砖铺设施工方案
- 2024-2025学年下学期高二语文第三单元A卷
- 数控加工工艺与编程技术基础 教案 模块一 任务2 初识数控加工工艺
- 诈骗案件授课PPT课件
- 基于PLC的电梯控制系统设计
- 口腔科急救预案培训课件
- 弗洛姆异化理论
- 园林喷灌工程施工方案(精编版)
- 碳纳米管_ppt课件
- 【课件】第2课如何鉴赏美术作品课件-高中美术人教版(2019)美术鉴赏
- [康熙字典9画五行属金的字加解释] 康熙字典五行属金的字
- 托盘操作评分表
- 关于老年痴呆症及其智能陪护设备的调查报告
- 椴木灵芝栽培技术
评论
0/150
提交评论