本节书摘来异步社区《Android游戏开发详解》一书中的第1章,第1.7节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.7 控制流程第1部分——if和else语句

Android游戏开发详解
我们现在把注意力转向控制流程(control flow ,也称为流程控制,flow control),这指的是代码行将要按照什么样的顺序执行。还记得代码执行的基本规则吧,它是说代码要从上到下地执行。在最简单的程序中,代码真的是按照线性方式从上向下执行的。然而,在任何有用的程序中,我们可能会看到,根据某些条件,会跳过一些代码行甚至重复执行一些代码行。让我们来看一些例子。

1.7.1 if-else语句块

if-else语句块用来在代码中创建分支或多条路径。例如,我们可以检查如characterLevel > 10这样的条件来判断一个字符串内容,如图1-6所示。根据characterLevel的值,游戏可以执行不同的指令。你可以看到图1-4中有3条路径。

我们可以创建比上面的例子具有更多或更少分支的if-else语句块。实际上,我们甚至可以把if语句嵌套在其他的if语句中,以允许“内嵌的”分支。

1.7.2 if, else-if和else

无论何时,当你写下关键字if的时候,就开始了一个新的if-else语句块,如图1-6所示。你可以编写一个没有任何else-if或else语句的if语句块。这绝对没问题。

在你开始一个新的if-else语句块之后,每一个额外的else-if都表示一个新的分支。else语句是表示“我放弃”的分支,并且它将会为你处理所有的剩下的情况。

在给定的if-else语句块中,你只能选取一个分支。注意,在图1-6中,如果character Level是11,if和else-if语句中的条件似乎都满足。你可能会认为,这将会导致characterTitle变成“King”,随后很快又变成“Knight”。然而,不会发生这种情况,因为在if-else语句块中,你的代码只能选取一个分支,如图1-5所示。

1.7.3 函数和if-else语句块

再回来看看函数。实际上,我们可以通过if-else语句块使得函数更为强大。if-else语句块还是像前面所介绍的那样工作,但是现在,我们将其包含到函数中,这意味着,我们要留意更多的花括号。看看下面的示例函数,看能否确定哪个开始花括号对应哪个结束花括号。第一个示例中已经为你标识清楚了。

示例1

String theUltimateAnswer(boolean inBinary) {
  String prefix = “The answer to life the universe and everything:”;
  if (inBinary) {
  return prefix + 101010;
  } else {
  return prefix + 42;
  }
}

示例2

boolean isLessThanTen(int num) {
  if (num < 10) {
  return true;
  } else {
  return false;
  }
}

示例3

boolean isEven(int num) {
  if (num % 2 == 0) {
  return true;
  } else {
  return false;
  }
}

示例4

String desertSecurity(boolean hasGun, boolean hasRobots) {
  if (hasGun) {
  return "I've got a bad feeling about this.";
  } else if (hasRobots) {
  return "These are NOT the droids we are looking for."
  } else {
  return "Move along."
  }
}

1.7.4 嵌套的if-else语句块

现在,我们必须掌握通过读取花括号来判断每个代码块从哪里开始以及从哪里结束的方法,让我们采取一些步骤。假设我们想要编写一个函数,它告诉我们一个人是否能够看一部限制级的电影(我们将根据资格返回true和false)。我们将设置如下所示的条件。

  • 如果一个人拥有伪造的ID,他可以看该电影(不管其年龄多大)。
  • 如果一个人有父母陪伴,他可以看该电影(不管其年龄多大)。
  • 如果一个人没有伪造的ID或者没有父母陪伴:
  • 如果这个人年龄达到了最小年龄,他可以看该电影。
  • 如果这个人年龄尚未达到最小年龄,他不可以看该电影。
    因此,我们必须将if-else语句嵌套(nest)到一个更为通用的条件之中,才能够处理没有伪造的ID或没有父母陪伴的人的情况。让我们来看看代码,从3个主要分支开始。

程序清单1.12 我能看电影吗(不完整版本)

1 boolean canWatch(int age, int minimumAge, boolean fakeID, boolean withParent) {
2  if (fakeID) {
3     return true;
4  } else if (withParent) {
5     return true;
6  } else {
7     // Nested if statements go here.
8  }
9 }

现在,在第3个分支中(else语句)添加两种特定的情况。

程序清单1.13 内部分支

if (age >= minimumAge) {
  return true;
} else {
  return false;
}

现在,我们可以将程序清单1.12和程序清单1.13放到一起,组成程序清单1.14。

程序清单1.14 我能看电影吗(完整版)

01 boolean canWatch(int age, int minimumAge, boolean fakeID, boolean withParent) {
02    if (fakeID) { 
03     return true;
04    } else if (withParent) {
05     return true;
06    } else {
07     if (age >= minimumAge) {
08      return true;
09     } else {
10      return false;
11     }  
12    }
13 }

1.7.5 简化布尔语句

尽管程序清单1.14中的代码能够很好地运行,我们还是可以进行一些优化,如程序清单1.15所示。

