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>
6.结果展示:
Android 游戏开发之 数独游戏相关推荐
- 使用Android studio开发一个数独游戏APP 系列第一讲
数独是一种需要进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并且满足每一行.每一列.每一个粗线宫内的数字均含1-9,不能重复.随着各种报刊杂志刊登了数独游戏,也让越 ...
- 使用Android studio开发一个数独游戏APP 系列第二讲
游戏主界面类名称:MainActivity.java,负责显示游戏主操作界面,提供调用其他类的接口. 其中issave变量用于控制是否显示继续游戏按钮,当第一次运行游戏时,不显示该按钮,所以设置一个b ...
- 【邀您参加】Android大讲堂-Android游戏开发之捕鱼游戏
来源:华清远见嵌入式培训中心 ● 揭开Android底层架构的神秘面纱 Android应用开发与底层开发一网打尽! ● 全程免费 网络直播 实时互动 业内专家精辟讲解 项目案例透彻分析 作为目前全球最 ...
- 基于cocos2d-x的快速的游戏开发--回合制游戏
2019独角兽企业重金招聘Python工程师标准>>> #基于cocos2d-x的快速的游戏开发--回合制游戏 开发时间:3天 开发工具:cocos2d-x和cocostudio 开 ...
- 小游戏开发怎么选游戏引擎
前言 小游戏开发怎么选游戏引擎 微信小游戏现在非常的火,当我们下定决心做微信小游戏开发的时候, 面临我们的第一个问题是怎么选一个H5的游戏引擎, 那么今天本尊就来给大家分析一下目前能开发各大平台H5小 ...
- flex 联机游戏开发 - 四国军棋游戏:(三) 核心类
通过前面的练习 flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子 我们已经成功地用不到200行的代码绘制出了一个漂亮的棋盘,现在,我们开始进入游戏的核心类设计阶段.四国军棋的游戏逻辑还是比较复 ...
- flex 联机游戏开发 - 四国军棋游戏:(三) 核心类设计
通过前面的练习 flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子 我们已经成功地用不到200行的代码绘制出了一个漂亮的棋盘,现在,我们开始进入游戏的核心类设计阶段.四国军棋的游戏逻辑还是比较复 ...
- 微信小游戏开发教程-2D游戏原理讲解
微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
最新文章
- [LeetCode]题解(python):150-Evaluate Reverse Polish Notation
- Android ProGuard使用要点!
- 计算机视觉编程——增强现实基础
- HTML 5.2 新特性介绍
- Linux / OpenWRT / 目录功能说明
- 为什么安装了Microsoft .NET Framework 4之后我的电脑网卡启动会变得很慢很慢。。...
- 【渝粤题库】陕西师范大学210001儿童心理学 作业(高起专、高起本)
- crmeb pc端模板下载_PC端人人影视下载速度如何提高
- YUV格式转换RGB(基于opencv)
- python多线程下载_python3 多线程下载
- APP自动化测试系列之Appium环境安装
- 打表找规律-灯泡状态数
- 阿里否认马云辞职;刘强东继续管京东;滴滴开始全程录音 | 极客头条
- 一场暴雨引发的装机日记
- spss常态检验_利用SPSS检验数据是否符合正态分布
- OA办公——SwebUI开源应用解决方案
- 玲听 | 蚂蚁金服布局区块链核心3问
- 小游戏流量变现瓶颈,新增长点是超级App?
- 【黄啊码】PHP配合微信公众号生成推广二维码
- PostgreSQL在Linux和Windows安装和入门基础教程