안드로이드 스도쿠 게임 개발, 논리적 빗

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/Utzw0p0985/article/details/93679295

육분에 대한 기사 읽기


안녕하세요 안녕하십니까, 내 행성에 관심을 환영합니다 [안녕 안드로이드]

 

간단한 작은 사용자 정의보기를 통해 수행 할 수 있습니다 스도쿠, 작은 게임 있지만, 또한 사실, 현기증 이전 리우를 계산, 안드로이드, 게임의 작은 부분이있다 : 그것은 안드로이드가 작은 게임이다 가지고 benpian 것은 우리는 그것을 구현해야 그래서 오늘, 모든 사람에게 미리보기에 모양을 제공 : 

      640? wx_fmt = PNG      

 미리보기에서 총, 우리는 다음과 같은 기능의 일부를 볼 수 있습니다

 

홈으로 1.5 초 지연 후 1. 소개,

2. 위의 게임의 규칙이 게임의 규칙으로 이동하는 홈 버튼을 클릭

위 3.의 집합이 게임 설정으로 이동하기 홈 버튼을 클릭

4. 게임은 타이머 위에있다

중앙 게임 보드는 사용자 정의이며, 숫자는 컬러 풀

제 게임은 1-9 개의 숫자 버튼 아래

7. 다채로운 텍스트 메시지 및 지능형 스위치가 제공된다

 

더 복잡한 프로젝트, 그래서 핵심 아이디어를 따라 설명하려고하기 때문에 몇 가지 일반적인 기능은 물론, 당신은 또한 여기에 몇 가지 다른 기능을 추가 할 수 있습니다, 당신이 그것을 다루는 자신의 어떤 다른 작은 UI는 끝이 기사에 관심이있을 수 있습니다 소스를 다운로드합니다.

 

음, 우리는 텍스트를 시작했다.


A. 그리기 스타일 박스

모든 상자 것을 그들이 9 있었다, 그래서 만약 그것이 우리가 9 화면을 나눈하는 측면을 볼 수 제곱 때문에 사실, 그리기 사각형 작은 사각형, 나는 GameView를 만들어, 비교적 간단하다 의 애스펙트

       640? wx_fmt = PNG된 onDraw의 GameView에서 매우 단순하게 사각형을 그리 onSizeChanged에서 상자의 크기를 계산 한 결과 크로스 drawLine 통해 선을 그릴 수있다

640? wx_fmt = JPEG      

당신이 볼 수있는,이 = 9 MAX_VALUES, 우리는 그래서 사각형을 달성하기 위해, 호출이 루프를 통해 수평 및 수직 선을 그릴 canvasLine 통과


       640? wx_fmt = PNG  

    

for循环中的3是为了加深小九宫格的颜色,调用之后的效果如下:


       640? wx_fmt = PNG      


这样,我们的一个基础棋盘就完成了,那么我们来看下canvasLine里到底做了什么

       640? wx_fmt = JPEG      

正常的写法只要第一个drawLine和第三个即可,我这里在高宽上都+1是为了有一个视觉的加深效果,到这里九宫格就完成了,那么接下来,我们要做的事情是什么呢?那就是绘制绘制数字了


二.绘制数字

绘制数字和绘制九宫格的写法是基本类似的,只是坐标比较难计算,我们来看下绘制数字的代码

       640? wx_fmt = JPEG      

在这段代码中,我们需要关心mGame这个对象和canvasNumberText这个函数

 

Game对象就是我们的数独逻辑计算类,我们所有关于数独计算都会在里面实现,先来看下canvasNumberText函数


       640? wx_fmt = JPEG      

这个函数有必要仔细的说明一下,首先是这个画笔的文本大小,这里我设置了方块高度的0.75f,再结合文字绘制居中效果,那么视觉会舒服很多,各位也可以对此稍微进行修改,然后是FontMetrics,这是绘制文本测量类,关于FontMetrics我建议大家去查阅一下相关的资料,实际上只是对字符以及基准线的一个绘测,我们就是通过基准线的界定来实现绘制文本几种的,并且这里有一个sp的保存,是为了之后设置中是否使用多彩文字,多彩文字的实现很简单,主要是在canvasNumberColor这个函数中,你定义九个颜色就好了


       640? wx_fmt = JPEG      

我们可以先运行一下看看效果

 

       640? wx_fmt = PNG      

当然,我们还有Game类没有讲


三.Game逻辑类

Game类我要仔细的讲解,首先我定义了一个字符

 

//默认显示

private final String mDefData = "3600000000004230800000004200070460003820000014500013020001900000007048300000000045";

 

这个字符一共81个字节,对应的就是九宫格的81个小方块,其中0为未输入,一般的数独游戏都是按照规则随机的,但是我并不是很懂这个规则,所以只能写死了,接着我再定义一个二维数组来建立九宫格查询的索引列表

 

