2017-2-23 19:00:04 [显示全部楼层]
6798浏览
查看: 6798|回复: 6

[入门教程] 趣味编程指南(6-1)-程序的流程控制-判断语句1

[复制链接]
趣味编程指南(6-1)-程序的流程控制-判断语句1图1
程序流程控制-if 语句
趣味编程指南(6-1)-程序的流程控制-判断语句1图2
上节提到,for 循环可以让某段代码反复执行,如果我们用一根线条来去类比程序的执行流程,它就像其中打圈的部分。而后面介绍的 if 语句,则会使程序创建多个分支,呈现树根一样的形态。
这节主要展示 if 语句的特性,同时辅以多个知识。你会了解到如何使用逻辑运算符,关系运算符,同时掌握加载文字图片的方法。结尾会将之糅合到一起,从零开始,制作一个文字冒险游戏。
趣味编程指南(6-1)-程序的流程控制-判断语句1图3
下面先铺垫有关数据类型以及关系,逻辑运算符的基础知识。
数据类型 boolean,char,String 数据类型含义作用
int整形储存整数数据
float浮点形储存小数数据
char字符类型储存字符
string字符串类型储存字符串
bool布尔类型保存 true 值或 false 值前面提到的 int ,float 可以保存数值数据。但显然是不够用的。例如我们想储存一些中文或是英文字符,就需要用到 char 和 String。
代码示例(6-1):
[mw_shl_code=applescript,true]void setup(){
  char a = 'x';
  String b = "words";
  println(a);
  println(b);
}[/mw_shl_code]
对照上面的示例。char 是一种用于存储单个字符的数据类型。赋值时,字符必须带上单引号,以此与变量名区分开来。而对 String 类型进行赋值,字符则需要使用双引号。它可以比 char 存储更多的字符信息。假如我们希望在程序中储存地址,对话,人名等信息,就可以考虑用 String。
既然 String 存储的信息比 char 更多,那能否直接将 char 类型赋值给 String 类型呢?是可以的,前提是需要写上一个类型转换函数,否则程序会报错。
代码示例(6-2):
[mw_shl_code=applescript,true]void setup(){
  char a = 'x';
  String b = str(a);
  println(a);
  println(b);
}[/mw_shl_code]
这里的 str(), 就是类型转换函数。
连接字符串 String 类型有一个特殊的用法,使用“+” 号可以将两个字符串连接起来。
代码示例(6-3):
[mw_shl_code=applescript,true]void setup(){
  String a = "words1";
  String b = "words2";
  String c = a + b;
  println(c);
}[/mw_shl_code]
当我们希望将多个文本信息组装在一起,就可以考虑 + 号。
boolean 类型 下面介绍另一种数据类型 - boolean。它能存储的东西非常少,只有两个值,true(真) 与 false(假)。就像抛一个没有厚度的硬币,要么正面,要么反面。非黑即白,没有中间状态。布尔类型会与后面提到的 if 语句结合得非常紧密,根据 true 值或 false 值,可以决定某些语句是否执行。
先看一个有关 boolean 的例子
代码示例(6-4):
[mw_shl_code=applescript,true]void setup(){
  boolean a = true;
  boolean b = false;
  println(a);
  println(b);
}[/mw_shl_code]
当我们希望将多个文本信息组装在一起,就可以考虑 + 号。
boolean 类型 下面介绍另一种数据类型 - boolean。它能存储的东西非常少,只有两个值,true(真) 与 false(假)。就像抛一个没有厚度的硬币,要么正面,要么反面。非黑即白,没有中间状态。布尔类型会与后面提到的 if 语句结合得非常紧密,根据 true 值或 false 值,可以决定某些语句是否执行。
先看一个有关 boolean 的例子
代码示例(6-4):
[mw_shl_code=applescript,true]void setup(){
  boolean a = true;
  boolean b = false;
  println(a);
  println(b);
}[/mw_shl_code]
在 Processing 的控制台中,会输出变量 a,b 对应的布尔值。当然, 除了用 true ,false 来代表真假值之外,程序中还可以用数字来进行赋值。
代码示例(6-5):
[mw_shl_code=applescript,true]void setup(){
  boolean a = boolean(1);
  boolean b = boolean(0);
  boolean c = boolean(3);
  println(a);
  println(b);
  println(c);
}[/mw_shl_code]
boolean() 是一个类型转换函数。所有“非0”的数字,都会转换成 true 值。而当数字为 0 ,则会转化成 false 值。
关系运算符与逻辑运算符号 在程序中不仅能做加减乘除的运算,还有一些我们意想不到的运算方式。
关系运算符 像加减乘除这类运算符,最终返回的结果都是数值。而关系运算符,返回的则是布尔值。
关系运算符含义调用方法
==等于a == b
!=不等于a != b
>大于a > b
>=大于等于a >= b
<小于a < b
<=小于等于a <= b代码示例(6-6):
[mw_shl_code=applescript,true]void setup(){
  int a = 1;
  int b = 2;
  println(a == b);
  println(a != b);
  println(a > b);
}[/mw_shl_code]
顾名思义,关系运算符就是用作比较左右两边的关系,非常浅显易懂。当条件成立的时候,就返回 ture 值,不成立则返回 false 值。其中唯一要注意的是“==” 的写法,必须写两个等于号才是关系运算符。只写一个就成了赋值“=”符号。
逻辑运算符 接下来轮到介绍逻辑运算符,它返回的一样是布尔值。并且有三种类型:与,或,非。
逻辑运算符含义调用方法
&&与a && b
||或a || b
!非!a使用 && 运算符时,只有当表达式两边都为真时,返回的才会是 true 值。当其中一边为假,又或是两边都为假,返回的会是 false 值。
|| 运算符的满足的条件则宽松一些,只要其中有一边为真,返回的就是 true 值。两边为假,返回的就是 false 值。
! 运算符的作用是取反。它需要直接写在表达式前面,而不存在需要比较左右两边的情况。若原有的表达式为真,使用后返回的结果则为 false。若原来为假,返回的结果则为 true。
代码示例(6-7):
[mw_shl_code=applescript,true]void setup(){
  println(true && true);
  println(true && false);
  println(false && false);
  println(true || true);
  println(true || false);
  println(false || false);
  println(!true);
  println(!false);
}[/mw_shl_code]
条件判断语句 前面提及的概念都比较抽象。似乎也很难想通,关系运算符与逻辑运算符具体能有何作用。其实只要放在图形创作的语境下去理解,一切都会非常直观。这节的主角终于来了,那就是 if 语句。
下面是 if 语句的一般调用方式:

