欢迎光临散文网 会员登陆 & 注册

春节在家写代码——编程游戏深度推荐(上)

2019-02-07 18:40 作者:皮皮关做游戏  | 我要投稿

作者:马瑶


春节难得有个长假,先在这里给大家拜年了。

过去的一年里,大家做游戏的水平有没有提高呢?

咱们的游戏开发群里已经有几千名爱好者,许多学习顺利的同学已经有了飞速进步;而学习进展不顺的同学可能还在苦苦钻研之中。

陷入瓶颈的时候,不妨尝试换个方法学习,说不定就能有所突破。所以趁着新春的躁动,为大家深度推荐两个编程游戏。

一个是2015年发布的老游戏《程序员升职记》(又名Human Resource Machine,人力资源机器),一个是几个月前发布的新游戏,也是前者的续作,名为《70亿人》(7 Billion Humans)。

游戏算不上很新,但是好东西永远也不会过时。我打算从专业性的角度来介绍真实编程与游戏之间的关系,希望能让大家体会到“编程”这种高端解谜游戏的乐趣。

另外由于很多人已经接触过《程序员升职记》,所以我附上了可运行的C语言代码(文末可下载源码),争取让玩过游戏的人看完本文也能有所收获。

1. 基本输入输出,无限循环

《程序员升职记》第2关,将输入栏中所有方块都放到输出栏里。

  1. inbox可以用来从输入栏(左边的传送带)拿出一个方块。

  2. outbox可以将手上的方块放在输出栏(右边的传送带)上。

  3. jump可以让程序跳转到任意一个位置。

思路就是取一个、放一个、然后回到第一步无限循环。等价的C语言代码:

// 模拟游戏的输入栏

char* inbox[] = {"A", "U", "T", "O", "E", "X", "E"};

void Level2()

{

       while(true)

       {

              bool b = false;

              int out = 0;

              // b用来区分数字还是字母

              b = INBox(&out);

              OUTBox(b, out);

       }

}

 

2. 变量:地板,数据的临时存放处

第3关,不用管输入,输出“BUG”即可。

copyfrom:将地板某个位置的方块复制到手上一份。

思路是挑出B、U、G三个字母放在输出栏。

等价的C语言代码:

void Level3()

{

       char floor[] = {'U', 'J', 'X', 'G', 'B', 'E'};  

    // false代表输出字母

       OUTBox(false, floor[4]);

       OUTBox(false, floor[0]);

       OUTBox(false, floor[3]);

}

 

3. 加减法和条件跳转语句

第14关,每次取出两个数字,输出其中较大的一个。连续操作直至用光输入。

  1. copyto:将手上的方块拷贝到地板指定位置。

  2. add:将地板某个位置的数字与手上的数字相加,结果还在手上。

  3. sub:同上,手上的数字减去地板的数字。

  4. jump if zero:如果手上的数字是0,则跳转,否则执行下面一句。

  5. jump if negtive:如果手上的数字是负数,则跳转,否则执行下面一句。

思路:先取两个数字,放在地板上,然后拿第二个数字减去第一个数字。

如果结果为负,说明第一个数字更大,取第一个数字输出;否则取第二个数字输出。

优化方案:巧妙利用先减再加的方式,可以只用一块地板。等价的C语言代码:


void Level14()

{

       // 求最大值,只用人手和一块地板

       int hand;

       int a;

       while (true)

       {

              INBox(&hand);

              a = hand;

              INBox(&hand);

              hand = hand - a;

              if (hand < 0) {

                     hand = a;

              }

              else {

                     hand = hand + a;

              }

              OUTBox(true, hand);

       }

}

 

4. 高级语法:引用(下标)

这个游戏的代码真的不好写。一路烧脑之后,坚持到29关,会发现真正的高级抽象代码登场啦!

第29关,输入一个数字,以这个数字作为地板的编号,取出对应的字母,然后输出该字母。

copyfrom和copyto出现新的变化:以前是直接指定地板编号。现在如果对地板编号加上中括号,代表取该地板上的数字对应的地板。(思路上再间接一次,如果说“地板12”代表第12块地板,那么“地板[12]”则代表地板12上面的方块8,也就是指第8块地板)。