//装载数独

private int sudo[] = new int[9 * 9];

 

所以我们就可以实现如下的三个方法

 

      640? wx_fmt = JPEG      

 这三个方法,首先是parsingStringChat,就是解析默认字符串到我定义的sudo索引数组中,这样我们就可以通过getCardNumber来索引到对应的字符了,这里的算法是 纵列 * 9 + 横列,打个比方,第三行的第六个,那么就是3 * 9 + 6 得出来的下标再去sudo中索引,就可以拿到对应的数字了,而getCardString这个方法只是为了方便文字的绘制,而去将0转换成空的一个方法,到了这里,基本的UI就完成了,我们接下来就要实现它的点击逻辑了


四.点击逻辑

我们的点击逻辑思路很简答, 你点击后这个方块红色包裹,然后输入数字,即可,这里掺杂了一个只能提示的功能,所以变得复杂起来了,我们一步步来,首先,来看下这个触摸事件的代码


       640? wx_fmt = JPEG这段代码比较长,我们一个个来解释一下,首先是过滤事件,如果不是ACTION_DOWN,那么就按照系统事件下发就好了,如果是ACTION_DOWN,那么通过getXY再除以方块的高宽,就可以得到选择的方块的横纵位置了,然后是获取当前方块上的数字,这里我没有用到,继续往下看,绘制一个红色边框,因为有了他的X,Y,所以绘制起来比较简单

 

       640? wx_fmt = PNG      

 

这里是否智能提示,如果打开了智能提示,那么我会将这个方块的已显示的数字数组通过接口传递出去,在主页面做逻辑处理,那么怎么计算已显示的数字数组呢?,这里还需要用到我们的Game对象

 

我定义了一个三维数组

 

//存储每个单元格已经不可用数据 x y data

private int userNo[][][] = new int[9][9][];

 

通过他,我可以传递x,y后获取到他所显示过的数组集合,也就是Game中的parsingAllUserNoNumber函数

       640? wx_fmt = JPEG      

 parsingAllUserNoNumber就是遍历一遍所有的方块,最终的实现还是在parsingUserNoNumber中,我们来看下逻辑,首先定义一个长度为9的数组z,然后通过遍历横纵获取已显示的数字存储在z中,并且我们还需要计算小九宫格也不能有重复的,最终将0去除,得到的就是我们所传递方块的x,y的已显示数组,那么我们智能提示,就需要将这些给去除

 

我们在主页定义了九个按钮,这里我为了方便管理,直接定义了一个数组

 

private Button mView[] = new Button[9];

 

然后进行初始化

      640? wx_fmt = JPEG      

 这里初始化后设置点击事件,我只要点击某一个按钮,就将对应的数字通过setNumberText传递给GameView绘制,并且设置了一遍全部显示,因为有可能因为智能提示导致有些按钮不显示

 

我们回到GameView中关于setNumberText函数

       640? wx_fmt = JPEG      

 

사실, 여기에 체크가 최종 게임 콘텐츠가가요 만 난 그냥 정의 문자가 새로 고침보기를 수정할 수 있습니다 좌표에 해당하는 sudo를 배열 할 필요가 후 최종 호출 게임 오브젝트 refreshSudo, 우리는, 텍스트를 그릴에 직접 갈 필요가 없습니다 것입니다 우리는 refreshSudo을 찾기 위해 계속 버튼의 생각을 이해하고 우리가 텍스트를 입력 할 때마다에 대응하는 논리 게임, 다음 게임이 종료 여부를 다시 확인하지만, 논리는 더 복잡하다, 그러나 나는 실현하기 위해 가지 않았다

       640? wx_fmt = JPEG      

여기 sudo는 업데이트를 살펴이며 다시 계산 숫자의 배열을 표시

 

우리의 기본 논리가 여기에 완료, 사실, 최종 핵심 내용은 그 운송의 논리, 우리는 게임의 코드를 모두 살펴 GameView 비교적 간단 여전히 있지만, GameView 및 게임;


다섯 .Game

       640? wx_fmt = JPEG      

 주로 순환 논리와 사고, 너무 많이, Naogua 닫아는 전화 벨소리, 우리는 최종 미리보기 그것은 지프보고

 

       640? wx_fmt = GIF      

 

글쎄, 우리는 내 지식 행성 안녕 안드로이드에 가입하실 수 있습니다 관심이 [읽기 클릭] 또는 텍스트를 추가

 

안드로이드 개발자 교환 그룹 : 417 046 685 무제한 가입, 오주의를 기울여야

 

행성의 원래 텍스트를 읽거나 QQ 그룹에 가입 할 수있는 소스 코드를 다운로드

 

우리의 다음 안녕!

 



추천

출처blog.csdn.net/Utzw0p0985/article/details/93679295