那天,那只猫醒了。 (C基础)


N年前加3天,本上火刚接触编程时,的第二个程序(第一个是helloworld),就是这样一个程序。
今天,我们C语言基础也就来实现一下这样一个程序。当然这个程序比当初上火第一次写的肯定有所优化。
首先说明一点,本篇内容及程序,认为您阅读了之前上火写的C基础相关的文章,忍受了之前文章的枯燥与错别字(在此上火表示抱歉)。基本知道了C语言基础的数组之前的内容。这篇文章将会对C语言的基本程序结构部分数据类型数组进行应用。

这篇文章将按照上火学习编程第3天左右的进度来编写程序,所以不会使用新建函数及指针等之后的内容进行编写,这些以后讲到时进行优化
在编写这段代码时,上火总感觉这应该单独一个函数,那应该做个class(C++语言的内容),但最终考虑到这篇文章的进度,这里我们都没有使用

一、准备阶段

先看第一部分代码,这部分代码主要是为程序准备了一些参数。



首先我们要界面肯定要引用EGE的头文件graphics.h。
然后我们定义一些常量和全局变量
接下来初始化窗口和定义背景颜色,之前讲过,这没得说。
后面的这个setcaption是设置窗口的标题

二、地图

由于地图如果要真正生成要涉及很多内容,这里先用随机数生成一个完全随机的内容,铺满整个地图数组就好。



这里的randomize()是初始化伪随机数,因为这个随机数不是完全随机(如果完全随机太麻烦,一般程序都不需要完全随机)。
接下来两个for循环遍历整个地图数组,这里把数组每个元素走一遍称为遍历,以后遍历这个词会经常用到。
random()获得一个随机数,这里我们设置这个随机数在100以内。
然后那几个如果那么否则中是先随意写的内容,反正只要把整个数组先随便用这几个方块填满就好了。

三、使用图片

这里图像放在程序所在文件夹里的image文件夹中。



首先我声明了图片的位置和长宽,这样后面好用。
PIMAGE表示声明图片(结构体这种东西离目前进度太远了,这里就当做是一般声明的一个变量就好),声明的同时我用到了newimage这个函数来创建
使用getimage来获取图像,图像我放在image文件夹里的,图像类型是png。
顺带这里定义一下刚开始的人物坐标。

四、主循环

主循环里面我们获取了输入来移动人物,然后绘制了界面。



这里主循环就不解释了,之前说过。
我们在这循环中用kbhit()来判断用户有没有输入按键,如果有,我们用getch()来获取按键,放在switch中选择符合的值,对人物的位置进行相应的移动。

使用cleardevice()来清除屏幕,每次绘制内容都要整个重新绘制,而不能单独只绘制改变的内容。
遍历屏幕,根据窗口宽度除以图像宽度的方法,来确定遍历次数。
如果位置在地图范围内,这里我们要注意的是,我们窗口参照点是人物,所以我们移动的是地图,通过我们移动人物而不是地图,那人物一旦超出窗口,我们就看不到了至于这个判断逻辑,复杂度是今天这整个代码中最高的,虽然看上去很短,但大家仔细研究,刚开始的话,无法理解的朋友,可能要几个小时才能懂,这里直接给大家提供出来了,但希望大家还是去研究一下这个逻辑,不然换个地方又不会使用
还是用个switch来根据位置进行不同的绘制。用putimage把图片放在对应的位置上。这里为什么用i - 窗口宽/图片宽/2 + 坐标这些都希望大家好好研究一下,这个逻辑看上去简单,但大家不研究,换个地方肯定不会用。
之前那些绘制完成后,再把人物绘制到界面中间,整个绘制工作也就完成了。

程序每次循环中途还是要休息十几毫秒的,我们不能去把CPU占满了,照成电脑卡慢对吧。
delay_ms()中的毫秒数就是要休息的多少毫秒。我们先不考虑过于复杂的FPS追求,先最高60就行了。
主循环结束,当然程序也该返回结束了,虽然目前永远执行不到那一步,都是直接关闭窗口就结束程序,但还是返回个0,,C语言的标准要求的我们还是要写到位,至于EGE关闭之类的,我们关闭窗口自然也就关闭了,所以这里也就可以先不处理了,以后要加初始界面等才需要涉及到处理。

五、运行程序

按F5运行效果如下(使用wasd进行移动操作):



本文讲到C语言基础的综合应用,如有疑问欢迎加入Q群564998567与我们交流,如有错误恳请在反馈平台www.snang.cc/bgst/3/指出,如果可以请在微信里关注一下上火者公众号吧!。