if(表达式){}


在没有学习 if 语句之前,写在程序中的语句,都是必须执行的,没有选择的机会。而使用了 if 语句后,在执行前需要先判断表达式的值。当表达式的布尔值为 true 的时候,大括号内的代码则会执行,否则会跳过。
代码示例(6-8):
[mw_shl_code=applescript,true]void setup(){
  if(true){
     println(1);
  }
  if(3 > 2){
     println(2);
  }
  if(false){
     println(3);
  }
  if(3 < 2){
     println(4);
  }
}[/mw_shl_code]
你可以通过以上的输出值,看到哪些语句被真正执行,它们都与表达式的布尔值密切相关。
if 语句控制图形的显示与隐藏 现在我们可以不看黑乎乎的控制台了,尝试用 if 实现些简单的图形效果。
代码示例(6-9):
[mw_shl_code=applescript,true]void setup(){
  size(700,700);
}

void draw(){
  background(32,48,65);
  if(mouseX > width/2){
    fill(3,240,175);
    noStroke();
    ellipse(width/2,height/2,200,200);
  }
}[/mw_shl_code]


将鼠标的位置的判断写在 if 中,就能影响后续的语句是否执行,从而达到控制图形显示或是消失的效果。
趣味编程指南(6-1)-程序的流程控制-判断语句1图4
if 语句的扩展 - else 与 else if。 if 语句只有在满足条件时,才会执行大括号中的代码。上例表达式的条件是 mouseX > width/2,所以鼠标一旦移到屏幕右方,就会显示圆形。假如我们希望鼠标移到屏幕左方出现的是另一个图形。应该怎么办?需要多写一个 if 语句吗?
大可不必,如果两个条件之间是非此则彼的关系,那直接用 else 会更方便。
调用形式:
if(条件)
{    语句1;}
else
{    语句2;}
满足条件时,执行语句 1。不满足则执行语句 2.
代码示例(6-10):
[mw_shl_code=applescript,true]void setup() {
  size(700, 700);
}

