单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1913|回复: 4
收起左侧

安卓五子棋游戏开发代码工程+图文+设计文档资料下载

[复制链接]
943248580 发表于 2019-1-11 15:57 | 显示全部楼层 |阅读模式
五子棋安卓开发论文及开发工程见附件

[摘 要] 手机游戏被业内人士称为继短信之后的又一座“金矿”。4G的普及,手机显示性能的提高、手机屏幕的扩大和较高的分辨率,解决了传统手机行业的很多弊端,手机休闲娱乐应用将成为PC休闲娱乐之后又一重要业务增长点、同时Android采用了全面触摸屏,可以完成更多复杂的操作。Android虽然基于Java,但是其虚拟机是基于寄存器的,速度得到很大的提升,这为Android平台上开发游戏提供了坚强的后盾。


本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一个五子棋游戏。五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能力 提高智力,而且富含哲理,有助于修身养性。本系统是本系统中设定了人机对战和人人对战两种模式。人机对战实现的是一些简单的算法,人人对战只是进行了输赢方的判定。它与javame的五子棋设计有许多的不一样,Android本来就是全触摸的形式,而且操作非常简单。


目录

引言              2

第一章 应用背景与功能需求              3

1.1 应用背景              3

1。2设计意义              3

1。3应用需求分析              3

1。3。1 应用的实用性              3

1。3。2 应用需求              3

第二章 设计思路              4

第三章 布局设计              4

3.1 初始界面布局              4

3。2画盘线              6

3.3按照棋盘模式构建棋盘大小              7

3。4判断该位置是否可下子              7

3。5交换棋手下棋              7

第四章 文件读写类的设计与实现              8

4。1获胜机制              8

4.1.1 遍历所有的五连子可能情况的权值。              8

4。1。2 初始化黑子白子上的每个权值上的连子数              9

4.1.3 检查是否有人五连珠              10

4。1。4显示结束信息              10

4.2人机对战              11

4。3 输赢判断              11

第五章 其他相关工作              15

5.1 游戏主界面              15

5.2 游戏开始界面              15

第六章 系统测试与部署              16

6.1 硬件环境              16

6。2 软件环境              16

6。3测试用例              16

第七章 总结              17

参考文献              17


引言

随着社会的发展,目前全国的手机用户数量已经远超过了PC机的数量,而且手机的功能正在快速更新,其中智能手机所占的比例越来越大,特别是随着5G技术发展时代的到来,移动互联网已是一个巨大的市场,许多国际大公司以及国内的大公司斗在抢占智能手机领域的市场份额。这期间,出现的智能手机可谓五花八门,种类繁多。

当互联网巨头Google宣布依靠android系统进军手机操作系统领域之后,三年来Android一路高歌,快速的获得众多用户和厂商的认同。随着Android手机终端的热销,Android也引起众多手机应用程序开发商的关注,Android的出现,带给了智能手机领域更多的机遇和挑战,由于Android基于Linux内核且具有开源、免费的特性,他迅速得到广大爱好者以及许多厂商的支持,基于Android所开发的手机游戏拥有巨大潜力已成为行业共识。

中华民族是一个有着几千年悠久历史和璀璨文化的国家,而棋类娱乐却早已突破了纯游戏的范畴而成为中华传统文化的一个分支。五子棋的棋文化源远流长,具有东方的神秘和西方的直观,是中西文化的交流点,是古今哲理的结晶。

现在人们压力日益增大,需要劳逸结合才能获得更高的工作效率,工作之余的娱乐对每一个人来说都是必不可少的。五子棋这种娱乐方式简单易学又具有深奥的技巧,非常富有趣味性和消遣性。在经过不断发展后五子棋已经成为棋盘娱乐的一个重要组成部分,他能够增强思维能力、开发智力,是人们休闲娱乐的不错选择


第一章 应用背景与功能需求
1.1 应用背景

