设为首页收藏本站优领域

优领域

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
优领域 优领域 IT领域 Android开发 查看内容

打造一款 Android 联网 tic-tac-toe 游戏

2011-11-3 23:39| 发布者: admin| 查看: 2638| 评论: 0|来自: ibm.com

摘要: 简介:本文讲述了如何使用本机 Android 前端应用程序打造一个支持联网对战的多玩家 tic-tac-toe 游戏的后端。 联网的多玩家 tic-tac-toe 游戏 常用缩略词 API:应用程序编程接口 HTTP:超文本传输协议 I ...

简介: 本文讲述了如何使用本机 Android 前端应用程序打造一个支持联网对战的多玩家 tic-tac-toe 游戏的后端。

常用缩略词

  • API:应用程序编程接口
  • HTTP:超文本传输协议
  • IP:Internet 协议
  • SDK:软件开发包
  • SQL:结构化查询语言
  • UI:用户界面
  • XML:可扩展标记语言

休闲游戏十分流行,而且发展空间巨大,原因很显然。并非所有年龄段的所有人都对在线游戏感兴趣,第一人称射击游戏只适合反应快速的青少年群体。有时候,玩有时间思考和制定战略或者目标是与他人合作取得胜利的游戏更加吸引人。

从开发人员的角度看,休闲游戏的好处是,它们比图形密集的第一人称设计或运动游戏更容易打造。因此,一位或一群开发人员更容易做出全新的游戏。

在本文中,我们讲述了创建一个休闲、联网的多玩家 tic-tac-toe 游戏的基础。游戏服务器是一个基于 MySQL 和 PHP、带有 XML 接口的 Web 应用程序。前端是一个运行在 Android 手机上的本机 Android 应用程序。


构建后端

后端从一个有两个表的简单 MySQL 数据库开始。清单 1 显示了该数据库的模式。


清单 1. db.sql
				
TABLE IF EXISTS games;TABLE games(
    id INT NOT NULL AUTO_INCREMENT,
    primary key ( id ) );
TABLE IF EXISTS moves;TABLE moves(
    id INT NOT NULL AUTO_INCREMENT,
    game INT NOT NULL,
    x INT NOT NULL,
    y INT NOT NULL,
    color INT NOT NULL,
    primary key ( id ) );

第一个表是 games 表,用于保存游戏的惟一 ID。在生产应用程序中,您可能有一个用户表,而 games 表正是包含了两位玩家的用户 ID。但为了让事情变得简单,我放弃使用这种方法,而是集中讲述存储游戏数据、在客户端与服务器之间通信,以及打造前端的基础知识。

第二个表是 moves 表,它用于保存给定游戏的步着,因此共有五列。第一列是步着的惟一 ID。第二列是这一步着应用的游戏 ID。然后是动作所在的 x 和 y 坐标。因为格子是 3x3 的,这些值应该在 0 与 2 之间。最后一个字段是步着的 “颜色”,它是一个值为 X 或 O 的整数。

为了构造数据库,首先使用 mysqladmin 创建它,然后使用 mysql 命令运行 db.sql 脚本,如下所示:

% mysqladmin --user=root --password=foo create ttt
% mysql --user=root --password=foo ttt < db.sql

这个步骤创建了一个名为 “ttt” 的新数据库,用于保存 tic-tac-toe 模式。

现在有了模式,您需要创建启动游戏的途径。为此,您有一个 start.php 脚本,如 清单 2 中所示。


清单 2. start.php
				
prepare($sql);
$sth->execute( array() );
$qid = $dd->lastInsertId();

$doc = new DOMDocument();
$r = $doc->createElement( "game" );
$r->setAttribute( 'id', $qid );
$doc->appendChild( $r );
$doc->saveXML();
?>

此脚本从连接数据库开始,然后对 games 表执行一条 INSERT 语句,并获取生成的 ID。接下来,它创建一个 XML 文档,将 ID 添加给一个游戏标签,并导出 XML。

您需要运行此脚本以在数据库中插入一个游戏,因为简单的 Android 应用程序没有用于创建游戏的界面。代码如下所示:

$ php start.php


$

现在您有了自己的第一个游戏。要查看游戏列表,使用 清单 3 中的 games.php 脚本。


清单 3. games.php
				
prepare( $sql );
$q->execute( array() );

$doc = new DOMDocument();
$r = $doc->createElement( "games" );
$doc->appendChild( $r );
( $q->fetchAll() as $row) {
 $e = $doc->createElement( "game" );
 $e->setAttribute( 'id', $row['id'] );
 $r->appendChild( $e );
}
$doc->saveXML();
?>

和 start.php 脚本一样,这个脚本也从连接数据库开始。然后它查询 games 表中的可用游戏。之后它创建一个新的 XML 文档,添加一个 games 标签,然后为每个可用的游戏添加游戏标签。

当您从命令行运行这个脚本时,将看到如下内容:

$ php games.php


$

您还可以从 Web 浏览器运行这个脚本,得到的输出相同。

