某人的游戏史

关于我带孩子玩游戏,有很多人表示不解:”别人家家长视游戏为洪水猛兽,你怎么还主动带孩子玩游戏,这以后要是沉迷游戏怎么办?”作为玩小霸王走上编程道路的我,笑而不语,其实我心里想的,恰恰是若要他将来进了大学不沉迷游戏,首先就要在大学之前把游戏玩透。而从游戏走向编程,可谓是玩透游戏的终极之路。

某人第一次接触游戏,大约是会说话的Tom猫,某人话都还说的不溜爸妈就拿这个猫逗他。这个以声音加速变频回放为核心功能的小游戏,给刚学说话的某人一个快速反应的交互对象,同时让他学会了与触屏界面交互。

某人坐在爸爸怀里的时候发现“鼠标”可以控制电脑屏幕上的东西,就开始试图抢来玩,爸爸无可奈何专门装了一台ubuntu系统的笔记本,给他玩Gcompris里的鼠标游戏,比如擦玻璃、接水管。我当然巴不得他学汉语前先学英语,学英语前先学C语言,可是饭是一口一口吃的,知识也需要循序渐进,没有乐趣的事情是难以持久的。

接下来,Gcompris里的其他游戏就慢慢进入了某人的游戏库了,什么足球射门、电路连接、小企鹅洗澡。然后爸爸开始在ubuntu的软件仓库里寻找类似的东西,发现了诸如ChildsplayTuxpaint,后来索性重装系统安装了edubuntu。windows下的各种全家桶太讨厌,孩子乱点很容易中招,看到什么莫名奇妙的八卦新闻那就尴尬了。

*Gcompris和Childsplay都是国外开源界多年积累的多语言教育软件,针对各种年龄段的孩子设计了各种不同类型的游戏,每一种都针对性的训练孩子的记忆力、创造力、排列组合、计算能力等等。

这期间,爷爷开始教某人认字,随着认识的字越来越多,他看书慢慢从看图多字少的卡片书,慢慢开始转向字多图少的小说,特别是科幻小说(目前看的是三体1和超新星纪元)。经常的使用电脑、长时间看书,让妈妈很担心他的眼睛会近视,于是就开始买很多的玩具来吸引他像其他同龄小朋友一样多玩玩”物理世界”的游戏。不管是物理世界的游戏还是虚拟世界的游戏,都是小朋友学习将来成人技能的过程。这种观点记得是赵忠祥说的,当然,他说的是小狮子们互相打闹的游戏。

玩具,成了我们日常生活的一大笔开销,有时我都不知道,是我在给孩子买玩具,还是我拿着孩子当借口给自己买玩具(显然是后者多一点)。在各种玩具中,某人最喜欢的是积木和火车轨道。

他第一次把一块儿三角形的积木放在方块上面,形成房子的模样,奶奶故作惊奇的表扬他,让他很受用,就开始迷恋上摆各种各样的房子。可见及时的表扬一下,哪怕是盲目的不加区分的“你真棒!”,也能让孩子充满了动力。

刚开始,某人把火车轨道当作是一种积木来拼,后来发现电动的火车永远按照轨道跑,这下触发了他的控制欲。控制欲是个好东西,因为在大脑里这货直接连着成就感。成就感我认为,就是驱动着所谓好学生饥渴的学习的力量,也同时是驱动着差学生沉迷于网络游戏的力量。要把这成就感导向到积极的光明面,这就需要原力更多的鼓励和表扬,最直接的鼓励就是在淘宝立刻定了几十节的充电电池,然后不断的买各式各样的火车和轨道,让轨道越拼越长。为了能得到更长的轨道,某个版本的电动火车,直接在阿里巴巴批发了10套回来。

玩具越来越多,各式各样的积木、各式各样的轨道火车,他每次都要把他们全都摆出来,把整个客厅当成他的游乐园,摆出来一大堆,然而他只管玩不管收拾,这可苦了某人他妈。

爸爸看到这种情况,开始寻找积木与火车主题的游戏,第一个上手的是手机上的”轨道火车”:

这是一个火车主题的解密游戏,要运用各种形状的轨道和机关控制火车开到终点,这回轨道不会摆的满地都是了。更重要的是,这游戏里隐含着程序分支的原始概念。