在我们的生活中有许多的游戏,但是游戏不同她也会给玩家带来不同的感受和生活理念。游戏是我们日常生活的一个必不可少的娱乐项目,也带动了游戏相关产业市场的发展。游戏平台是经过从游戏机到电视游戏,然后从PC游戏,到手机游戏,中间经历了很多的技术的更新和变革。但随着新技术的发簪和我们生活水平质量的提高,手机开始普及,因为手机是非常小巧便捷的,而且方便的特性成为我们日常生活中必备通讯工具。而基于手机平台的游戏也就拥有的市场空间是巨大的的,也因随着4G的开通和应用,手机游戏必然会迎来新的一轮游戏热潮。

1.2设计意义

本次设计是基于Android平台开发的一个小型五子棋游戏程序。五子棋游戏的简单易学,老少皆宜这些特性与智能手机的移动方便,大范围普及等特点结合起来,必定会大放光芒,广受欢迎

1.3应用需求分析
1.3.1 应用的实用性

现在人们压力日益增大,需要劳逸结合才能获得更高的工作效率,工作之余的娱乐对每一个人来说都是必不可少的。五子棋这种娱乐方式简单易学又具有深奥的技巧,非常富有趣味性和消遣性。在经过不断发展后五子棋已经成为棋盘娱乐的一个重要组成部分,他能够增强思维能力、开发智力,是人们休闲娱乐的不错选择。

1.3.2 应用需求

游戏说明:游戏开始时,由黑子开局,将一枚棋子落在棋盘一坐标上,然后由白棋落子,如此轮流下子,直到某一方首先在棋盘的竖、横或斜三方向上的五子连成线,则该方该局获胜。功能列表如下:

(1)输出棋盘;

(2)提示用户下子;

(3)查看用户是否出界;

(4)系统自动下子;

(5)判断游戏是否输赢;

(6)判断是否进入下一局;

(7)退出游戏。

第二章 设计思路

在软件设计分析的基础上,为了方便玩家的使用,界面设计的简洁明了,布局合理。应用设计内容主要为五子棋人机对战,由人与计算机进行相互下子,进行合理的布局以及算法使计算机可以自动判断胜利条件,并于玩家进行博弈。使玩家在闲暇时可以得到适当的放松。

本应用的设计目标是建立于一个基于Android手机游戏软件,基本可以满足人们在闲暇时间的娱乐以及放松。

打开游戏,进入初始主界面可选择开始或退出,若点击开始,进行判断电脑还是玩家先下子,判断后进行下子,一方下完进行判断输赢,若有一方胜利则结束游戏,若没有人获胜,则返回下棋阶段,流程图如图2-1所示:

图2-1 流程图

第三章 布局设计
3.1 初始界面布局

采用线性布局作为初始化界面,插入背景图片,按照上中下布局分布,插入游戏名称,新游戏等文本框,编辑按钮文本,实现代码如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="@drawable/timg"

    android:orientation="vertical"

    android:padding="30dip" >

    <LinearLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_weight="0.17"

        android:gravity="center"

        android:orientation="vertical" >

        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/main_title"

            android:textColor="@color/text_title"

            android:textSize="64sp" />

    </LinearLayout>

    <Button

        android:id="@+id/btn_newgame"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/btn_newgame" />

    <Button

        android:id="@+id/btn_exit"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_weight="0.00"

        android:text="@string/btn_exit" />

</LinearLayout>

3.2画盘线

本模块是整个游戏系统的平台性模块,之后所有的功能都将依附该模块来体现,主要需要实现棋盘的绘制,本游戏系统选择的是15*15的棋盘,与左边和上边的距离: 3推算其他线条计算方法。使用程序实现以上计算方法,创建出15根横线与整线,存进集合中。实现代码如下:

for (int i=0; i <= maxX; i++) {//竖线

lines. add (new Line (xoffset+i*POINT_ SIZE, yoffset,xOffset+i*POINT SIZE, yoffset tmaxY*POINT SIZE));

for (int i=0; i <= maxY; i+) {//横线

lines. add (new Line (x0ffset, yoffset+i*POINT SIZE,(maxX+1)*P0INT SIZE, yoffset+i*POINT SIZED);

//在ondraw方法画出所有棋盘线

for (Line line : lines){

canvas. drawLine(line. xStart, line. yStart, line. xStop, line. yStop,paint):

盘线图如图3-1所示:

              

图3-1 盘线图

3.3按照棋盘模式构建棋盘大小

通过输入相对棋盘的X和Y设置rect的值 使之变为该X和Y代表的屏幕区域值

private void getRect(int x, int y, Rect rect) {

                            rect.set((int) (x * gridSize + getTopX()),

                                                        (int) (y * gridSize + getTopY()), (int) (x * gridSize

                                                                                    + gridSize + getTopX()),

                                                        (int) (y * gridSize + gridSize + getTopY()));

3.4判断该位置是否可下子

              计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下,如果可下子,则下子,如果超出棋盘范围或该点已有棋子则不能下子。

              public boolean chessExist(int i,int j){

                 if(this.arrMapShow[ i][j]==1 || this.arrMapShow[ i][j]==2)

                  return true;

                 return false;

              }

判断该坐标位置是否可下棋子。

              public void readyplay(int x,int y){

                 if(badxy(x,y))

                  return;

                 if (chessExist(x,y))

                  return;

                 this.arrMapShow[x][y]=3;

              }

3.5交换棋手下棋

设置交换棋手的标识符

              public void setisOdd(boolean isodd){

                 if(isodd)

                  this.isOdd=true;

                 else

                  this.isOdd=false;

              }

获取是否交换棋手的标识符。

              public boolean getisOdd(){

                 return this.isOdd;

              }

第四章 文件读写类的设计与实现
4.1获胜机制
4.1.1 遍历所有的五连子可能情况的权值。

从横向、竖向、右斜、左斜,四个方向判断获胜机制,如果四个方向其中一个方向有五子连珠的情况,则获胜,如果没有则继续下子。i从0到14,循环15次,j从0到10循环11次,k从0到4循环5次,判断横纵坐标的位置以及连珠数量。

(1)

        for(int i=0;i<15;i++)

            for(int j=0;j<11;j++){

                for(int k=0;k<5;k++){

                    this.table[1][j+k][ i][icount] = true;

                    this.table[0][j+k][ i][icount] = true;

                }

                icount++;

            }

(2)

        for(int i=0;i<15;i++)

            for(int j=0;j<11;j++){

                for(int k=0;k<5;k++){

                    this.table[1][ i][j+k][icount] = true;

                    this.table[0][ i][j+k][icount] = true;

                }

                icount++;

            }

(3)右斜

        for(int i=0;i<11;i++)

            for(int j=0;j<11;j++){

                for(int k=0;k<5;k++){

                    this.table[1][j+k][i+k][icount] = true;

                    this.table[0][j+k][i+k][icount] = true;

                }

                icount++;

            }

(4)左斜

        for(int i=0;i<11;i++)

            for(int j=14;j>=4;j--){

                for(int k=0;k<5;k++){

                    this.table[1][j-k][i+k][icount] = true;

                    this.table[0][j-k][i+k][icount] = true;

                }

                icount++;

4.1.2 初始化黑子白子上的每个权值上的连子数

判断有无一方胜利,若没有则初始化棋盘,重新下棋子。

        for(int i=0;i<=1;i++)  

            for(int j=0;j<572;j++)

                this.combo[ i][j] = 0;

        if(!IndexActivity.playerFirst){

                      isUsersTurn = false;

                                          Coordinate c = ai.comTurn(null);

                                          setPieceIfValid(c.x,c.y,1);

        }

        IndexActivity.playerFirst = !IndexActivity.playerFirst;

              }

            

              public int[][] getGridBoard(){

                            return gridBoard;

              }

              public void setPieceIfValid(int selectX, int selectY,int id) {

                            if(gridBoard[selectX][selectY] != 0 || haveWinner()){

                                          return;

                            }

                            if(isUsersTurn && id==2){

                                          setPiece(selectX,selectY,id);

                                          nextTurn();

                            }else if(!isUsersTurn && id==1){

                                          setPiece(selectX,selectY,id);

                                          nextTurn();

                            }

              }

4.1.3 检查是否有人五连珠

              通过语句从572种五连珠可能性中,检查该连珠情况是否符合其中一种,如果有则获胜,如果没有,则交换对手下棋。

private boolean haveWinner(){

                            for(int i=0;i<2;i++){

                                          for(int j=0;j<572;j++){

                                                        if(combo[ i][j] == 5){

                                                                      showWinner(i);

                                                                      return true;

4.1.4显示结束信息

如电脑先连成五连珠,则输出玩家失败,如玩家先连成五连珠,则输出玩家获胜。


  1. <font style="font-size: 12pt">              private void showWinner(int id){
  2.                             Builder builder = new AlertDialog.Builder(this);
  3.                             String title = "";
  4.                             String msg = "";
  5.                             switch(id){
  6.                             case 0://电脑赢了,玩家输了
  7.                                           title = this.getResources().getString(R.string.title_lose);
  8.                                           msg = this.getResources().getString(R.string.text_lose);
  9.                                           break;
  10.                             case 1://玩家赢了
  11.                                           title = this.getResources().getString(R.string.title_victor);
  12.                                           msg = this.getResources().getString(R.string.text_victor);
  13.                                           break;
  14.                             }
  15.                             builder.setTitle(title);
  16.                             builder.setMessage(msg);
  17.                             builder.setPositiveButton("back",               new DialogInterface.OnClickListener() {

  18.                                          
  19.                                           @Override
  20.                                           public void onClick(DialogInterface dialog, int which) {
  21.                                                         BackgammonActivity.this.finish();//退出此窗口                          

  22.                                           }</font>
复制代码


4.2人机对战

轮到电脑下棋时,电脑先取出一个空白棋位(一个Point对象),以此棋位为起点计算四个方向能形成多少部连续的棋子,此为第一次计算。

FirstAnalysisResult{

Point point;   //棋位

int count;  //连续数

int aliceState;  //状态

int direction;  //方向

因为第一次计算的结果对一个棋位都会形成四个结果(每个方向一个结果),这一步将这些结果汇总到一个类对象中。

SecondAnalysisResult implements Comparable<SecondAnalysisResult>{

Point point;  //棋位

int alive4 = 0;  //活4

int alive3 = 0;  //活3数量

int halfAlive4 = 0;  //半活4,一头封

int halfAlive3 = 0;  //半活3,一头封

Int alive2 = 0;  //活2数量

对第二次计算结果进行排序,将结果分成三个等级,每个等级有一个集合装载,有子类在排序结果挑选想要下的棋子。为了性能在第一次计算前,必须确定一个较小的计算范围,不能全部都算。另外,在每次找到必杀棋时,直接返回,不在计算。

4.3 输赢判断

从左、右、上、下、左上、右上、右下、左下,八个方向判断是否有五子连珠的情况。i从1到5循环5次,判断是否有连珠情况。

(1)判断右边是否有五子连珠的情况,如果有,则获胜。

                 for(int i=1;i<6;i++){

                  x_temp1+=1;

                  if(x_temp1>this.width)

                   break;

                  if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

                   num++;

                  else

                   break;

                 }

(2)判断左边是否有五子连珠的情况,如果有,则获胜。

                 x_temp1=x_temp;

                 for(int i=1;i<6;i++){

                  x_temp1-=1;

                  if(x_temp1<0)

                   break;

                  if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

                   num++;

                  else

                   break;

                 }

                 if(num==5)

                  return true;

(3)判断上方是否有五子连珠的情况,如果有,则获胜。

                 x_temp1=x_temp;

                 y_temp1=y_temp;

                 num=1;

                 for(int i=1;i<6;i++){

                  y_temp1-=1;

                  if(y_temp1<0)

                   break;

                  if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

                   num++;

                  else

                   break;

                 }

(4)判断下方是否有五子连珠的情况,如果有,则获胜。

                 y_temp1=y_temp;

                 for(int i=1;i<6;i++){

                  y_temp1+=1;

                  if(y_temp1>this.height)

                   break;

                  if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

                   num++;

                  else

                   break;

                 }

                 if(num==5)

                  return true;

(5)判断左上是否有五子连珠的情况,如果有,则获胜。

                 x_temp1=x_temp;

                 y_temp1=y_temp;

                 num=1;

                 for(int i=1;i<6;i++){

                  x_temp1-=1;

                  y_temp1-=1;

                  if(y_temp1<0 || x_temp1<0)

                   break;

                  if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

                   num++;

                  else

                   break;

(6)判断右下是否有五子连珠的情况,如果有,则获胜。

                 x_temp1=x_temp;

                 y_temp1=y_temp;

                 for(int i=1;i<6;i++){

                 x_temp1+=1;

                 y_temp1+=1;

                 if(y_temp1>this.height || x_temp1>this.width)

                  break;

                  if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

                   num++;

                  else

                   break;

                 }

                 if(num==5)

                  return true;

(7)判断右上是否有五子连珠的情况,如果有,则获胜。

                 x_temp1=x_temp;

                 y_temp1=y_temp;

                 num=1;

                 for(int i=1;i<6;i++){

                  x_temp1+=1;

                  y_temp1-=1;

                  if(y_temp1<0 || x_temp1>this.width)

                   break;

                  if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

                   num++;

                  else

                   break;

                 }

(8)判断左下是否有五子连珠的情况,如果有,则获胜。

                 x_temp1=x_temp;

                 y_temp1=y_temp;

                 for(int i=1;i<6;i++){

                  x_temp1-=1;

                  y_temp1+=1;

                  if(y_temp1>this.height || x_temp1<0)

                   break;

                  if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

                   num++;

                  else

                   break;

                 }

                 if(num==5)

                  return true;

                 return false;

第五章 其他相关工作
5.1 游戏主界面

游戏主界面如图5-1所示。

                                          
图5-1 游戏主界面图                                                                                       5-2 开局界面
5.2 游戏开始界面

五子棋的开局界面如图5-2所示:

第六章 系统测试与部署

6.1 硬件环境

电脑、Android手机、数据线

6.2 软件环境

Windows操作系统、Android手机系统、Eclepse

6.3测试用例

系统测试,即对软件进行全面统一的测试,包括对性能、娱乐性以及对运行环境的调试。

测试游戏进行界面(玩家为黑棋),如图6-1所示:

图6-1 游戏进行界面

测试输赢界面,如图6-2 胜利界面,图6-3失败界面:

                              

图6-2 胜利界面                                                                                                                图6-3 失败界面                                         

第七章 总结

本文实现了五子棋游戏中的人机对战模式。在这次的实验中我遇到了很多困难,在克服这些困难的过程中学到了很多的知识,让我对Android有了更深层次的了解。

五子棋游戏逻辑十分简单,可以明显的分为四个部分:白棋下、判断白棋是否获胜、黑棋下、判断黑棋是否获胜;在判断获胜的两个部分可以使用相同的方法,所以总结起来我们只需完成白棋下、黑棋下、判断获胜三个部分。所以我在选择实现顺序的时候选择实现人机对战的模式来进行设计。

我个人认为人机对战的实现相对于人人对战模式更加复杂,人机对战模式的实现相对于人人模式增加了游戏AI,而且仅仅是增加了游戏AI,所以在这个实现中对游戏AI的实现成为了重点。通过在网上的查找和总结,知道最通用的实现五子棋游戏AI的算法就是:根据五子棋游戏规则指定在不同情况下每个位置的权值,然后在开始下棋时在地图上计算权值最大的位置即可。经过对五子棋游戏的简单研究,之后又在网上查找了相关算法的实现资料,自己实现了一个简单的五子棋算法。虽然不能有很高的AI不过已经可以达到初级玩家的水平。

附件介绍

附件介绍

0.png

完整的Word格式文档51黑下载地址:
五子棋.docx (560.85 KB, 下载次数: 17)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

8523 发表于 2019-6-14 15:33 | 显示全部楼层
请问能私发一份吗?
完美的荷包蛋 发表于 2019-7-1 09:49 | 显示全部楼层
请问能使用 android studio来实现吗
QSM980405 发表于 2019-9-30 21:19 | 显示全部楼层
非常好的资料,支持一下
宿命回忆 发表于 2019-12-5 09:22 | 显示全部楼层

RE: 安卓五子棋游戏开发代码工程+图文+设计文档资料下载

可以下载的吗??
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表