C语言编程新手基础快速入门学习——循环语句

C语言是面向过程的,而C++是面向对象的

循环语句

对于人自身而言,长时间重复性的做同样一件事情,很容易疲劳并出错。但对于计算机而言,这却是它们的特长。我们已经学习过使用printf()函数向屏幕输出文本,假定现在要完成“重要的事情说三遍”这一壮举,我们可以这么做。

然而,如果重要的事情要说三百遍呢?显然我们需要有更有效的方式去完成这件事,因此有了循环语句。

循环语句具有一个条件测试部分与循环体部分。

循环体部分由一条或多条语句构成,当测试通过时执行循环体,否则结束循环。循环体语句还拥有一个控制部分,用于促使测试条件到达不成立状态,以达到退出循环的目的。

while语句

while语句的语法如下:

表达式测试在循环执行之前进行,所以如果测试一开始为假,循环体就根本不会执行。下面的程序输出数字序列1-10,循环结束后i的值为11

for语句

for语句是while语句的一种简写,因此更为常用,语法如下所示:

表达式1为初始化部分,它只在循环开始时执行一次。表达式2为条件部分,它在循环体每次执行前都要执行一次。表达式3称为控制部分,它在循环体每次执行完毕,在条件部分即将执行之前执行。

下面这个程序与上面的程序有同样的输出,但也有不同的一点。现代C语言中,允许在for语句初始化部分定义变量,如这里的i,这个变量的作用域是整个for循环,当for语句整体结束后,这个i便是无效的符号了。

break/continue

在循环语句中使用break语句,可以永久终止循环。在执行完break语句之后,程序将会跳转到循环正常结束后应该执行的那条语句处。continue语句仅用于终止本次循环。下面的示例中,for循环在输出数值1/2/3/4后便终止了循环体的运行,而while循环则是除了5之外的数值都被输出。你可以将这个while语句改为for语句,就会发现使用for语句更简明。

无限循环

for语句中的3个三表达式都是可选的,这表示它们可以省略掉。如果省略掉条件部分(即表达式2),表示测试的值始终为真,这时程序将进入无限循环状态(也称为死循环)。这相当于while语句的表达式部分给定真值一样。

如果运行了上面的程序,它将会不停的输出语句,这时可以通过任务管理器强行结束。显然无限循环并不是我们设计的目的,然而这样的设计结构确是在实际开发中存在的。比如说游戏引擎,运行于一个无限循环中:捉捕用户输入、渲染场景、输出画面等。当然,无限循环之所以存在,主要得益于break的存在:永久退出循环。

使用循环铺砖

在2D游戏地形实现中,通常是将地图切分许多称之为Tile的小块,然后根据地表信息使用对应的贴图对其进行装饰,比如哪里放置地面,哪里放置水域,又或者建筑等。对于现阶段的练习,出于简易性,我们将仅使用一张“地面碎石泥土”图片(Ground.png)来对地形进行填充。使用图片浏览器查看Group.png,可以知道它的大小是64x64,这代表地形中一个Tile的大小。

为了便于理解,我们先看一下最终效果图。需要注意的是,网格线与数字标号是后期加上去的。

地图水平方向我们使用10张贴图进行重复,宽度为:64x10=640(像素) 垂直方向没有完整标出,它是使用8张贴图完成,高度为:64x8=512(像素)

因此,我们创建的窗口大小为640x512。 窗口的大小也就是地图的大小,这两个值现在被保存在width/height变量中。 int width = 640; // 窗口宽度 int height = 512; // 窗口高度

首先,我们计算地图可容纳Tile的行列数 int cols = width / 64; // 地图宽度可容纳的列数 int rows = height / 64; // 地图高度可容纳的行数

在当前地图范围下,cols=10,rows=8,这表明地图被分割为80个Tile,也暗示我们需要将ground.png贴花80次,才能铺满整个地面。按照本节的理念,重复的事情用循环,这里我们选择for语句。

for ( int i = 0; i < cols * rows; i++ )

接下来看绘图部分,glmxDrawImage函数需要一个确切的x/y坐标,因此我们需要根据当前被绘制Tile索引计算出正确的坐标来。由于已经知道了地图宽度可容器的列数cols,计算当前Tile索引对应的行列值就很简单了。

int row = i / cols; // 当前tile所在的行 int col = i % cols; // 当前tile所在的列

每一行可以放置cols个Tile,因此i/cols就得到了当前Tile所在的行索引。 i%cols由计算出了正确的列索引,有了这两个数据后,根据图片大小,就可以计算出当前Tile的坐标了。

int x = col * 64; int y = row * 64;

至此,整个地面绘制流程如下

更新飞机

单独一个地面也显得有些过于无趣,在上一个例子中,我们已经加入了可飞行的飞机,只是它的方向有那么点不正确,这次我们一并修正一下。首先我们加入一个bool变量,表明飞机是否需要“调头”。

bool flip = false; // 飞机是否需要转向

我们的飞机默认行为是从屏幕右边飞向左边,这与图示中的方向一致,因此这个变量初始化为false,表明不需要转向。接下来,我们更新边界判断语句,当飞机到达左边时,让其转向。

不要以为这样就完事了,这里只是设置了转向变量。同图可知,真正的转向需要变换图像的方向,把飞机水平反转一下就有“调头”的效果了,这是使用glmxDrawImageEx()函数实现的。

glmxDrawImageEx( pic2, xpos, 80, 38, 34, GLMXFLIPHORIZONTAL );

前三个参数与glmxDrawImage()函数一致,38,34是指飞机图像的宽度与宽度,最后一个是绘制标志值,它是一个枚举类型,暂时可以认同这个类型与int一致,只是预定义了一组值供你使用罢了。这里的传递的是GLMXFLIPHORIZONTAL,如其名:水平翻转。

为了让我们有更好的理解,在源代码中,飞机正常飞行时,我们仍旧使glmxDrawImage函数,如果你理解了程序,可以统一使用glmxDrawImageEx函数改写,以消除这种使用不一致性,让程序代码更漂亮。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容