程序清单1.15 我能看电影吗(简化版#1)

01 boolean canWatch(int age, int minimumAge, boolean fakeID, boolean withParent) {
02   if (fakeID || withParent) { // Two cases were combined into one if statement.
03    return true;
04   } else {
05    if (age >= minimumAge) {
06       return true;
07    } else {
08       return false;
09    }  
10   }
11 }

注意,在程序清单1.15中,我们在第2行使用“OR”运算符||将两种情况组合到一条if语句中。我们将所有的“true”的情况组合起来,以继续简化该函数,如程序清单1.16所示。

程序清单1.16 我能看电影吗(简化版#2)

01 boolean canWatch(int age, int minimumAge, boolean fakeID, boolean withParent) {
02   if (fakeID || withParent || age >= minimumAge) { 
03    return true;
04   } else {
05    return false;
06   }
07 }

不管你是否相信,我们可以完全去除掉if-else语句块而只是返回(fakeID || withParent || age >= minimumAge)的值,从而更进一步简化,参见程序清单1.17。

程序清单1.17 我能看电影吗(简化版#3)

1 boolean canWatch(int age, int minimumAge, boolean fakeID, boolean withParent) {
2    return (fakeID || withParent || age >= minimumAge); 
3 }

编写这样整洁的代码,就使得你(以及你的同事)能够更加高效地工作,而不需要使用诸如程序清单1.14那样复杂的逻辑。在整本书中,我们将学习到更多编写整洁代码的技巧。

《Android游戏开发详解》一1.7 控制流程第1部分——if和else语句的更多相关文章

  1. Android WebView 开发详解

    Android WebView 开发详解 参见 http://blog.csdn.net/typename/article/details/39030091

  2. JMessage Android 端开发详解

    目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 IM 应用会需要有哪些功能? 用户注册 / 登 ...

  3. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  4. Android WebView 开发详解(一)

    转载请注明出处  http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android ...

  5. Android Widget 开发详解(二) +支持listView滑动的widget

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...

  6. Android WebView 开发详解(三)

    转载请注明出处   http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...

  7. Android WebView 开发详解(二)

    转载请注明出处  http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao   概览: Androi ...

  8. 【转】【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ...

  9. 【Android应用开发详解】实现第三方授权登录、分享以及获取用户资料

      由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相 ...

随机推荐

  1. PTA 7-42 整型关键字的散列映射(手写哈希表的线性探测法)

    本题考点: 整型哈希表的线性探测法 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中.用线性探测法解决冲突. 输入格式: 输入第一行首先给出两个正整数N(≤10 ...

  2. python--Django从创建一个项目说起

    创建项目 首先进入一个空目录,打开操作命令行,输入: django-admin startproject 项目名称 建立数据库连接 进入项目目录打开settings.py文件,修改以下字段 DATAB ...

  3. 【数据库】MySQL数据库(五)

    一.DCL语句 1.添加权限: '; 注:sakili为数据库名,z1为新创建的数据库用户,123为密码 数据库添加权限 2.权限收回: revoke insert on sakila.* from ...

  4. go 接口与动态类型

    Go 没有类:数据(结构体或更一般的类型)和方法是一种松耦合的正交关系. 二.动态方法调用 通常需要编译器静态检查的支持:当变量被赋值给一个接口类型的变量时,编译器会检查其是否实现了该接口的所有函数.

  5. TCP协议的安全性分析

    有算法就有破解法,因为它们都遵循了一定的数据结构和数学知识.所以网络安全是一个相对的概念,不可能出现绝对的安全!作为当今最流行的网络协议--TCP也是如此.那么TCP的安全问题究竟是哪些因素引起的呢? ...

  6. Java第三十四天,IO操作(续集),非基本对象的读写——序列化流

    一.序列化与反序列化 以前在对文件的操作过程当中,读写的对象都是最基本的数据类型,即非引用数据类型.那么如果我们对饮用数据类型(即对象类型)数据进行读写时,应该如何做呢?这就用到了序列化与反序列化. ...

  7. std::lock_guard和std::unique_lock的区别

    std::lock_guard 1 初始化的时候锁定std::mutex std::mutex m_mtx; std::lock_guard<std::mutex> m_lock(m_mt ...

  8. tomcat通过tomcat 安装根目录下的conf-Catalina-localhost目录发布项目详解

    tomcat通过conf-Catalina-localhost目录发布项目详解   Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目 ...

  9. [算法总结]DFS(深度优先搜索)

    目录 一.关于DFS 1. 什么是DFS 2. DFS的搜索方式 二.DFS的具体实现 三.剪枝 1. 顺序性剪枝 2. 重复性剪枝 3. 可行性剪枝 4. 最优性剪枝 5. 记忆化剪枝 四.练习 一 ...

  10. Git应用详解第九讲:Git cherry-pick与Git rebase

    前言 前情提要:Git应用详解第八讲:Git标签.别名与Git gc 这一节主要介绍git cherry-pick与git rebase的原理及使用. 一.Git cherry-pick Git ch ...