解迷游戏的弱点在于通关之后就是索然无味……没关系,火车是一个很有市场的主题。诸如模拟火车、桥梁建筑等关键词,各种市场一搜就是一大堆,为了避免不小心装了恶意扣费软件,把退役的安卓手机刷了个系统,不带SIM卡,专门拿来给某人玩游戏用,当然时间被妈妈严格控制着,不能超过15分钟。

不断的用新游戏来吸引注意力,各种套路见多了,也就不会特别的沉迷于某一款游戏了。

曾经沧海难为水,包括巫山都是浮云……

时间过的飞快,转眼某人上了小学,口算成了一个难题,某人极其郁闷的是“那些题我都会,就是时间来不及了!”

时间来不及?这还不容易,只要把每道题目的时间尽可能的缩短,加上一定的正反馈机制,让他不由自主的加速加速,哪怕错个一两题,总比剩下10几题没做过要好吧。

经过30分钟的js头脑风暴,口算训练游戏算是出炉了。

口算不愿意做,但是玩游戏拿积分,怎么就上瘾了呢?

一周后再次口算测试,某人骄傲的拿着100分回来,“我就说我都会做,就是来不及了而已嘛~”。

当乘除法出现了以后,自然就升级了乘除法的功能。

学习口算之余,偶而我们还玩玩用电工胶带铺轨道的“小火车”(其实就是淘宝上卖给大学生做课程设计的循迹小车套件):

 

后来,妈妈怀上了小弟弟,开始担心自己的身材,于是爸爸以将来妈妈产后恢复为借口,购入了Xbox360体感套装250G港版双破解(事实上最后妈妈是玩的最少的人……),这下某人又开启了新世界了。既然要玩游戏,怎么能没有主机。

先是微软体感大冒险、然后是舞蹈中心、型可塑、水果忍者,极大的锻炼了身体协调能力。接下来虚拟宠物、动物园大亨,然后就义无反顾的掉进了“我的世界”MC的坑。

*我的世界、MC,很多家长可能不知道,这是一个建造类游戏,在中小学生群体里非常流行。它的创造模式,就是给你无穷多的乐高积木一样的方块,让你充分发挥创造力和想象力,建造各种各样的建筑。

为了MC,打印了上百页的合成手册、游戏攻略,然后发现手册上说的很多东西xbox上找不到,原来主流玩家玩的是PC版。好吧,为了PC版另外装了一台Windows的笔记本,专门玩PC版。有一天,玩积木的时候突然提出,某人要当市长,在我的世界里要盖一座城市,接下来很长一段时间不停的磨,要求爸爸陪他建城市。爸爸实在不想在这无聊的沙盘游戏里花太多时间,又不忍心打击他的积极性,于是网上花了100大洋找人买了一个完整的城市地图送给他,这才得以脱身。

MC有点上瘾了,看来需要转移一部分注意力,嗯,城市。

“城市”这个词反复的被提及,爸爸想起小时候有个“模拟城市”,百度一搜,好家伙,这货居然还在出,从simcity1000 到2000、3000、4000、5,各种平台各种版本下下来。

*运行在Andorid平板中DOSBox里面的模拟城市2000。千万不要以为这只是一款无聊的模拟游戏,其中蕴含着丰富的经济、政治、社会知识。首先你手握50万美元,来到一块荒地,要从无到有创建一个大都市。如何规划生活区、工业区、商业区,如何获得电力、自来水、处理污水垃圾,如何降低失业率、增加人口、增加税收,如何提高工业水平、获得稀有资源,所有这些都巧妙的串联在一起,让你在不经意之间学习到很多复杂的概念,比如:债券、贷款、税收、预算。

刚开始还担心英文版以及复杂的预算变量小家伙接受不了,谁知道在拿到打印版的攻略之后,一夜之间徒弟就变师傅了,成天喊的我要盖城市变成了我要建伟大工程!识字这个技能树确实应该早点点开,这个要感谢爷爷。

游戏玩的多了,某人开始问,这些游戏是哪里来的呢?

我掩盖住兴奋的内心,故作镇定的回答:程序员写的。

(等你问这个问题好多年啦!)

于是“程序员”成了某人头脑里的神,终于有一天,某人问:“爸爸你能教我写程序么?”

既然时机成熟,Ubuntu那台老机器又请了出来,Scratch1.4隆重出场。

