1、安徽大学本科毕业论文(设计、创作)题目: 基于Android的五子棋游戏设计与实现 学生姓名:刘锋 学号: E01014305 院(系): 计算机科学与技术学院 专业:计算机科学与技术 入学时间: 2010年9 月导师姓名:邹海 职称/学位: 副教授/博士 导师所在单位:安徽大学计算机科学与技术学院 完成时间: 2014 年5 月基于Android的五子棋游戏设计摘 要手机游戏被业内人士称为继短信之后的又一座“金矿”。 从2003年到2010年的市场销售额年均复合增长率为62.4%。可以看出,手机游戏将经历一个黄金发展时期。3G的普及、手机显示性能的提高、手机屏幕的扩大和较高的分辨率,解决了传
2、统手机行业的很多弊端,手机休闲娱乐应用将成为PC休闲娱乐之后又一重要业务增长点。同时Android采用了键盘形式的按键,可以完成更复杂的操作。Android虽然基于Java,但是其虚拟机是基于寄存器的(这与普通的Java基于堆栈不同),速度得到很大的提升,这为Android平台上开发游戏提供了坚强的后盾。本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一个五子棋游戏。五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能力 提高智力,而且富含哲理,有助于修身养性。本系统是本系统中设定了人机对战和人人对战两种模式。人机对战实现的是一些简单的
3、算法,人人对战只是进行了输赢方的判定。它与javame的五子棋设计有许多的不一样,Android本来就是全触摸的形式,而且操作非常简单。关键词:五子棋;Android;人工智能The Five in a Row Game Based on AndroidAbstractMobile games since the industry was called after a text message goldmine again. From 2003 to 2010 annual sales surged 62.4 percent from compound rate for. Can see,mo
4、bile games will experience a golden period of development. 3G phone displays the popularization and performance improvement,the expansion of the phones screen,and a higher resolution,solve the traditional mobile phone industrys many drawbacks, mobile entertainment applications will be after PC enter
5、tainment another important business growth. Meanwhile Android also USES a keyboard forms of buttons that can do more complex operation. Android though,but its based on a Java virtual machine (which is based on the register with the ordinary Java stack-based different),speed,it got a lot of ascension
6、 for the Android platform games provide a strong backing.This paper mainly expounds the object-oriented program development in eclipse for language development tool, smartphone Android based on above design a five in a row game. Gobang originated in China ancient traditional black white kind, it not
7、 only can enhance one of thinking capacity, improve intelligence and high in philosophy, helps to cultivate ones morality raises a gender. This system is the system that set the man-machine against and everyone against two patterns. The realization man-machine against some simple algorithm, everyone
8、 was against just win the judgement of the party. It has with the javame gobang chess design many are dissimilar, Android is the entire touching form originally, moreover operates is simple.Keywords:five-in-a-row;android;artificial intelligence目录1 引言12 概述22.1 背景22.2 课题来源22.3 课题研究现状及应用前景33 Android开发环
9、境33.1 Android开发环境变量配置33.1.1 JDK的配置33.1.2 Android开发插件的安装43.1.3 AVD的创建54 游戏相关技术54.1 游戏布局54.1.1 画盘线54.1.2 双缓冲技术画棋子64.1.3 在触摸处画棋子74.1.4 newPoint方法将座标调整到对应的棋位上74.2 人人对战84.2.1 设置谁走的标记84.2.2 在触摸处下棋子94.2.3 判断轮到谁下棋子94.2.4 玩家一下棋的方法94.2.5 玩家二下棋的方法104.2.6 实现判断输赢的方法114.2.7 提示游戏结束134.3 人机对战145 游戏的实现155.1 游戏主界面155
10、.2 游戏帮助界面165.3 五子棋介绍界面165.4 游戏界面175.5 退出界面176 结论18主要参考文献19致谢20I1 引言随着社会的发展,目前全球的手机用户数量已经超过了PC机的数量,而且手机的数量正在快速增长,其中智能手机所占的比例越来越大,特别是随着3G技术发展时代的到来,移动互联网将是一个巨大的市场,许多国际大公司以及国内的大公司都在抢占智能手机领域的市场份额。这期间,出现的智能手机可谓五花八门,种类繁多,但是真正好用,受用户喜爱的智能手机并不多。当互联网巨头Google宣布依靠 android系统进军手机操作系统领域之后,三年来Android一路高歌,快速的获得众多用户和厂
11、商的认同。随着Android手机终端的逐渐热销,Android也引起众多手机应用程序开发商的关注,Android的出现带给了智能手机领域更多的机遇和挑战,由于Android基于Linux内核且具有开源、免费的特性,它迅速得到广大爱好者以及许多厂商的支持,基于Android所开发的手机游戏拥有巨大潜力已成为行业共识。3G的普及、手机显示性能的提高、手机屏幕的扩大和较高的分辨率,解决了传统手机行业的很多弊端,同时Android也采用了键盘形式的按键,可以完成更复杂的操作。Android虽然基于Java,但是其虚拟机是基于寄存器的(这与普通的Java基于堆栈不同),速度得到很大的提升,这为Andro
12、id平台上开发游戏提供了坚强的后盾。随着移动开发技术的不断升级和终端设备成本的下降,近年来,手机在普通消费人群中得到了极大的普及。凭借其便于携带、沟通迅捷、功能多样、私密性强等独有优势,手机已经成为普通民众不可替代的随身工具。其益智、趣味和休闲的特点迎合了消费者的娱乐需要,手机游戏的开发推广已经成为手机生产商和运营商重要的业务增长点,游戏软件产业价值不断提升。手机游戏是手机的一种高附加值操作软件,游戏编程是手机软件编程的重要组成,同时也持续推动手机软件技术升级进步。中华民族是一个有着几千年悠久历史和璀璨文化的国家,而棋类娱乐却早已突破了纯游戏的范畴而成为中国传统文化的一个分支。五子棋起源于中国
13、古代的传统黑白棋种之一,现代五子棋日文称之为“连珠”,英译为Renju,英文称之为“Gobang”或“FIR”(Five in a Row 的缩写),中文亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。五子棋的棋文化源渊流长,具有东方的神秘和西方的直观,是中西文化的交流点,是古今哲理的结晶。现在人们压力日益增大,需要劳逸结合才能获得更高的工作效率,工作之余的娱乐对每一个人来说都是必不可少的。五子棋这种娱乐方式简单易学又具有深奥的技巧,非常富有趣味性和消遣性。在经过不断发展后,五子棋已经成为棋盘娱乐的一个重要的组成部分,它能够增强思维能力、开发智力,是人们休闲娱乐
14、的不错选择。近来随着计算机和手机的快速发展,各种各样的游戏层出不穷,使得人们能有更多的娱乐项目,而棋类游戏能起到锻炼人的思维和修身养性的作用,而且棋类游戏水平颇高,大有与人脑分庭抗礼之势。现在的五子棋游戏软件基本上可以分为两类:一类是网络五子棋游戏软件,另一类是单机版五子棋游戏软件。很少有手机版的五子棋游戏软件。为了满足手机人群的需求,本文设计了这款手机版的五子棋游戏软件,可以供人们闲暇时间随时随地地进行娱乐,提高自己的五子棋水平,实用性强。2 概述2.1 背景在我们的生活中有许多的游戏,但是游戏不同,它也会给玩家带来不同的感受和生活理念。游戏是我们日常生活的一个必不可少的娱乐项目,也带动了游
15、戏相关产业市场的发展。游戏平台是经过从游戏机到电视游戏,然后从到pc游戏,到手机游戏,中间经历了很多的技术的更新和变革。但随着新技术的发展和我们生活水平质量的提高,手机开始逐渐变为普及,因为手机是非常小巧便捷的,而且方便的特性成为我们日常生活中必备通讯工具。而基于手机平台的游戏也就拥有的市场空间是巨大的,也因随着3g的开通和应用,手机游戏必然会迎来新的一轮游戏热潮!2.2 课题来源现在的移动电话是小型的计算机,它的处理能力与台式机的标准处理能力相比很有限,但是足够运行一个小型的游戏。现在的手机的一个特性就是它们还是网络计算机,能够高速发送和接收数字数据。除了语音数据以外,它们还可以发送和接收其
16、它类型的数据。所以这样的网络游戏也可以在手机上实现。短信类游戏就好像“虚拟宠物”那样。短信游戏是通过玩家和游戏服务商通过短信中的文字的内容来交流,达到进行游戏的目的的一种文字游戏。 由于短信游戏的整个游戏过程都是通过文字来表达,造成短信游戏的娱乐性较差。但是短信游戏却是兼容性最好的手机游戏之一。只要您的手机可以发短信,您就可以畅快的享受短信游戏给您带来的快乐了。图形类游戏更接近我们常说的“电视游戏”,玩家通过动画的形式来发展情节进行游戏。由于游戏采用了更为直观且更为精美的画面直接表现,因此图形类游戏的游戏性和代入感往往较文字类游戏高。因此广受玩家们的欢迎。嵌入式游戏是一种将游戏程序预先固化在手
17、机的芯片中的游戏。由于这种游戏的所有数据都是预先固化在手机芯片中的,因此这种游戏是无法进行任何修改的。也就是说,您不能更换其它游戏的,只能玩您手机中已经存在的娱乐游戏,而且您也不能将它们删除。手机在网络游戏行业在多年的技术经验与运营经验的积累与总结之后,到了2009年迫不及待的需要创新出新的游戏模式和崭新的运营模式来推动手机游戏市场的爆发和发展。其中比较吸引人们的是手机的休闲类的游戏。应该可以说它是与PC网络游戏完全的脱离开了,而且充分发挥了自身的优势手机终端。休闲类的游戏恰巧与之相反,只需要很少的网络流量的网络环境,通过少量多次的游戏形式带给玩家流畅的游戏体验满足玩家瞬间提升的快感,但是同时
18、却很难具有长期的“沉迷”性。本题目是基于Android平台开发的一个小型的程序。其实都差不多,在有JAVA的智能手机上都可以运行。其实手机是我们生活中不可缺少的工具,这些小游戏可以带给我们快乐和放松我们的心情。无论什么样手机,我想买起来的时候上面就有一些它自带的各种小游戏,其中有一个独特的小游戏也是非常重要的。2.3 课题研究现状及前景在我们的生活中有许多的游戏,但是不同的游戏,它也会给玩家带来不同的感受和生活理念。游戏可以说我们日常生活的一个必不可少的娱乐项目,也带动了游戏相关产业市场的发展即游戏周边。游戏平台是经过从游戏机到电视游戏,然后从到pc游戏,到手机游戏,中间经历了很多的技术的更新
19、和变革。但随着新技术的发展和我们生活水平质量的提高,手机开始逐渐变为普及,因为手机是非常小巧便捷的,而且方便的特性成为我们日常生活中必备通讯工具。而基于手机平台的游戏也就拥有的市场空间是巨大的,随着3G的开通和应用,手机游戏必然会迎来新的一轮游戏热潮现在的手机的已经不是以往那种传统意义上的手机了,称之为智能机再合适不过了,它不仅具备打电话发短信等传统功能而且对于计算机可以完成的大部分工作也可以完全胜任。智能手机能够高速发送和接收数字数据,除了语音数据以外,它们还可以发送和接收其它类型的数据,如是图像等。所以网络游戏也是完全可以在手机上实现的。其中比较吸引人们的是手机上休闲类的游戏。应该可以说它
20、是与PC网络游戏完全的脱离开了,而且充分发挥了自身的优势。休闲类的游戏只需要很少的网络流量的网络环境,通过少量多次的游戏形式带给玩家流畅的游戏体验满足玩家瞬间提升的快感,但是同时却很难具有长期的“沉迷”性,可以说是有百利而无一害。本次设计是基于Android平台开发的一个小型的五子棋游戏程序。五子棋游戏的简单易学,老少皆宜这些特性与智能手机的移动方便,大范围普及等特点结合起来,必定会大放光芒,广受欢迎的。也真是由于上文所述的各种优势,导致手机五子棋游戏被越来越多的人研究学习,可以说程序虽小但五味俱全,作为入门学习是再合适不过的了。网络上流传的五子棋游戏界面精美,风格各异,实在是已经达到巅峰之作
21、,作者在此并不想去做那锦上添花之举,所以对于本次设计论文有一个明确的定位,在完成五子棋游戏的基本对战功能的设计同时不再做各种附加功能的加强而是对其中所涉及的算法进行更加深入的学习。3 Android开发环境本章将主要介绍如何构建Android开发环境,包括获取Android SDK、Eclipse以及进行Android Eclipse插件设置等。3.1 Android开发环境变量配置3.1.1 JDK的配置JDK的配置并没有什么值得特别叙述的东西,在此主要阐述下JDK环境变量的配置问题。首先右键点击我的电脑 - 属性 - 高级系统设置,点击下面的环境变量,在下面的“系统变量”处选择新建,在变量
22、名处输入 JAVA_HOME在变量值输入JDK路径,确定后再新建一个变量名为Classpath,变量值为%JAVA_HOME%/lib/rt.jar;%JAV-A_HOME%/lib/tools.jar的变量 , 确定后找到PATH的变量,双击或点击编辑,在变量值最前面加上%JAVA_HOME%/bin; 最后点击确定按钮即可。如图3-1所示。图3-1 JDK环境变量设置3.1.2 Android开发插件的安装打开Eclipse, 在菜单栏上选择 help-Install New SoftWare 在弹出的界面上选择add,将弹出如下界面,如图3-2所示。图3-2 ADT的安装 在图3-2中N
23、ame处键入Android(名字可自定义),在Location出键入https:/dl- next后进行安装。安装android 开发插件后,重启eclipse。点击菜单window-preferences,将进入一个更新界面。选择你的android SDK解压后的目录,选错了就会报错,这个是升级工具,可以进行手动选择。升级SDK版本,选择菜单 window-Android sdk and avd manager,如图3-3所示。图3-3 SDK的配置3.1.3 AVD的创建新建AVD(android virtual device)和配置SDK差不多,进入android sdk and avd
24、 manager,选中Virtual Devices 点击New按钮,如图3-4所示。图3-4 AVD的创建4 游戏相关技术本章节主要介绍一下此论文中用到了的Android的布局文件,可视化控件以及它们的具体实现。4.1 游戏布局4.4.1 画盘线 以手工画图方式讲明白棋盘的座标计算方法:1 取得屏幕宽高;2 计算出第一根线与左边和上边的距离;3 推算其他线条计算方法。使用程序实现以上计算方法,创建出15根横线与竖线,存进集合中。for (int i = 0; i = maxX; i+) /竖线 lines.add(new Line(xOffset+i*POINT_SIZE, yOffset,
25、 xOffset+i*POINT_SIZE, yOffset+maxY*POINT_SIZE); for (int i = 0; i = maxY; i+) /横线 lines.add(new Line(xOffset, yOffset+i*POINT_SIZE, (maxX+1)*POINT_SIZE, yOffset+i*POINT_SIZE);/在ondraw方法画出所有棋盘线for (Line line : lines) canvas.drawLine(line.xStart, line.yStart, line.xStop, line.yStop, paint);4.1.2 双缓冲技
26、术画棋子 复制棋子对应的图片(四张)到工程中,使用这四张图片生成四个Bitmap:1 从context中取得图片的代码Resources resources = this.getContext().getResources();Drawable drawable = resources.getDrawable(R.drawable.green_point) 2 将图片画到Bitmap(内存缓冲区)的过程/为指定颜色对应的图片创建bitmap对象并放入到数组中 public void fillPointArrays(int color,Drawable drawable) /创建Bitmap内存
27、缓冲区(申请内存空间) Bitmap bitmap = Bitmap.createBitmap(POINT_SIZE, POINT_SIZE,Bitmap.Config.ARGB_8888); /创建画布、并设置将内容画到上面创建的Bitmap上 Canvas canvas = new Canvas(bitmap); /设置资源画的范围大小 drawable.setBounds(0, 0, POINT_SIZE, POINT_SIZE); /将图像资源画到缓冲区中 drawable.draw(canvas); /把缓存区引用存进数组中(注意将下标定义以颜色命名的常量) bitmapscolor
28、 = bitmap; 在onDraw方法将其在随意位置画出 canvas.drawBitmap(bitmapscolor_index,0,0,paint);4.1.3 在触摸处画棋子通过onTouchEvent方法获得触摸位置座标,以此座标创建一个棋子,触发onDraw方法,把刚才的棋子画出来 public boolean onTouchEvent(MotionEvent event) Point point = newPoint(event.getX(), event.getY(); /刷新一下棋盘,触发onDraw函数 refressCanvas(); 4.1.4 newPoint方法将此
29、座标调整到对应的棋位上(以手工画图的方式确定棋子四周的范围的计算方) private Point newPoint(Float x, Float y) /是否在棋盘线以外 boolean isOutsideChessboard = true; Point p = new Point(0, 0); for (int i = 0; i = maxX; i+) if (i-1) * POINT_SIZE + xOffset + POINT_SIZE/2) = x & x (i * POINT_SIZE + xOffset + POINT_SIZE/2) p.setX(i); /找到横座标,证明不在棋
30、盘线以外 isOutsideChessboard = false; break; /如果横坐标在棋盘线外,返回空,不下棋子 if(isOutsideChessboard) return null; /重置标志 isOutsideChessboard = true; for (int i = 0; i = maxY; i+) if (i-1) * POINT_SIZE + yOffset + POINT_SIZE/2) = y & y (i * POINT_SIZE + yOffset + POINT_SIZE/2) p.setY(i); /找到纵座标,也不在棋盘线外 isOutsideChes
31、sboard = false; break; /纵标在棋盘线外 if(isOutsideChessboard) return null; /横座标和纵座标都不在棋盘线外 return p; 4.2 人人对战4.2.1 设置标记-whoRun 表示应该轮到谁下棋,1为玩家1下,2为玩家2下,-1表示玩家正在下/默认第一个玩家先行private int whoRun = 1;private void setPlayer1Run()whoRun = 1; /是否轮到人类玩家下子private boolean isPlayer1Run()return whoRun=1; /是否轮到人类玩家下子priv
32、ate boolean isPlayer2Run()return whoRun=2;private void setPlayer2Run()whoRun = 2; /正在下的过程中,主是因为电脑有较长的计算时间,这期间一定不可以再响应触摸事件private void setOnProcessing()whoRun = -1; /是否正在下某一步棋过程中,主是电脑下棋时需要较长的计算时间,这期间一定不可以再响应触摸事件private boolean isProcessing() return whoRun = -1;4.2.2 改写onTouchEvent方法,监听触摸事件,在触摸处下棋子 /处
33、理触摸事件public boolean onTouchEvent(MotionEvent event) /只处理开局后的触摸弹起事件if(event.getAction()!=MotionEvent.ACTION_UP)return true;/是否正在处理一步棋的过程中if(isProcessing()return true;/下一步棋playerRun(event); return true;4.2.3 playerRun方法判断轮到谁下棋子private synchronized void playerRun(MotionEvent event)if(isPlayer1Run()/第一玩
34、家下棋player1Run(event);else if(isPlayer2Run()/第二玩家下棋player2Run(event);4.2.4 玩家一下棋的方法private void player1Run(MotionEvent event)/取得正确座标的棋子Point point = newPoint(event.getX(), event.getY();if(point=null)/在棋盘外return ;if(allFreePoints.contains(point)/此棋是否可下/设置正在下棋子setOnProcessing();player1.run(player2.getM
35、yPoints(),point);/刷新一下棋盘refressCanvas();/判断第一个玩家是否已经赢了if(!player1.hasWin()/我还没有赢if(player2=computer)/如果第二玩家是电脑/10豪秒后才给玩家2下棋refreshHputerRunAfter(10);elsesetPlayer2Run();else/否则,提示游戏结束setMode(PLAYER_TWO_LOST);4.2.5 玩家二下棋的方法private void player2Run(MotionEvent event)Point point = newPoint(event.getX(),
36、 event.getY();if(point=null)return ;if(allFreePoints.contains(point)/此棋是否可下setOnProcessing();player2.run(player1.getMyPoints(),point);/刷新一下棋盘refressCanvas();/判断我是否赢了if(!player2.hasWin()/我还没有赢setPlayer1Run();else/否则,提示游戏结束setMode(PLAYER_ONE_LOST);4.2.6 实现判断输赢的方法 private final Point temp = new Point(0
37、, 0); /我是否是否赢了 public final boolean hasWin() if(myPoints.size()=0 & count=5) return true; temp.setX(x).setY(y); while (myPoints.contains(temp.setX(temp.getX()+1) & temp.getX()maxX & count=5) return true; /纵向 count = 1; temp.setX(x).setY(y); while (myPoints.contains(temp.setY(temp.getY()-1) & temp.ge
38、tY()=0) count +; if(count=5) return true; temp.setX(x).setY(y); while (myPoints.contains(temp.setY(temp.getY()+1) & temp.getY()maxY & count=5) return true; /正斜向 / count =1; temp.setX(x).setY(y); while (myPoints.contains(temp.setX(temp.getX()-1).setY(temp.getY()+1) & temp.getX()=0 & temp.getY()=5) return true; temp.setX(x).setY(y); While(myPoints.contains(temp.setX(temp.getX()+1).setY(temp.getY()-1) & temp.getX()