赞
踩
【摘要】:
随着时代的发展,现代科技的飞跃,我们的日常娱乐生活变得丰富多彩。而手机游戏被业内人士称为继通信之后的有一座“金矿”,手机休闲娱乐应用将成为PC休闲娱乐之后又一重要业务增长点。本文针对该趋势,从用户需求出发,基于Android对五子棋游戏进行设计和开发。
本文主要阐述以Android studio为开发工具, 基于智能手机Android之上设计一个五子棋游戏。五子棋是一种两人对弈的纯策略型棋类游戏,富含许多哲理,有助于增强思维能力、修生养性。这个项目中设定了人机对战和人人对战两种模式。人机对战实现的是一些简单的算法,实现人机交互。人人对战只是进行了输赢方的判定。
本文技术基于Java语言,采用Android基于寄存器的虚拟机,速度得到很大的提升,Android是全触摸的形式,操作非常简单。通过系统调试工作, 验证其具有良好的操作性和稳定的运行性。
【正文】:
1 绪论
五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。五子棋源于古代的一种黑白棋种之一,其中富含许多的哲理,有助于增强思维能力、修生养性。在这个飞速发展的时代,手机游戏已经成为即PC端之后现代娱乐生活中不可缺少的一部分,近年来,PC端游戏和网页游戏收入占比持续下降。反之,手机游戏行业收入增速回升,收入规模有望进一步扩大。2020年,手机游戏实际销售收入达到2097亿元,占游戏产业销售收入的75.2%,销售收入比重逐年提升。Newzoo在最近发布的《2021移动市场报告》中预计,2021年全球手游市场规模将达到907亿美元,同比增长4.4%,到2024年有望达到1164亿美元。报告显示,2019-2024年之间,手游市场年均复合增长率为11.2%,意味着经历了2020年的快速增长之后,手游市场未来将重回常态,或保持个位数的百分比增长。
人工智能是一门边缘学科,属于自然科学和社会科学的交叉。人工智能就其本质而言,是对人的思维的信息过程的模拟。对于人的思维模拟可以从两条道路进行,一是结构模拟,仿照人脑的结构机制,制造出“类人脑”的机器;二是功能模拟,暂时撇开人脑的内部结构,而从其功能过程进行模拟。现代电子计算机的产生便是对人脑思维功能的模拟,是对人脑思维的信息过程的模拟。五子棋游戏设计不仅仅是一个简单的游戏,其中还融入了人工智能算法,实现人机交互。
Android是基于Linux的移动设备操作系统,中文名为安卓,主要用于智能手机与平板电脑。Android与iOS为智能手机市场的两大操作系统。在中国大陆,Android的市场份额更是遥遥领先,据2016年9月的移动系统调研报告,Android在中国的市场份额为85%,其余份额为iOS。
早期,在Android下开发App主要使用Eclipse和基于Eclipse的ADT。不过Eclipse毕竟是为Java工程而生的开发平台,并非专门用于Android,所以先天性不足难以避免。自2015年之后,谷歌公司便停止了ADT的版本更新,转而重点打造自家的Android Studio。
Android Studio是谷歌公司推出的Android应用开发环境,与基于Eclipse的ADT不同,Android Studio是一个全新的开发环境,拥有更强大的功能和更高效的性能。
使用Android studio比起使用Eclipse开发有如下好处:
更多新功能只能在Android Studio中运用,如自动保存、多渠道打包、整合版本管理、支持预览drawable文件等。
五子棋游戏的使用用户类型有一类:下棋者
本文将针对这类角色来进行用户需求分析。如图2-1
2.2.3 功能需求
功能需求是指规定开发人员必须在产品中实现的软件功能,用户利用这些功能来完成任务,满足业务需求,本章节通过对业务需求和用户需求的分析,详细的描述了游戏具体要需要实现的功能。其中有新游戏、五子棋规则等模块。根据分析将功能需求分为两类:一个用户的功能需求,两个用户的功能需求
实现人机对战,可以决定用户先手还是电脑先手。电脑会智能的选择该在哪出下子,并且会在每次下棋结束后判断哪方获胜,如果获得胜利就结束游戏并且提示用户游戏结束
实现人人对战,可以判断每次该颜色棋子的上下左右是否满足连续五个,是的话提醒相应用户获胜, 如
3.1.1 系统总体架构图
本游戏采用界面和游戏模式分开的、设计。其中界面主要是五子棋下棋的平台,通过手机屏幕展示出来,让用户可以进行对战。游戏模式主要是针对人人对战和人机对战模块的选择和运行。系统的总体功能结构如图 3-1 所示:果获得胜利就结束游戏并且提示用户游戏结束
3.1.2 各模块功能
(1) 游戏界面设计模块
游戏界面设计模块包含了主界面、游戏界面、帮助界面等
(2) 绘制棋盘棋子模块
绘制棋盘棋子模块包含了绘制棋盘功能和绘制棋子功能
(3) 人人对战管理模块
人人对战管理模块包含了人与人下棋落子的实现
(4) 人机对战管理模块
人机对战管理模块包含了人与电脑下棋落子的实现,电脑会根据玩家下棋的位置找到最适合电脑下棋的位置
(5) 输赢判定策略模块
输赢判定策略模板包含了棋子获胜的方法,判断同一种颜色的棋子的各个方向的五子连珠
绘制棋盘棋子模板,主要功能创建一个棋盘的视图,在视图上画棋盘,把棋子修改尺寸根据X,Y坐标画在棋盘上,绘制棋盘棋子模板的流程如图3-2-2所示
人人对战管理模板主要包含判断玩家黑白棋的回合以及判断玩家落子处是否可以下棋,以及提示判断玩家的输赢。人人对战管理模板的流程如图3-2-3所示
4.2.2 绘制棋盘棋子的设计过程
在Android studio开发平台中绘制棋盘棋子时,首先我们先定义一个类ChessView并在类中定义一些成员变量,便于我们后面使用,而且在我们需要显示五子棋的布局文件中引入该自定义View。下一步我们要书写构造函数,并且在构造函数中初始化一些设置。比如初始化画笔以及将棋子图片转为bitmap等,我们在onMeasure()方法中拿到屏幕宽高,然后在onSizeChanged()中获得棋盘的宽度,计算出棋盘的行高。接着根据行高缩放棋子大小,使其显示大小合适,每次调用invalidate()方法就会调用onDraw()方法进行界面绘制,在该方法中先绘制棋盘,然后绘制用户所下的棋子。主要逻辑代码如下:
onMeasure()方法:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);//获取屏幕的宽度
int height = MeasureSpec.getSize(heightMeasureSpec);
int len = width > height ? height : width;
setMeasuredDimension(len , len);
}
onSizeChanged()方法:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
chessPlaneWidth = w;//棋盘的宽度
chessWidth = w * 1.0f / geShu;//棋子的宽度
int len = (int) ((w * 1.0f / geShu) * chessScale);// w * 1.0f / geShu,获取一个棋盘格的边长。 ((w * 1.0f / geShu) * chessScale),棋子的缩放尺寸
wq_bm = Bitmap.createScaledBitmap(wq_bm , len ,len ,true);
bq_bm = Bitmap.createScaledBitmap(bq_bm , len ,len ,true);
}
画棋盘:
private void drawChessPlane(Canvas canvas){
for(int i = 0; i < geShu ; i++)
{
int x0 = (int) (chessWidth / 2);//起点
int x1 = (int) (chessPlaneWidth - chessWidth / 2);//终点
int y = (int) ((0.5 + i ) * chessWidth);
canvas.drawLine(x0,y,x1,y,paint);//画横线
canvas.drawLine(y,x0,y,x1,paint);//画竖线
}
}
画棋子:
private void drawChess(Canvas canvas)
{
for (int i =0;i < whitePoints.size(); i++)
{
Point point = whitePoints.get(i);
canvas.drawBitmap(wq_bm,
(point.x + 1.0f / 2 - chessScale / 2) * chessWidth,
(point.y + 1.0f / 2 - chessScale / 2) * chessWidth,
null);
}
}
在这个游戏设计中人人对战的功能的目的是为了作为实现人机对战的功能的基础。人人对战功能的实现首先把玩家落子的黑白棋的集合在棋盘上把黑白棋子绘画出来后,用循环语句来实现黑白子的回合循环,根据设定的输赢判定策略规则判断输赢,从而实现人人对战的功能。人人对战判断落子处有无棋子以及判断黑白棋回合的主要逻辑代码如下:
if (action == MotionEvent.ACTION_UP){
int x =(int) event.getX();
int y =(int) event.getY();
Point point = new Point((int)(x / chessWidth),(int)(y / chessWidth) );
//判断落子下有无棋子
if (whitePoints.contains(point) || blackPoints.contains(point))
{
return false;
}
//判断黑白棋回合
if (isWhiteRound && isChess)
{
whitePoints.add(point);
}
else
{
blackPoints.add(point);
}
isWhiteRound = !isWhiteRound;
invalidate();
return false;
}
4.2.4 人机对战的设计流程
人机对战这个功能的设计是在人人对战模式已经实现的情况下实现的,只是把人人对战的其中一方换成电脑操作,在每次落子时都调用判断输赢策略的算法来判断出输赢,如果产生出赢的一方则游戏结束,如果还没有产生胜利的一方则游戏继续进行,直到产生输赢为止,或者停止游戏。
//扫描横向的15个行
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 11; j++) {
int k = j;
while (k < j + 5) {
//chessboard[0][0] chessboard[0][1] chessboard[0][2]
//chessboard[0][1] chessboard[0][2] chessboard[0][3]
if (whitePoints.contains(new Point(i, k)))
whiteNum++;
if (blackPoints.contains(new Point(i, k)))
blackNum++;
k++;
}
weight = weight(whiteNum, blackNum);
//为该五元组的每个位置添加分数
for (k = j; k < j + 5; k++) {
weights[i][k] += weight;
}
//置零
whiteNum = 0;//五元组中的黑棋数量
blackNum = 0;//五元组中的白棋数量
weight = 0;//五元组得分临时变量
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。