*Scratch是一种以控件为基本单位的编程语言,跟VB有点像,但是更简单,他把难记的关键词都换成了控件,除了精确的数字文本需要键盘,其他全部使用鼠标就可以完成,非常适合小朋友和初学者学习基础编程概念使用。

不可轻视的点灯机器人,这里面都有函数的概念了亲,你还要什么自行车?

*图中f1、f2,两个子程序,有的关卡是必不可少的哦。

http://www.hustoj.com/lightbot.swf

然后为了能让某人保持住对编程的向往,并用他喜欢的元素吸引他,我开始自学python,用python在MC里盖房子,来演示程序员的魔力!(看老爸给你露一手)

*用python脚本,1秒就可以建出这么复杂的建筑,问你手工一个个方块搭建要多久?知道了这种技巧,你还愿意自己手工建房子么?

并把源码托管在了github上,以备将来他自己学会Python大法的时候再来回顾。

https://github.com/zhblue/mcpi

(不过这个代码仅限树莓派或用复杂的私服插件,当然,学编程怎么能不买树莓派呢?)

然后是各种MC的官方教程、攻略、红石,最后终于搭建了自己的私服。同期安利了关于客户端和服务的基础知识,即所谓的C/S架构。

编程的路还很长……………………………………(PHP、Java在远处召唤~~)

接下来该怎么走,我也常常在发呆的时候思索。

要常常关注他最近感兴趣的点,然后找合适的有潜在理念的游戏给他玩。

比如他假期看了《科学向未来》,每一集最后的疯狂大联动他感觉有趣。

我就找古老的“不可思议的机器(dos版)”和“重返不可思议的机器(Win重制版)”给他玩。

*不可思议的机器,the incredible machine,通过各种机械物理装置,拼装组合达到一个个设定目标的解密游戏,通关方法不止一种,可以看作是中学物理实验室的游戏版。

忽然有一天,在朋友圈里看到了“海码爸爸”的推广信息

于是就加了QQ群:361999832(这样说会不会有硬广的感觉?)

发现了一群带有相似想法的家长和各位“船长”的网易云课堂。(不管了,强行安利)

进群以后开始把玩过的游戏乱发了一通,骗了不少赞。

群里大家的讨论也让我更有信心:从玩游戏到思考游戏背后的数学和逻辑,再到自己编程实现游戏;这一条路走下来,孩子就像打上了“减毒活疫苗”;到了大学里沉迷游戏的概率大大降低了,努力学习如何利用计算机知识制作游戏的概率大大提高了;那我们的目的也就达到了。

值得高兴的是,某人在看过几次船长们的直播讲座后,终于从游戏少年正式走上了编程转型之旅,还幸运的得到了证书和神秘礼物。

现在我们准备开始学python了,谢谢“海码爸爸”这个组织、这些热心人……^_^

今天,群主方丈请我写点东西,于是就有了此文。

2016-12-30

转发自 http://phdwu.com/2015/04/special-judge-usage-in-hustoj/

 

本文介绍了在流行、开源的ACM Online Judge平台——HUSTOJ上创建Special Judge题目的方法,并以两道题目为例,给出了具体的操作过程。

1 简介

随着ACM/ICPC比赛的不断发展,中国大陆地区已经有越来越多的高校参与到此项赛事中。这里这里可以看到2014年ACM/ICPC中国区六大赛区的参赛情况。

HUSTOJ(Google Code地址Github地址)是一款出色的开源项目,由华中科技大学前ACM队员Sempr等同学开发,2008年5月14日首先上线于华中科技大学,目前已有近百家学校、公司使用HUSTOJ进行计算机程序设计竞赛、计算机程序设计日常教学与测验、人才招聘等。

2 Special Judge

通常的ACM题目包括以下几项内容:题目描述(Description)、输入描述(Input)、输出描述(Output)、样例输入(Sample Input)、样例输出(Sample Out),在后台则包括测试输入(Input Data)和测试输出(Output Data)两项。在评测用户提交的程序正确与否时,系统会将样例输入和测试输入重定向作为程序的标准输入,通过判断程序对应的输出是否与期待的输出完全相同,来判断解答是否正确。

对于同一道题目,用户可能使用各种不同的方法来解答,所以对于某些特殊的题目,其结果可能不唯一,但都符合题目要求。此类题目就需要进行特判(Special Judge)。HUSTOJ便提供了特判功能。

