主要可以采用的两种方法如下:
(1)模型方面需要开始搭建,主要搭建的是通信消息的具体内容,具体代码表示为: CreateMsg( Location location) ;
(2)需要达到发送消息的功能实现,其对应的代码是:SendMsg( ) ;
一旦从GPS定位模块中得到新的坐标数据,就意味着这个模块的构建消息的模型方法开始被采用,再将已经得到的GPS数据修改成与此次软件相匹配的所需格式,下一步再从远程服务器中调用出从上一级中获取到的具体的GPS信息数据值。此时后端服务器开始运作,实现存储数据记录的功能,从而达到能为GPS模块供给各种服务的目的,而这些服务中有GPS位置服务,也涉及到地图服务,不仅如此,通信方面也可以提供服务,也可以给WEB 端提供相关服务等。
本章主要是概述了对多平台GPS模块开发的总体设计方案,在windows下只是简单的测试,在linux在是对协议更加深刻的理解,并且学习在linux环境中系统的一个运行过程,第三点是简单的手机app协议解析的过程,所以学习的东西还是很多,本身自己也对这方面的知识面不是特别全面,所以在总体设计方面还是有所欠缺,总的来说,还是需要自己不断的去学习接受新的知识。
图 4.1 主程序流程图
4.1 1602液晶显示模块设计
由于液晶显示器是一个显示相对较慢的器件,所以当接收到相关指令的时候一定要保证模块的忙标志接入的信号属于低电平状态,此时表示的状态是不忙,然后再执行相关的指令才会有效,否则此指令就会失效,其次,在当显示器要显示相关字符的时候要先对系统输入相关字符的地址,也就是说告诉这个模块在哪里实现了这些字符。1602液晶显示模块可与STC89C52直接接口的。
软件流程图如图4.2所示:
图4.2 1602液晶显示模块程序流程图
4.2 传感器模块设计
由于社会经济以及科技的快速发展,我们常见的一些电器,如空调,除湿器等都是我们日常生活中不可或缺的部分,但是这些设备都有一个共同的特点,就是对温度和湿度都有一定的要求。这也推动了温度传感器的市场,使之运用更加的广泛。有需求就会有市场,有市场就会有不断地发展及更新,所以温度传感器也是在不断的完善,比如现在的新一代数字传感器就打破了传统传感器的使用规则,它已经不需要外置的AD转换器,而且它的接口也标准化了,更多的考虑到了用户的感受,因此也得到了群众的喜爱和认可,越来越多的用户用到它。DH11数字温湿传感器是一种新型的传感器,而且它是使用的单总线。它具有显而易见的优点,它在系统使用的设计这一块更加的简单化,很方便的控制其各个模块的运行,相关功能的实现也比较简单。截止今日,市场上用到的比较多的串行总线主要是有三种,I2C总线,SPI总线以及SCI总线。他们的作用是进行微机与外设之间的数据传输。它们进行通信的方式也是各不相同。但是相同的是它们都至少需要两条或两条以上的信号线。
DHT11传感器模块的软件流程图如图4.3所示:
图 4.3 DHT11传感器模块程序流程图
5 系统调试与分析
本章主要介绍了整个五子棋游戏是怎么设计和实现出来的,包括使用的布局文件,判定输赢的算法,还有各种生效,棋盘的设计等等。
本游戏的目的是设计一款任何人都喜爱的休闲五子棋游戏,整个游戏的画面是采用62*35的网格图,它是使用for循环语句定义来绘制整个棋盘,用最简单的一种对变量循环++就行了。其中,对于落子的定义,我定义成两房只要乙方达成了横向,竖向,正斜向,反斜向凑齐五个棋子变判定为赢家。所有对于判定的算法是整个应用程序的重中之重。
第一步是获得整个棋盘的宽度和高度等参数,用于对整个棋盘的初始化:
在游戏开始测试的时候我们最开始就应该做好的屏幕的锁定,然后就是画线。整个棋盘是利用superface进行重绘,大家都知道superface是安卓系统绘制列阵最简单而且最容易操作的一种,在安卓中,我们都是直接在superface进行描绘的。每个window都有属于他自己的一个独立的surperface,每一个简单的surperface都具有一个非常显著的特点就是双缓冲,其中包括一个back buffer和一个front buffer。通常画画的时候都是在back buffer进行实现的,合成的时候就是在front buffer上进行操作的。
代码如下:
在棋盘图像坐标中定义棋盘,在res中如图5.2资源图片文件,资源文件夹res中存放定义调用的图片文件:
图5.2 资源图片文件
我们的判定是在双方玩家落下的最后一颗棋子进行判定,判定对该棋子的坐标进行循环处理,查看在其横向,纵向,斜向是否连续存在相同颜色的棋子,如果有,游戏分出胜负,输赢一定。所以在设计算法的时候一定要考虑到三种方向情况的遍历。
部分如下代码显示:
public class GameView extends View {
Context context = null;//变量
int screenWidth,screenHeight;//宽度、高度
String message = "";//提示轮到哪个玩家
int row,col; //划线的行数和列数
int stepLength = 30;//棋盘每格间距
int[][] chess = null;//0代表没有棋子,1代表是黑棋,2代表白旗
boolean isBlack = true;
public GameView(Context context,intscreenWidth,int screenHeight) {
super(context);
this.context = context;
this.screenWidth = screenWidth;//宽度
this.screenHeight = screenHeight;//高度
this.message = "黑棋先行";
row = (screenHeight-50)/stepLength+1;
col = (screenWidth-10)/stepLength+1;
chess = new int[row][col];
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.WHITE);
canvas.drawRect(0, 0, screenWidth,screenHeight, paint);//画背景
paint.setColor(Color.BLUE);
paint.setTextSize(25);
canvas.drawText(message,(screenWidth-100)/2, 30, paint);//画最顶层的字
paint.setColor(Color.BLACK);
//画棋盘,可更改棋盘大小
for(int i=0;i<row;i++){
canvas.drawLine(10,50+i*stepLength,10+(col-1)*stepLength,50+i*stepLength,paint);
}
for(int i=0;i<col;i++){
canvas.drawLine(10+i*stepLength,50,10+i*stepLength,50+(row-1)*stepLength,paint);
}
for(int r=0;r<row;r++){
for(int c=0;c<col;c++){
if(chess[r][c] == 1){
paint.setColor(Color.BLACK);
paint.setStyle(Style.FILL);
canvas.drawCircle(10+c*stepLength,50+r*stepLength, 10, paint);
}else if(chess[r][c] == 2){
//画白棋
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
canvas.drawCircle(10+c*stepLength,50+r*stepLength, 10, paint);
paint.setColor(Color.BLACK);
paint.setStyle(Style.STROKE);
canvas.drawCircle(10+c*stepLength,50+r*stepLength, 10, paint);
}
}
}
}