马里奥碰到花朵就变身
提问者
什么是马里奥?
一个装着16×32个小色块的长方形,其中一些色块填着颜色,另一些没有。什么是花?一个16×16的正方形。什么是「变身」?把马里奥这个方块里面代表衣服的褐色变成红色,代表背带裤的红色变成白色。什么是褐色?暂且说它是0x这个数字。什么是「碰到」?马里奥的长方形与花朵的正方形有所重叠。什么是「重叠」?假设马里奥的这个方块占据屏幕(什么是屏幕?一个能装下×个小色块的矩形)中X方向到、Y方向21到52之间的区域,那么只要这个区域内有一点或更多点也被花朵所占据(比如花朵处在X到、Y21到36之间的区域内),我们就认为两者有所重叠。
编著回答者若给定以八个数值代表的两个矩形区域,请写出判断两个区域是否有重叠的C语言程序。如果你能写出来,那么祝贺你,如果有朝一日你想自己做一遍NES版本的《超级马里奥》,你至少知道让他变身需要做什么了。
是的,C语言也许「只能」做数学题。可是,绝大多数游戏的运行过程就是不停地做数学题,而所谓编写游戏,也就是把游戏的规则和游戏的效果转化为数学题而已。其中不少题目电脑都已经知道怎么解——是别的程序员事先告诉它的——比如「求一堆散落在三维直角座标系之中的多面体在8(x3)?10(y+1)?11(z?1)=0这个平面上一个给定范围内的投影」或者「给定一些彼此相连的顶点,求任意两点之间的最短路径」之类的数学题,它只需要千万分之一秒就能给你解好。这种能力有什么用?电脑上FPS游戏的本质活动就是不停地求三维座标系下的多面体经过变换之后在二维平面上的投影,不停地判断两个多面体是否彼此重叠,以及不停地寻找两个顶点之间的最短路径,最终达到让怪物冲到你面前咬你一口的目的。不止游戏如此,其他软件也都差不多,每一个细节都是某种数学题——比如知乎页面顶端的蓝色导航条背景,就是CSS描述的一个浅蓝到深蓝的渐变——渐变是怎么回事呢?给出两个数字分别代表两种颜色,以及第三个数字代表一段距离,求一系列颜色的数值以及次序,使得这段距离中两种相邻颜色之间的变化最小。数学题。别说C语言,一切编程语言最终都只能做数学题,根据给定的数据,算出另一些数据,算出更多的数据,然后存贮、发送或者呈现算出的数据。
不过我能理解你的困惑。投入大量时间看完教程,结果只能在黑框里输出一串数字。这是在学编程还是在向七十年代致敬?编程是这样无法给人成就感的活动吗?是,也不是。看你的表述,应该不是小孩子了,因为小孩子不会因为初学编程能做的事情很少而没有成就感,或者说,觉得这样做没有成就感的小孩子根本不会继续学下去。最初学编程的成就感单纯来自于「我居然可以指挥机器做一些事」,至少我小时候用中华学习机编一个程序帮我算暑假作业上的四则运算题时是这样感觉的。写出这些程序并用它解题虽然远比自己动笔去把题目算出来费时,却让人乐此不疲。那时候我还不知道马里奥碰到花会变身这种事情其实也是靠编程编出来,所以我也不会去想学编程「并不能做什么」。
提问者
无奈大多数人过了一定年纪就很难再靠「我能指挥机器」这种简单原始的快乐来驱动自己学编程。见过世面,听过传言,欲望和野心变得复杂而庞大,你想要图形界面,音乐音效,人工智能,云端同步,可是你闷头学了几堂课,还是只学会在黑框里显示一串数字。你怀疑这是学C语言的错,于是你到知乎上来问了这个问题。
你的疑惑是有道理的!
如果能把编程学下去,日后你就会明白,任何程序都是一座冰山,最终用户能看到的界面和使用的功能,只是程序浮在水面上的十分之一。知乎这个网站其实也是个运行在某台电脑上的程序,你能看到的十分之一是用什么编写的呢?HTML,CSS,JavaScript,或者Objective-C。而你看不到的那十分之九是用什么编写的呢?Python。这些你无法直接观测到的Python程序运行在世界某个角落的某些计算机上,隔着光缆、双绞线和无线基站,为你面前或掌上的用户界面注入生命。
二
如果能把编程学下去,日后你就会明白,任何程序都是一座冰山,最终用户能看到的界面和使用的功能,只是程序浮在水面上的十分之一。知乎这个网站其实也是个运行在某台电脑上的程序,你能看到的十分之一是用什么编写的呢?HTML,CSS,JavaScript,或者Objective-C。而你看不到的那十分之九是用什么编写的呢?Python。这些你无法直接观测到的Python程序运行在世界某个角落的某些计算机上,隔着光缆、双绞线和无线基站,为你面前或掌上的用户界面注入生命。
……可是Python是用什么编写的呢?C语言(当然,这么说并不严谨,Python理论上可以用任何其他语言实现,实际上也已经被用很多其他语言实现了,不过这并不是重点)。任何编程语言都是实现某个功能的工具,Python实现了知乎这个网站的大部分功能,而C实现了「用Python写程序」这个功能。为什么是C?
C很别扭又缺陷重重,却异常成功。固然有历史的巧合推波助澜,可也的确是因为它能满足对于这样一种系统实现语言的需要:既有相当的效率来取代汇编语言,且又足够地抽象而流畅,能够用于描述各种各样的环境之下的算法与交互。Cisquirky,flawed,andanenormoussuccess.Althoughaccidentsofhistorysurelyhelped,itevidentlysatisfiedaneedforasystemimplementationlanguageefficientenoughtodisplaceassemblylanguage,yetsufficientlyabstractandfluenttodescribealgorithmsandinteractionsinawidevarietyofenvironments.——C语言之父,DennisM.Ritchie
C是初代程序员所使用的语言,那时候硬件很贵,软件必须高效;而计算机的用户都是职业程序员,对于硬件有足够的理解。C贴近硬件,就意味着它容易译成机器能懂的语言,而它的设计者也并不需要操心普通人学起来可能会比较困难——而且,说真的,其实也不很难。但是,这么多年过去之后,软件规模变得越来越大,C就像锤子和手锯,修小木屋得心应手,造摩天楼就比较力不从心;但C语言可以用来造出其他更适合建造摩天楼的工具,乃至组成摩天楼的预制件,就好比用锤子和手锯造出挖掘机和吊车、混凝土板和一体门窗一样(当然,这个类比并不十分贴切。可是没有什么类比能贴切地描述软件工程,因为软件工程像许多东西,却又什么东西都不像)。所以,回到你的问题上来,是的,学会C计算机语言真的可以开发出很多东西,但除非内力深厚,场合适当,并且闲得蛋疼,大多数人不会拿C或者只拿C来开发太大的东西。如果你只是想要一门能够让你「编辑出一个啥子游戏或者软件出来」的语言,而且你用Windows,那建议你转去学学C#。它长得和C挺像,但却能迅速地写出至少是带有图形界面的程序,用起来也很方便,鼠标点一点就能让你对自己的程序看起来什么样有个比较直观的印象。还有,在国内,C#的教材也相当容易找到。当然Python也是一个很好的选择。
另外,还有一件事你必须弄明白:现代的所谓编程这一活动,其实大部分时候是在「合理地堆砌别人已经实现的功能来实现新的功能」,C语言莫不如是,比如printf这个东西,是别人做出来的「把一些数据按照指定格式输出到屏幕上」这一功能。而别人还做出来许多其他功能,比如「在发现用户短时间内连续两次按下鼠标又松开的时候调用你写好的一个函数」。学会怎样在C或者其他任何程序语言中使用这些既有功能,也是学习编程的一门重头戏。等你弄明白这一点,你也就找到了你问题的答案。尾注:题图画错了。马里奥身宽应为16像素,我画成了17。
你能想到的,C语言都能搞,可以说是无所不能,把C学好,上手其他语言也会事半功倍。题主只是还没有入门,只看教程不动手永远学不会,推荐10个C的入门小项目,由易到难,开始动手做一些常见的小东西吧。1.C/C++-C语言制作简单计算器用C语言做一个简单的计…显示全部
你能想到的,C语言都能搞,可以说是无所不能,把C学好,上手其他语言也会事半功倍。题主只是还没有入门,只看教程不动手永远学不会,推荐10个C的入门小项目,由易到难,开始动手做一些常见的小东西吧。
1.C/C++-C语言制作简单计算器
用C语言做一个简单的计算器,进行加、减、乘、除操作。项目涉及的所有数学知识都很简单,但输入过程会增加复杂性。
2.C/C++-C语言制作
是之前十分火爆的一款益智游戏。项目将使用C语言完成一个游戏。
3.C/C++-C语言版flappy_bird
FlappyBird是之前十分热门的小游戏,后来出现多个衍生版本。项目将使用C语言来实现一个字符版FlappyBird,感受不一样的风采。
4.C/C++-C语言版扫雷游戏
扫雷是Window系统中自带的经典游戏。项目将使用C语言完成一个简单的扫雷游戏。
5.C/C++-C语言编写万年历
本次课程将使用C语言完成一个简单的日历功能。输入相应的年/月即可看到当月的日历。
6.C/C++-C语言快速实现五子棋
用最最简单的代码来实现五子棋游戏,帮助大家复习基础知识,了解一个项目的开发流程。
7.C/C++-C语言模拟ATM自动取款机系统
用C语言实现简单模拟ATM自动取款机的查询、存款、取款等功能。效果为在终端下的字符界面。
8.C/C++-C语言利用epoll实现高并发聊天室
实现客户端和服务端编程,服务端使用epoll机制,高并发必备,支持多客户聊天室聊天;客户端使用epoll和fork,父进程与子进程通过pipe通信。
9.C/C++-C语言实现一个支持PHP的简易WEB服务器
本项目课主要用C语言实现一个简易的WEB服务器,并能支持动态解析PHP程序。
10.C/C++-C语言实现ping程序
本项目带领你学习用C语言实现ping命令。通过本项目中你可以更深入地理解TCP/IP协议,掌握C语言进行网络编程的技巧方法。
理论上C语言能开发出几乎所有软件。
但是,计算机发展了几十年,留下的大量的轮子和解决方案。C后产生的各种新语言和第三方库如此丰富,这已经是巨大的财富。我们没有必要回到石器时代去创建新的文明,而且就算重来,也未必能创建出更加优秀的文明。已经能站在巨人肩上,理性地选择拿来主义,择优出解决方案才是王道。我接触C语言完全是因为课程的安排。C基本语法掌握后,接下来就是数据结构。开始了想题主一样,做“数学题”。用C实现链表、平衡树、排序和一些算法等后,我也只是在后台黑框框输出我的成果,确实枯燥。但是这个过程对我的影响几乎是最大的。数据结构课程结束,我对编程的认识大致就是函数的logicalcontrol+存储的data。软件的运行其实也就是一大坨从现实需求中抽象出来的数据通过代码的控制逻辑一直在变化。后来看到NicklausWirth曾用“算法+数据结构=程序”来概括,看来我没有认识跑偏。在我看来,C语言抽象了2进制,它让我们大脑中的“数据”概念映射到了电脑中。即便同是数值,我们也有了更好被我们大脑理解的char。还有struct这种custom的数据集合,完全就是为了照顾我们愚蠢的大脑。我们