这些题目主要有:
1、答案不唯一。见下例一
2、控制精度。题目要求输出精度在某eps之内。见下例二
3、其他。(欢迎留言补充)

3 Special Judge在HUSTOJ中的使用

主要步骤有:

1、在题目后台编辑页面启用该选项,如图1所示。

图1

2、编制data.indata.outspj.cc(或spj.c)。

3、编译出spj,设执行权限,连同2中的三个文件一起上传至服务器。

例一

下面以UPCOJ中的一道题目为例说明SPJ在HUSTOJ中的使用。
题目版权归原平台、作者所有,本文给出示例并不代表原题目使用同样方法进行评测。

给出一个不小于12的正整数n,请你输出两个合数,使他们的和等于n

分析题意,可以得出系统判断用户输出是否正确的两个条件是:

  1. 输出的两个数是否均为合数;
  2. 输出的两个数之和是否为n

首先分别制定data.in(测试输入)、data.out(测试输出)如下:

filename: data.in
1
2
3
4
3
12
15
1000
filename: data.out
1
2
3
8 4
9 6
500 500

然后编写spj.cc(特判程序)。HUSTOJ中的spj.cc需要有3个文件名参数传入:测试输入、测试输出、用户输出。
spj的返回值决定着判断结果,成功返回(0)表示AC,其他非零值表示WA。
下面给出一个本题spj.cc的示例代码。

filename: spj.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
bool is_prime(int x)//判断素数,伪代码
{
if(x是素数)
return true;
else
return false;
}
int main(int argc,char *args[])//主函数
{
FILE * f_in=fopen(args[1],“r”);//测试输入
FILE * f_out=fopen(args[2],“r”);//测试输出
FILE * f_user=fopen(args[3],“r”);//用户输出
int ret=0;//返回值
int T,n,a,b;
fscanf(f_in,“%d”,&T);//从输入中读取数据组数T
while(T–)
{
fscanf(f_in,“%d”,&n);
fscanf(f_user,“%d%d”,&a,&b);
if(a+b!=n || is_prime(a) || is_prime(b))
ret = 1;//Wrong Answer
}
fclose(f_in);
fclose(f_out);
fclose(f_user);
return ret;
}

编制完spj.cc后,将这些文件上传至服务器。

登录服务器以后进入/home/judge/data/[题号]文件夹,执行以下操作:

/home/judge/data/1000
1
2
3
acm@acm:/home/judge/data/1000$ sudo vim spj.cc #Edit the file spj.cc
acm@acm:/home/judge/data/1000$ sudo g++ -o spj spj.cc # gcc -o spj spj.c
acm@acm:/home/judge/data/1000$ sudo chmod +x spj

测试:

/home/judge/data/1000
1
2
3
4
5
6
acm@acm:/home/judge/data/1000$ ./spj data.in data.out data.out
acm@acm:/home/judge/data/1000$ echo $?
0 #Accepted
acm@acm:/home/judge/data/1000$ ./spj data.in data.out data.in
acm@acm:/home/judge/data/1000$ echo $?
1 #Wrong Answer

在本地HUSTOJ测试,通过网页提交,通过。

例二

某题目要求经过一定复杂计算后输出一个实数结果,精度要求控制在104内。
分析题意,可知spj需要判断测试输出a与用户输出x之差是否在eps之内。
spj.cc 如下:

filename: spj.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
const double eps = 1e-4;
int main(int argc,char *args[])//主函数
{
FILE * f_in=fopen(args[1],“r”);//测试输入
FILE * f_out=fopen(args[2],“r”);//测试输出
FILE * f_user=fopen(args[3],“r”);//用户输出
int ret=0;//返回值
int T;
double a,x;
fscanf(f_in,“%d”,&T);//从输入中读取数据组数T
while(T–)
{
fscanf(f_out,“%lf”,&a);
fscanf(f_user,“%lf”,&x);
if(fabs(a-x)>eps)
ret = 1;//Wrong Answer
}
fclose(f_in);
fclose(f_out);
fclose(f_user);
return ret;
}

如何优雅的停止Java线程?

interrupt

package threadTest;
import java.util.Date;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread a = new Thread(new Worker());
a.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a.interrupt();
}
}
class Worker implements Runnable {
public void run() {
// TODO Auto-generated method stub
try {
while (true) {
System.out.println(new Date());
Thread.sleep(100);
}
} catch (InterruptedException e) {
System.out.println(“Exited!”);
}
}
}