很好!由于游戏 API 已经就绪,是时候编写处理步着的服务器代码了。这段代码一开始构建一个名为 show_moves 的 helper 脚本,用于获得给定游戏的当前步着,并把它们导出为 XML。 清单 4 显示了这个 helper 函数的 PHP 代码。


清单 4. show_moves.php
				
prepare( $sql );
 $q->execute( array( $game ) );

 $doc = new DOMDocument();
 $r = $doc->createElement( "moves" );
 $doc->appendChild( $r );

 foreach ( $q->fetchAll() as $row) {
   $e = $doc->createElement( "move" );
   $e->setAttribute( 'x', $row['x'] );
   $e->setAttribute( 'y', $row['y'] );
   $e->setAttribute( 'color', $row['color'] );
   $r->appendChild( $e );
 }

 print $doc->saveXML();
}
?>

此脚本获得了一个数据库句柄和游戏 ID。之后,它执行 SQL 来获取步着列表。然后,它使用给定游戏的步着创建了一个 XML 文档。

创建这个 helper 函数的原因是有两个脚本将会用到它。第一个脚本是 moves.php 脚本,用于返回指定游戏的当前步着。 清单 5 显示了这个脚本。


清单 5. moves.php
				


这个简单的脚本包含 helper 函数代码,连接到数据库,然后使用指定的游戏 ID 调用 show_moves 函数。要测试这段代码,使用 curl 命令从命令行调用服务器上的脚本:

$ curl "http://localhost/ttt/moves.php?game=1"


$

遗憾的是,您尚未走出任何步着,因此输出没有什么特别意义。 为了弥补这一点,您需要给服务器 API 添加最后一个脚本。 清单 6 显示了 move.php 脚本。


清单 6. move.php
				
prepare($sql);
$sth->execute( array(
 $_REQUEST['game'],
 $_REQUEST['x'],
 $_REQUEST['y']
) );

$sql = 'INSERT INTO moves VALUES ( 0, ?, ?, ?, ? )';
$sth = $dbh->prepare($sql);
$sth->execute( array(
 $_REQUEST['game'],
 $_REQUEST['x'],
 $_REQUEST['y'],
 $_REQUEST['color']
) );
_moves( $dbh, $_REQUEST['game'] );
?>

此脚本首先包含 helper 函数并连接数据库,然后执行两条 SQL 语句。第一条 SQL 语句用于删除可能与送入的步着相冲突的所有步着。第二条用于为指定步着在 moves 表中插入一个新行。该脚本接着将步着列表返回给客户端。这个步骤让客户端可以不必在每走出一个步着时都发出两个请求。带宽并不便宜,因此请求数量应该尽量减少。

为了测试以上内容有效,您可以走一个步着:

$ curl "http://localhost/ttt/move.php?game=1&x=1&y=2&color=1"



完成游戏服务器代码之后,您可以构建这个多玩家联网游戏的 Android 前端。


构建 Android 前端

首先安装 Android SDK 和一些 Android 平台版本,最后是一些 Eclipse 和 Android Eclipse 插件。幸运的是,所有这些软件均在 Android 网站(参见 参考资料 中的链接)上可以找到。关于如何建立开发环境的深入描述已经超出了本文的范围。

建立起开发环境之后,启动 Eclipse 并创建一个新的 Android 项目。您看到的画面应该与 图 1 类似。


图 1. 在 Eclipse 中创建 Android 应用程序
 


图 1 显示了 Android 应用程序的项目向导。输入一个项目名称,选择 Create new project in workspace 单选按钮,并指定 UI 元素的代码位置。在 Build Target 一览表中,选择一个 Android 平台。对于这段代码,我使用的是 Android 2.3.1。代码十分简单,您可以使用喜欢的任意版本。如果没有看到有任何平台列出,您需要下载并安装 Android SDK 安装说明中所提的平台。要注意,下载所有这些平台需要花费很长时间。

Properties 部分,填写应用程序名称和包名称。我使用的分别是 “Tic Tac Toe” 和 “com.jherrington.tictactoe”。接下来,选择 Create Activity 复选框,并输入活动名称。我使用 “TicTacToeActivity” 作为活动名称。

单击 Finish 可以看到类似于 图 2 的一个新项目。


图 2. TicTacToe 项目文件
 


图 2 显示了一个 Android 应用程序的顶级目录和文件(目录有 src、gen、Android 2.3.1 和 res,文件有 assets、.xml、default.properties 和 proguard.cfg)。其中重要的几项包括:

  • res 目录,包含资源
  • src 目录,包含 Java™ 源文件
  • 清单文件,其中包含应用程序相关的传记信息

首先要编辑的是清单文件。大多数文件已经是正确的,但您需要添加 Internet 权限,以便让应用程序能够通过 Internet 发送请求。清单 7 显示了完成之后的清单文件。


清单 7. AndroidManifest.xml
				



   

   

   
       
           
               
               
           
       

   


惟一的变化是在文件顶部增加了 uses-permission 标签。

相关阅读

网站统计|优领域|优领域 ( 粤ICP备12011853号-1 )  

GMT+8, 2019-3-22 14:56 , Processed in 0.038995 second(s), 12 queries .

Copyright © 2008-2014 优领域

回顶部