等价的C语言代码:

// 模拟游戏的输入栏

char* inbox[] = {"4", "4", "1", "4", "1"};

void Level29()

{

       // 取地板上某一块作为临时变量

       int n;

       // 地板上的字符

       char floor[] = "NKAERDOLYJ";

       while (true)

   {

              INBox(&n);

              // n 被作为下标使用

              OUTBox(false, floor[n]);

       }

}

 

如果写成C语言反而很好理解——不就是数组下标嘛。

但是放在游戏中,这种间接的思路绝对是打开了新世界的大门,对编程思维有极大锻炼,强烈建议大家坚持玩过第29关。

玩到30关,真的会变强。

5. 终极操作:引用(下标)配合加减法

第30关,地板上放着一堆字母和0,每输入一个数字,都从该数字代表的地板开始连续依次取字母并输出,直到遇到0这一次操作结束。然后再不断重复这种操作。

最终会得到一串连续的字符,也就是解密了密码。

思路:这里并没有新的指令,但是我们如果将数字的加减法与引用地板配合,就会爆发出强大的功能。

  1. 输入一个数字,比如4,放在空的地板24上。

  2. 取地板[24],也就是4,并输出。

  3. 利用bump+,加1操作,4+1=5。

  4. 回到第2步,这时变成了地板5。

  5. 反复2~4,直到取到了0为止。

等价C语言代码:


char* inbox[] = {"4", "15", "7", "0", "21", "17", "11", "20", "2", "13", "4", "17", "21"};

void Level30()

{

       // 密码破译

       int n;

       char floor[] = "GET\0TH\0TAR\0AWAKE\0IS\0XXX\0";

       while (true)

       {

              INBox(&n);

              while (true)

              {

                     OUTBox(false, floor[n]);

                     n++;

                     if (floor[n] == '\0') { break; }        // 注:C语言中,'\0'等于0

              }

       }

}

 

代码执行过后,得到了字符串:

这句话联系到了这个游戏最后的秘密,细思极恐啊。

《程序员升职记》的玩耍建议

1. 玩这个游戏真的可以学编程,强烈建议对编程和游戏开发感兴趣的人玩一玩。这个游戏的算法覆盖了大部分编程基础内容,而且用这种类似“汇编”的代码实现难度很不低,很锻炼编程思维。

2. 这个游戏每关都有“强迫症挑战”,追求最小化代码行数和最佳化执行效率。也就是传说中的“优化”。

特别建议:一开始不要优化!除非对于有余力的同学可以尝试挑战,大部分人还是适合先把精力放在过关上面,玩到后面再回头看前面的问题就会很简单,到时候再优化也不迟(也可参考网上的答案进行优化,学习优化技巧)。

3. 在选关界面,右侧是主线,左侧是支线。中后期支线难度非常大,建议以攻略主线为主。

4. 有人问通关游戏是什么水平?恭喜你,虽然写真实的程序代码还是需要花时间学习,但是至少在思维水平和解决问题的灵活性上,你已经达到了相当不错的水准,如果开始学习编程进展一定会很快~~

5. 对于计算机专业的大学生或者自学编程的同学,如果学完基础知识但是不会做题,那就更要加倍推荐这个游戏了。


★ 本游戏有steam、wegame、手机版本,均支持中文。

参考答案有很多,请百度,比如百度经验就有:https://jingyan.baidu.com/article/ca00d56c26efaae99eebcfe4.html

务必在实在想不出来的时候再研究,或者学习别人的优化技巧。不求通关,但求进步。


本篇内容有点多,续作《70亿人》和其它编程游戏下期介绍(续作更精彩)。

本期源码地址:http://link.zhihu.com/?target=https%3A//github.com/mayao11/CodeGames


想系统学习游戏开发的童鞋,欢迎访问 http://levelpp.com/        

游戏开发搅基QQ群:869551769   

春节在家写代码——编程游戏深度推荐(上)的评论 (共 条)

分享到微博请遵守国家法律