hustoj的用法

  1. 注册codeup.cn,开通校级账号,全网访问。
  2. 自建服务器,物理机虚拟机均可,校园网访问。
  3. 服务器托管学校机房,开通外网端口,外网访问
  4. 使用新浪云挂Web端,内网判题,全网访问。
  5. AWS免费服务器,低速全网访问。
  6. ————备案、收费的分割线————
  7. 廉价VPS,低速全网访问。
  8. 使用阿里云,高速全网访问。
  9. 新浪云挂Web,阿里云挂判题,利用新浪云提供域名及免费流量。
  10. 专用服务器,托管双线机房。

以上方案,从上到下,技术难度递增,成本、费用递增。

深渊

裂缝深不见底,阿呆差点掉下去。史蒂夫说,离那里远一点,下面是虚空,掉下去的话会摔出这个宇宙,你就再也回不来了。

史蒂夫看看表,剩下的时间不多了,我们只能选择造一座桥过这个深渊或者造一间房子来保命。

如果造桥的话,过了深渊可能天已经黑了,我们要赶回村庄还有一段路程,如果遇上僵尸怪,我自己还能保命,但是恐怕你得自己跟紧我。

如果造保命屋的话,你要帮我一起造,这样才能造一个足够我们两人过夜的房子。

选择

  • 造桥
  • 造房子

村庄

来到山坡下的村庄,阿呆才发现,原来山坡上一层层的并不是有意开发的梯田。而是因为这个世界一切皆为方块,山坡上的斜面也都具有马赛克效果,远处看起来就像梯田一样。

村庄里的有各式各样的建筑,商店、酒馆、学校、教堂,当然还有居民楼。史蒂夫说,你想去我家里看看么,还是打算闲逛一下?

选择:

  • 去史蒂夫家
  • 去酒馆

Stickman crossover Minecraft

阿呆是个火柴人,他生活在一个手机游戏中,爱画画的小男孩创造了他。名字叫阿呆,不是因为他呆头笨脑,而是小男孩儿给他画了一个大头两只手和三条腿,样子就是个汉字“呆”。根据程序员编写的指令,小男孩儿的手指头点到哪里,他就要跑到哪里。不管是上刀山还是下火海,他都毫不犹豫。小男孩儿一路上画各种工具、武器帮助他打败各种怪兽和坏蛋,他觉得自己就是小男孩在手机里的代言人。

小男孩的弟弟刚刚一周岁,还不怎么会说话的他也对手机充满了兴趣,只要有机会他就抓起手机像锤子一样砸向地板。砸的次数多了,手机外壳也裂开了,系统也开始出问题了。

地震发生时,呆正坐在熔岩流旁边等着下雨。突然一声巨响,醒过来时他发现四周有点异样。

首先是这草地的颜色,太绿了,绿的不真实。虽然他知道自己就不是一个真实的人物,但这种绿是他这辈子都没有见过的。

其次是空旷,以前他只见过上下左右,这是第一次,他领悟了什么是前后。一种心智开启的感觉从他扁平的二维身躯里泄露出去,手机闹钟响起来,查拉图斯如是说。

最后是光明,天边有个方方的东西及其缓慢的在移动,它发出温暖而柔和的金色光芒,这种感觉就像传说中夕阳的味道。不过呆从来没有见过太阳,他对这个假设不是特别有把握。

就在阿呆发呆的时候,山边梯田那里跑过来一个人。等这人离得近了,阿呆不由得乐了,怎么天底下还有人和我一样,长了一个方脑袋?再仔细一看,真要命,不止是脑袋,鼻子眼睛,嘴巴耳朵,就连身上穿的衣服,都是用一格一格方块拼出来的。

那人冲过来一把揪住阿呆,转身拖着手就走,说道你在这里干什么,天快黑了,想活命快跟我来。

啊!阿呆吓到一屁股坐在地上,这时天上飘过几个方块拼出来的大字“Minecraft”。

大地震动起来,一道裂缝迅速扩大。

选择:

裂缝出现在身后,阿呆和史蒂夫松了一口气迅速前往村庄

裂缝出现在前方,阿呆和史蒂夫面前出现了一道深渊