void draw() {
  background(32, 48, 65);
  noStroke();
  if (mouseX > width/2) {
    fill(3, 240, 175);
    ellipse(width/2, height/2, 200, 200);
  } else {
    rectMode(CENTER);
    fill(204, 3, 204);
    rect(width/2, height/2, 200, 200);
  }
}[/mw_shl_code]
趣味编程指南(6-1)-程序的流程控制-判断语句1图5
这样写就简便多了。除此之外,关于 if 还有另一种用法,那就是 else if。当我们有更多的条件需要判断时,就可以考虑它。
调用形式:
[mw_shl_code=applescript,true]if(条件 1){
    语句 1;
}else if(条件 2){
    语句 2;
}
...
else if(条件 n){
   语句 n;
}else{
    语句 n+1;
}[/mw_shl_code]
else if 语句是可以不断叠加。它的执行顺序依然是自上而下,先从条件 1 开始进行判断。若条件 1 满足则执行语句 1,同时后面的语句都跳过,不执行。当条件 1 不满足,才会检测 else if 中的条件 2。若条件 2 满足,则执行语句 2。否则就往复循环,直到执行为止。最后,如果所有条件都不满足,则执行 else 中的语句。
当然,最后的 else 也不是必须添加的。如果你不写 else,同时所有条件过一遍后,仍不满足,那 if 中的语句一条都不会执行。
代码示例(6-11):
[mw_shl_code=applescript,true]void setup() {
  size(700, 700);
}

void draw() {
  background(32, 48, 65);
  noStroke();
  if (mouseX < width/3) {
    fill(3, 240, 175);
    ellipse(width/2, height/2, 200, 200);
  } else if (mouseX < width/3 * 2) {
    rectMode(CENTER);
    fill(204, 3, 204);
    rect(width/2, height/2, 200, 200);
  } else {
    fill(3, 165, 204);
    triangle(250, 450, 450, 450, 350, 250);
  }
}[/mw_shl_code]
趣味编程指南(6-1)-程序的流程控制-判断语句1图6
这个例子就相当于把屏幕划分成了 3 块。左,中,右。鼠标横坐标不同,显示的图形也不同。
if 的嵌套 if 语句是可以嵌套使用的。可以由此组合出更复杂的情况。
代码示例(6-12):
[mw_shl_code=applescript,true]void setup() {
  size(700, 700);
  noStroke();
}

void draw() {
  if (mouseX > width/2) {
    background(235, 16, 0);
    if (mouseY > height/2) {
      fill(32, 48, 65);
      rectMode(CENTER);
      rect(width/2, height/2, 200, 400);
    } else {
      fill(255);
      rectMode(CENTER);
      rect(width/2, height/2, 400, 200);
    }
  } else {
    background(48, 180, 89);
    if (mouseY > height/2) {
      fill(32, 48, 65);
      ellipse(width/2, height/2, 200, 400);
    } else {
      fill(255);
      ellipse(width/2, height/2, 400, 200);
    }
  }
}[/mw_shl_code]
趣味编程指南(6-1)-程序的流程控制-判断语句1图7
由于在第一层 if else 的两个分支里,写入了不同的背景颜色。所以鼠标左右位置变化,就会直接影响背景色。后面在两个分支内,又分别写入了一个 if else。通过多重状态的组合,就相当于将程序划分成了 4 个区域,4 种状态。
if 语句与取模运算 这里介绍一个比较巧妙的用法。它在 for 循环中使用频率非常高。过去我们一直通过 for 循环的 “i” 值,来影响绘图元素的部分参数。例如画一排圆,就需要用到 “i” 值来确定位置坐标。除此之外,我们其实可以对这个 “i” 作一些判断。比如进行取模运算(相当于求余数)。根据余数数值的不同,结合 if 语句就可以对大量元素进行分组处理。下面的例子中,当 “i” 为偶时,元素的填充色便设置为白色。否则(奇数时),填充色则为黑色。
代码示例(6-13):
[mw_shl_code=applescript,true]void setup() {
  size(700, 700);
  noStroke();
}

void draw() {
  background(132, 197, 100);
  int num = 10;
  float w = mouseX / 10;
  for (int i = 0; i < num; i++) {
    if (i % 2 == 0) {
      fill(255);
    } else {
      fill(0);
    }
    rectMode(CENTER);
    rect(width/(float)num * (i + 0.5), height/2, w, 600);
  }
}[/mw_shl_code]
趣味编程指南(6-1)-程序的流程控制-判断语句1图8



下期继续判断语句中的KeyPressed 事件,就是按键事件

iooops  中级技匠

发表于 2017-2-27 09:04:58

沙发
回复

使用道具 举报

iooops  中级技匠

发表于 2017-2-27 09:05:03

板凳
回复

使用道具 举报

iooops  中级技匠

发表于 2017-2-27 09:05:06

地板
回复

使用道具 举报

iooops  中级技匠

发表于 2017-2-27 09:05:19

让老夫先来666一下
回复

使用道具 举报

iooops  中级技匠

发表于 2017-2-27 09:06:41

感觉用了Processing就有趣味很多了呢
回复

使用道具 举报

iooops  中级技匠

发表于 2017-2-27 09:06:51

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail