BB高低游戏怎么玩;代码M代码的饥荒代码使用方法法?

教你如何使用C语言编写简单小游戏_百度知道
教你如何使用C语言编写简单小游戏
我有更好的答案
C语言是计算机专业都要学习的一门基础学科。一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣。例如2048这款游戏:方法/步骤:#include&stdio.h&#include&stdlib.h&#include&time.h&#include&conio.h&#include&windows.h&#define SIZE 4static int score=0;void putn(int n[][SIZE]);void getn(int n[][SIZE]);int isempty(int n[][SIZE]);int isfull(int n[][SIZE]);void math(int n[][SIZE],char c);void tow(int n[][SIZE]);void toa(int n[][SIZE]);void tos(int n[][SIZE]);void tod(int n[][SIZE]);//主函数int main(){int i,j;int n[SIZE][SIZE];char c=' ';for(i=0;i&SIZE;i++){for(j=0;j&SIZE;j++){n[i][j]=0;}}printf( &***********************\n&& & & &2048(%dX%d) & & &\n&& & control:W/A/S/D & &\n&&press any key to begin \n&&***********************\n&,SIZE,SIZE);getch();system(&cls&);//n[0][1]=2048;//n[0][3]=2048;while(1){if(isempty(n))getn(n);putn(n);if(!isempty(n)&&isfull(n))sleep(200);c=getch();while(c!='w'&&c!='a'&&c!='s'&&c!='d')c=getch();math(n,c);system(&cls&);}printf(& & & &Game Over!\n&,score);return 0;}//函数void putn(int n[][SIZE]){int i,j;for(i=0;i&SIZE;i++){for(j=0;j&SIZE;j++)printf(&| & & &);printf(&|\n&);for(j=0;j&SIZE;j++){if(n[i][j]==0)printf(&| & & &);elseprintf(&|%4d &,n[i][j]);}printf(&|\n&);for(j=0;j&SIZE;j++)printf(&|_____&);printf(&|\n&);}printf(&score: %d&,score);}void getn(int n[][SIZE]){int a,b;a=rand()%SIZE;b=rand()%SIZE;while(n[a][b]!=0){a=rand()%SIZE;b=rand()%SIZE;}n[a][b]=2;}int isempty(int n[][SIZE]){int i,j,count=0;for(i=0;i&SIZE;i++)for(j=0;j&SIZE;j++)if(n[i][j]==0)count++;}int isfull(int n[][SIZE]){int i,j,count=0;for(i=0;i&SIZE;i++){for(j=1;j&SIZE-1;j++){if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])count++;}}for(j=0;j&SIZE;j++){for(i=1;i&SIZE-1;i++){if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])count++;}}return count&0?0:1;}void math(int n[][SIZE],char c){switch(c){case 'w':tow(n);case 'a':toa(n);case 's':tos(n);case 'd':tod(n);default :;}}void tow(int n[][SIZE]){int i,j,a;int m[SIZE];for(a=0;a&SIZE;a++)m[a]=0;for(j=0;j&SIZE;j++){for(a=0;a&SIZE;a++){for(i=0;i&SIZE-1;i++){if(n[i][j]==0){n[i][j]=n[i+1][j];n[i+1][j]=0;}}}}for(j=0;j&SIZE;j++){for(a=0,i=0;i&SIZE;i++){if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048){m[a++]=n[i][j];n[i][j]=0;}else if(n[i][j]==n[i+1][j]){m[a++]=n[i][j]+n[i+1][j];score+=m[a-1];n[i][j]=0,n[i+1][j]=0;}}for(i=0;i&SIZE;i++){n[i][j]=m[i];m[i]=0;}}}void toa(int n[][SIZE]){int i,j,a;int m[SIZE];for(a=0;a&SIZE;a++)m[a]=0;for(i=0;i&SIZE;i++){for(a=0;a&SIZE;a++){for(j=0;j&SIZE-1;j++){if(n[i][j]==0){n[i][j]=n[i][j+1];n[i][j+1]=0;}}}}for(i=0;i&SIZE;i++){for(a=0,j=0;j&SIZE;j++){if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048){m[a++]=n[i][j];n[i][j]=0;}else if(n[i][j]==n[i][j+1]){m[a++]=n[i][j]+n[i][j+1];score+=m[a-1];n[i][j]=0,n[i][j+1]=0;}}for(j=0;j&SIZE;j++){n[i][j]=m[j];m[j]=0;}}}void tos(int n[][SIZE]){int i,j,a;int m[SIZE];for(a=0;a&SIZE;a++)m[a]=0;for(j=SIZE-1;j&=0;j--){for(a=SIZE-1;a&=0;a--){for(i=SIZE-1;i&0;i--){if(n[i][j]==0){n[i][j]=n[i-1][j];n[i-1][j]=0;}}}}for(j=SIZE-1;j&=0;j--){for(a=SIZE-1,i=SIZE-1;i&=0;i--){if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048){m[a--]=n[i][j];n[i][j]=0;}else if(n[i][j]==n[i-1][j]){m[a--]=n[i][j]+n[i-1][j];score+=m[a+1];n[i][j]=0,n[i-1][j]=0;}}for(i=SIZE-1;i&=0;i--){n[i][j]=m[i];m[i]=0;}}}void tod(int n[][SIZE]){int i,j,a;int m[SIZE];for(a=0;a&SIZE;a++)m[a]=0;for(i=SIZE-1;i&=0;i--){for(a=SIZE-1;a&=0;a--){for(j=SIZE-1;j&0;j--){if(n[i][j]==0){n[i][j]=n[i][j-1];n[i][j-1]=0;}}}}for(i=SIZE-1;i&=0;i--){for(a=SIZE-1,j=SIZE-1;j&=0;j--){if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048){m[a--]=n[i][j];n[i][j]=0;}else if(n[i][j]==n[i][j-1]){m[a--]=n[i][j]+n[i][j-1];score+=m[a+1];n[i][j]=0,n[i][j-1]=0;}}for(j=SIZE-1;j&=0;j--){n[i][j]=m[j];m[j]=0;}}}
采纳率:100%
//声明#include&stdio.h&#include&stdlib.h&#include&time.h&#include&conio.h&#include&windows.h&#define SIZE 4static int score=0;void putn(int n[][SIZE]);void getn(int n[][SIZE]);int isempty(int n[][SIZE]);int isfull(int n[][SIZE]);void math(int n[][SIZE],char c);void tow(int n[][SIZE]);void toa(int n[][SIZE]);void tos(int n[][SIZE]);void tod(int n[][SIZE]);//主函数int main(){
int n[SIZE][SIZE];
char c=' ';
for(i=0;i&SIZE;i++)
for(j=0;j&SIZE;j++)
n[i][j]=0;
printf( &***********************\n&
2048(%dX%d)
control:W/A/S/D
&press any key to begin \n&
&***********************\n&,SIZE,SIZE);
system(&cls&);
//n[0][1]=2048;
//n[0][3]=2048;
if(isempty(n))
if(!isempty(n)&&isfull(n))
sleep(200);
c=getch();
while(c!='w'&&c!='a'&&c!='s'&&c!='d')
c=getch();
math(n,c);
system(&cls&);
Game Over!\n&,score);
return 0;}//函数void putn(int n[][SIZE]){
for(i=0;i&SIZE;i++)
for(j=0;j&SIZE;j++)
printf(&|\n&);
for(j=0;j&SIZE;j++)
if(n[i][j]==0)
printf(&|%4d &,n[i][j]);
printf(&|\n&);
for(j=0;j&SIZE;j++)
printf(&|_____&);
printf(&|\n&);
printf(&score: %d&,score);}void getn(int n[][SIZE]){
a=rand()%SIZE;
b=rand()%SIZE;
while(n[a][b]!=0)
a=rand()%SIZE;
b=rand()%SIZE;
n[a][b]=2;}int isempty(int n[][SIZE]){
int i,j,count=0;
for(i=0;i&SIZE;i++)
for(j=0;j&SIZE;j++)
if(n[i][j]==0)
count++;}int isfull(int n[][SIZE]){
int i,j,count=0;
for(i=0;i&SIZE;i++)
for(j=1;j&SIZE-1;j++)
if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])
for(j=0;j&SIZE;j++)
for(i=1;i&SIZE-1;i++)
if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])
return count&0?0:1;}void math(int n[][SIZE],char c){
case 'w':tow(n);
case 'a':toa(n);
case 's':tos(n);
case 'd':tod(n);
default :;
}}void tow(int n[][SIZE]){
int i,j,a;
int m[SIZE];
for(a=0;a&SIZE;a++)
m[a]=0;for(j=0;j&SIZE;j++){
for(a=0;a&SIZE;a++)
for(i=0;i&SIZE-1;i++)
if(n[i][j]==0)
n[i][j]=n[i+1][j];
n[i+1][j]=0;
}}for(j=0;j&SIZE;j++){
for(a=0,i=0;i&SIZE;i++)
if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)
m[a++]=n[i][j];
n[i][j]=0;
else if(n[i][j]==n[i+1][j])
m[a++]=n[i][j]+n[i+1][j];
score+=m[a-1];
n[i][j]=0,n[i+1][j]=0;
for(i=0;i&SIZE;i++)
n[i][j]=m[i];
}}}void toa(int n[][SIZE]){
int i,j,a;
int m[SIZE];
for(a=0;a&SIZE;a++)
m[a]=0;for(i=0;i&SIZE;i++){
for(a=0;a&SIZE;a++)
for(j=0;j&SIZE-1;j++)
if(n[i][j]==0)
n[i][j]=n[i][j+1];
n[i][j+1]=0;
}}for(i=0;i&SIZE;i++){
for(a=0,j=0;j&SIZE;j++)
if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)
m[a++]=n[i][j];
n[i][j]=0;
else if(n[i][j]==n[i][j+1])
m[a++]=n[i][j]+n[i][j+1];
score+=m[a-1];
n[i][j]=0,n[i][j+1]=0;
for(j=0;j&SIZE;j++)
n[i][j]=m[j];
}}}void tos(int n[][SIZE]){
int i,j,a;
int m[SIZE];
for(a=0;a&SIZE;a++)
m[a]=0;for(j=SIZE-1;j&=0;j--){
for(a=SIZE-1;a&=0;a--)
for(i=SIZE-1;i&0;i--)
if(n[i][j]==0)
n[i][j]=n[i-1][j];
n[i-1][j]=0;
}}for(j=SIZE-1;j&=0;j--){
for(a=SIZE-1,i=SIZE-1;i&=0;i--)
if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)
m[a--]=n[i][j];
n[i][j]=0;
else if(n[i][j]==n[i-1][j])
m[a--]=n[i][j]+n[i-1][j];
score+=m[a+1];
n[i][j]=0,n[i-1][j]=0;
for(i=SIZE-1;i&=0;i--)
n[i][j]=m[i];
}}}void tod(int n[][SIZE]){
int i,j,a;
int m[SIZE];
for(a=0;a&SIZE;a++)
m[a]=0;for(i=SIZE-1;i&=0;i--){
for(a=SIZE-1;a&=0;a--)
for(j=SIZE-1;j&0;j--)
if(n[i][j]==0)
n[i][j]=n[i][j-1];
n[i][j-1]=0;
}}for(i=SIZE-1;i&=0;i--){
for(a=SIZE-1,j=SIZE-1;j&=0;j--)
if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)
m[a--]=n[i][j];
n[i][j]=0;
else if(n[i][j]==n[i][j-1])
m[a--]=n[i][j]+n[i][j-1];
score+=m[a+1];
n[i][j]=0,n[i][j-1]=0;
for(j=SIZE-1;j&=0;j--)
n[i][j]=m[j];
}}}需要注意的是:srand((unsigned) time(0);rand();是固定形式,不要更改任何一个字符!如果不能编译,请把sleep(200);注释掉,如果提示不能找到system(&cls&);请把system(&cls&)更换为clrscr();
本回答被网友采纳
爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础 学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣. 1, 总是从Hello,world开始 学习编程的第一个程序,一般就是打印一个亲切的词语——&Hell o,world!&.让我们来看看这个最简单的C程序:#incolude
/*把输入输出函数的头文件包含进来*/int main(){printf(&Hello, world!&);/*在屏幕上输出字符串&Hello,world!&*/return 0;/*退出main函数,并返回0*/} 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过 .2,每执行这个程序一次都能看见上次运行留下的字符.3,我们 还希望屏幕输出一个笑脸来欢迎我们. 让我们来改进一下这个程序吧!1,在return语句的前面加一句:getch ();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio.h.3,ASCII码也有 许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可 以用printf(&%c&, 2)来输出一个笑脸. 现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧! 2, 心动的开始,一个运动中的笑脸 大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构:struct move_point{ int x,/*该点的位置,包括x坐标和y坐标*/ int xv,/*该点在x轴,y轴的速度*/};运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码:gotoxy(man.x, man.y);/*把光标移到指定的坐标*/printf(& &);/*输出一个空格,把先前的字符擦去*/然后我们让物体按其速度运动:man.x += man./*水平方向按x轴的速度运动*/man.y += man./*垂直方向按y轴的速度运动*/运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让 它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸:gotoxy(man.x, man.y);printf(&%c\b&, 2); /*输出ASCII码值为2的&笑脸&字符*/怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能 让我们来控制它运动呢?
不过这个程序没有什么目的,也没有什么判断胜负的条件.下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧! 4, 在迷宫中探索 小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜欢玩,还常到一些书上找迷宫玩呢.好的,现在我们用C语言来编个迷宫的游戏,重温一下童年的乐趣. 首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中map[x][y] == '#'表示在(x,y)坐标上的点是墙壁.DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息.在main函数里,我们定义了&小人&man的坐标和&目的地&des的 坐标.在游戏循环中,我们增加了一些用来判断胜负的语句:if (man.x == des.x && man.y == des.y) /*如果人的坐标等于目的地的坐标*/{ gotoxy(35, 3); printf(&Ok! You win!&); /*输出胜利信息*/….}在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不是有&墙壁&,如果有的话,就不能往前移动了.好的,我们在判断按键的switch语句的各个分支加上了判断语句,如下:if (map[…][…] == '#')/*如果前面是墙壁,就不执行下去*/哇噻!真棒,我们做出了一个完整的游戏了.当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性.不过,我们要设计一个更好玩的游戏—— 5, 聪明的搬运工 大家一定玩过&搬运工&的游戏吧!这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的&搬运工&吧!程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,'b'表示箱子,'#'表示墙壁,'*'表示目的地,'i'表示箱子在目的地.我们以后每推一下箱子,不但要改变屏幕的显示,也要改变map相应元素的值.游戏的主循环依然是接受按键.当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推箱子前进,否则不可移动.好的,我们在switch中增加了这些判断语句.程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了.真棒啊!我们可以做游戏了.而且是一个老少皆宜,趣味十足的游戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图,我们还可以相互分享好的游戏地图呢. 尾声: 在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的.C语言在与硬件联系紧密的编程中,也占有重要地位.其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习.象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法. 好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏.
本回答被提问者采纳
爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础 学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣. 1, 总是从Hello,world开始 学习编程的第一个程序,一般就是打印一个亲切的词语——&Hell o,world!&.让我们来看看这个最简单的C程序:#incolude &stdio.h& /*把输入输出函数的头文件包含进来*/int main(){printf(&Hello, world!&);/*在屏幕上输出字符串&Hello,world!&*/return 0;/*退出main函数,并返回0*/} 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过 .2,每执行这个程序一次都能看见上次运行留下的字符.3,我们 还希望屏幕输出一个笑脸来欢迎我们. 让我们来改进一下这个程序吧!1,在return语句的前面加一句:getch ();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio.h.3,ASCII码也有 许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可 以用printf(&%c&, 2)来输出一个笑脸. 现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧! 2, 心动的开始,一个运动中的笑脸 大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构:struct move_point{ int x,/*该点的位置,包括x坐标和y坐标*/ int xv,/*该点在x轴,y轴的速度*/};运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码:gotoxy(man.x, man.y);/*把光标移到指定的坐标*/printf(& &);/*输出一个空格,把先前的字符擦去*/然后我们让物体按其速度运动:man.x += man./*水平方向按x轴的速度运动*/man.y += man./*垂直方向按y轴的速度运动*/运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让 它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸:gotoxy(man.x, man.y);printf(&%c\b&, 2); /*输出ASCII码值为2的&笑脸&字符*/怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能 让我们来控制它运动呢?答案是肯定的,让我们继续往下学吧! 3, 交互的实现——让我们来控制笑脸运动 这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略处理.接受按键我们用以下两条语句:while (bioskey(1) == 0);/*等待按键*/key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/然后用switch语句来判断按键以及执行相关操作,如下:switch (key) /*对变量key的值进行判断*/{case UP: /*如果按的是向上键*/ … /*让物体向上运动,并退出switch*/case DOWN: /*如果按的是向下键*/ … /*让物体向下运动,并退出switch*/case LEFT: /*向左键*/ …;/*向左运动*/case RIGHT: /*向右键*/ …/*向右运动*/default:/*其他按键则忽略处理*/}怎么样,是不是有了玩游戏的感觉了?不过这个程序没有什么目的,也没有什么判断胜负的条件.下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧! 4, 在迷宫中探索 小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜欢玩,还常到一些书上找迷宫玩呢.好的,现在我们用C语言来编个迷宫的游戏,重温一下童年的乐趣. 首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中map[x][y] == '#'表示在(x,y)坐标上的点是墙壁.DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息.在main函数里,我们定义了&小人&man的坐标和&目的地&des的 坐标.在游戏循环中,我们增加了一些用来判断胜负的语句:if (man.x == des.x && man.y == des.y) /*如果人的坐标等于目的地的坐标*/{ gotoxy(35, 3); printf(&Ok! You win!&); /*输出胜利信息*/….}在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不是有&墙壁&,如果有的话,就不能往前移动了.好的,我们在判断按键的switch语句的各个分支加上了判断语句,如下:if (map[…][…] == '#')/*如果前面是墙壁,就不执行下去*/哇噻!真棒,我们做出了一个完整的游戏了.当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性.不过,我们要设计一个更好玩的游戏—— 5, 聪明的搬运工 大家一定玩过&搬运工&的游戏吧!这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的&搬运工&吧!程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,'b'表示箱子,'#'表示墙壁,'*'表示目的地,'i'表示箱子在目的地.我们以后每推一下箱子,不但要改变屏幕的显示,也要改变map相应元素的值.游戏的主循环依然是接受按键.当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推箱子前进,否则不可移动.好的,我们在switch中增加了这些判断语句.程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了.真棒啊!我们可以做游戏了.而且是一个老少皆宜,趣味十足的游戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图,我们还可以相互分享好的游戏地图呢. 尾声: 在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的.C语言在与硬件联系紧密的编程中,也占有重要地位.其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习.象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法. 好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏.
puts(“求赐教!”);
其他2条回答
为您推荐:
其他类似问题
您可能关注的内容
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。BB高低游戏怎么玩的?_百度知道
BB高低游戏怎么玩的?
BB高低游戏怎么玩的?更加无法放下。只因,往事早已化作心灵那一处最为柔婉凄迷的伤口,每当夜深人静时,又总会隐隐作
我有更好的答案
긞 긟 긠
采纳率:100%
东芝滚筒EHSF
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&figure&&img src=&https://pic1.zhimg.com/v2-33c41a2c33ed759e5038_b.jpg& data-rawwidth=&424& data-rawheight=&275& class=&origin_image zh-lightbox-thumb& width=&424& data-original=&https://pic1.zhimg.com/v2-33c41a2c33ed759e5038_r.jpg&&&/figure&&p&入门篇:&/p&&p&1、&a href=&https://www.zhihu.com/question/& class=&internal&&你是如何自学 Python 的?&/a&&/p&&p&2、&a href=&https://www.zhihu.com/question/& class=&internal&&如何系统地自学 Python?&/a&&/p&&p&3、&a href=&https://www.zhihu.com/question/& class=&internal&&编程零基础应当如何开始学习 Python ?&/a&&/p&&p&4、&a href=&https://www.zhihu.com/question/& class=&internal&&如何学习Python,以及新手如何入门?&/a&&/p&&p&5、&a href=&https://www.zhihu.com/question/& class=&internal&&你们都是怎么学Python 的?&/a&&/p&&p&6、&a href=&https://www.zhihu.com/question/& class=&internal&&如何零基础入门 Python?&/a&&/p&&p&7、&a href=&https://www.zhihu.com/question/& class=&internal&&自学Python,如何开始?&/a&&/p&&p&8、&a href=&https://www.zhihu.com/question/& class=&internal&&怎样用 Windows 入门Python?&/a&&/p&&p&进阶篇:&/p&&p&1、&a href=&https://www.zhihu.com/question/& class=&internal&&Python 爬虫进阶?&/a&&/p&&p&2、&a href=&https://www.zhihu.com/question/& class=&internal&&如何入门 Python 爬虫?&/a&&/p&&p&3、&a href=&https://www.zhihu.com/question/& class=&internal&&怎么用最短时间高效而踏实地学习 Python?&/a&&/p&&p&4、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&如何学习Python爬虫[入门篇]?&/a&&/p&&p&5、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Python常用库整理&/a&&/p&&p&6、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&一行Python代码能做什么?&/a&&/p&&p&练习篇:&/p&&p&1、&a href=&https://www.zhihu.com/question/& class=&internal&&Python 的练手项目有哪些值得推荐?&/a&&/p&&p&2、&a href=&https://www.zhihu.com/question/& class=&internal&&你都用 Python 来做什么?&/a&&/p&&p&3、&a href=&https://www.zhihu.com/question/& class=&internal&&可以用 Python 编程语言做哪些神奇好玩的事情?&/a&&/p&&p&4、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&70个Python练手项目列表&/a&&/p&&p&5、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&当Python遇上微信,可以这么玩&/a&&/p&&p&6、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&教你用Python来玩微信跳一跳&/a&&/p&&p&网络学习资源:&/p&&p&1、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&学好Python的11个优秀资源&/a&&/p&&p&2、&a href=&https://www.zhihu.com/question/& class=&internal&&哪里能找到 Python 视频教程地址?&/a&&/p&&p&3、&a href=&https://www.zhihu.com/question/& class=&internal&&有哪些值得推荐的Python学习网站?&/a&&/p&&p&书籍推荐:&/p&&p&1、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Python书籍推荐&/a&&/p&&p&2、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Python入门进阶推荐书单&/a&&/p&&p&我的真正零基础Python入门教程:&/p&&p&1、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&李云景:如何真的零基础入门Python?(前提篇)&/a&&/p&&p&2、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&李云景:如何真正零基础入门Python?(第一节)&/a&&/p&&p&3、&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&李云景:如何真正零基础入门Python?(第二节)&/a&&/p&&p&你还可以到我的公众号:&b&李云景&/b&,可以看我写的系统的真正零基础入门教程。&/p&&p&&/p&
入门篇:1、2、3、4、5、6、7、8、
&p&推荐一个&a href=&//link.zhihu.com/?target=https%3A//course.tianmaying.com/python-basic& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python入门基础教程&/a&,教程将Python的入门基础知识贯穿在简单易懂的实例中,边学边练适合入门。&/p&&p&在2017年旧金山召开的GitHub年度盛会GitHub Universe,GitHub公布了年度受欢迎编程语言排行,Python已经超过Java位居第二。实际上Python还是目前研究领域最为广泛接受的编程语言,特别是如今最为火热的人工智能领域。作为一门优美、精巧的编程语言,Python不仅仅适合作为编程入门,对于希望掌握实战开发技能进而从事编程工作的人来说,Python也是一个很不错的选择。下面针对初学者自学说一说入门的学习路径。&/p&&h2&1、建立开发环境&/h2&&p&建立开发环境非常重要,工欲善其事,必先利其器。做任何开发,首先就是要把这个环境准备好,之后就可以去做各种尝试,尝试过程中的话就能逐渐建立信心。初学者往往在环境配置中被各种预想不到的问题弄得很沮丧。&/p&&p&目前来说,使用Python的工作环境有如下几种:&/p&&ul&&li&&b&命令行交互环境&/b&:这是Python原生支持的工作环境,直接在命令行与Python进行交互。&/li&&li&&b&文本编辑环境&/b&:是集成开发环境的一种精简版,以Sublime-Text这类文本编辑器为代表。这种环境仅保留帮助你编写代码的核心组件,主要是提供给单人工作的场景使用,在没有太多分工协作的前提下专注于代码的编写。&/li&&li&&b&集成开发环境&/b&:如果想要使用Python编写较大的工程项目,特别是在很多人协同工作的情况下,可以考虑使用PyCharm这样的大型集成开发环境(IDE)。在这种环境下,IDE会将许多开发中需要的功能集成在一起,便于我们的使用。&/li&&li&&b&交互研究环境&/b&:在这种交互研究环境下,每次的代码都相当于是在之前代码上的增量,从而保证只有发生变化的部分被重新执行,无需对不发生改变的部分重新计算。特别适用于研究人员快速验证模型的正确性&b&。&/b&&/li&&/ul&&p&&b&初学者一般使用文本编辑环境就可以,当然也要了解如何在命令行中输入代码与Python进行交互。&/b&&/p&&h2&2、了解编程语言基础&/h2&&p&有了工作环境后,我们就可以开始编写和执行Python程序了。&/p&&p&Python这类脚本程序其实就像是一段“电影脚本”,按照从前往后的顺序规定了一系列的动作,指挥着你电脑的CPU、硬盘、操作系统等部件干这干那。所以为了让电脑能够看懂,你编写的这段“电影脚本”需要按照电脑所使用的语言进行编写。例如print(&hello world!&)这样一句话就会让电脑调用一系列部件,最后在屏幕上输出它对世界的问好;而a=3+5这样一句话就会让电脑计算3+5的答案,然后将答案放入一个名字为a的“盒子”当中。&/p&&p&所以初期你学习的是一些编写“电影脚本”的语法规则,在这个过程中你会逐渐了解到编程语言的一些基本元素:&/p&&ul&&li&&b&变量:&/b&变量就像是一个个存放了东西的盒子,用来保存一些临时的值或者那些需要多次使用的值。变量有不同的基本类型,比如数字和字符串类型。&/li&&li&&b&运算符&/b&:变量顾名思义,是可以不断变化的,而变化的手段就是对变量就行操作(或者称之为运算)。运算符是Python语言中一种直观的数据操作方式,它可以对特定的一个或者多个变量或常量进行运算并返回结果。比如最简单的加减乘除在Python语言中都有对应的运算符。&/li&&li&&b&条件控制&/b&:在Python程序执行的过程中,我们需要根据当前的状况来判断接下来让电脑做什么,这就是条件控制语句,它会将“剧本”拆分成两部分,在一种情况下执行第一部分,在剩下的情况执行第二部分。&/li&&li&&b&循环控制&/b&:有一些脚本我们有时候可能要重复执行,或者它们有很大程度的公共部分(例如输出1到100之间的100个整数,每次输出就非常相似),我们就会使用循环控制语句。我们也可以中断一次循环(continue)或者跳出循环(break)。&/li&&/ul&&p&使用这些元素,我们就能完成大部分的计算了,你可以编写一些简单的程序,也可以在命令行中通过这些语言元素对Python虚拟机发号施令啦。当然,如果你学习过另外一门语言,这部分基础是信手拈来的,那么对你来说更多是熟悉和适应Python的语法风格。&/p&&h2&3、掌握数据结构基础&/h2&&p&为了能够完成更复杂的计算场景,Python提供了若干种内置的数据结构。所谓数据结构,你可以认为一组变量以某个特定的方式组织在一起,而不仅仅是单个独立的变量。通过特定的组织方式,在处理某些运算时能够能够大大提高编程的效率。数据结构是计算机专业的一门必修专业课,更高级的数据结构及其内部实现方式你需要专门学习,不过Python的数据结构可以是一个非常好的学习起点。&/p&&p&Python内置的数据结构包含如下四种:&/p&&ul&&li&&b&列表&/b&:列表(list)在Python的语法中是一种有序且长度可变的集合,可以随时对其中的元素进行添加、删除和修改。我们往往可以用列表来表示各种队列、数组这种“有序”的序列。&/li&&li&&b&元组&/b&:元组(tuple)和列表基本相同,都是有序的序列,其区别在于元组内的元素一旦定义,就不能够再进行修改,只能够通过下标对元组内部的元素进行访问。使用元组,我们可以将一些数据有机的组合在一起进行表示。&/li&&li&&b&集合&/b&:集合(Set)作为一个复杂数据类型,如其在数学中的定义一样,在Python中也是起到表示一系列值的“集合”的作用。使用集合,我们可以快速的判断某个元素的存在性。&/li&&li&&b&字典&/b&:字典(Dict)在数学中并没有对应的定义,它更像是从生活中的字典借鉴而来的一种数据类型。例如手机通讯录就是一个典型的可以使用字典来存储的数据集。依靠字典,我们可以很方便的根据某个元素ID(例如编号、名字等)来查找到它。&/li&&/ul&&p&这四种数据结构能够覆盖大部分我们所工作的场景,&a href=&//link.zhihu.com/?target=https%3A//course.tianmaying.com/python-basic& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&天码营的课程&/a&提高了更多实例,熟练掌握这四种数据结构,你会发现编程效率会大大提高。&/p&&h2&4、掌握函数的基本概念&/h2&&p&在实际编写程序的过程中,某些代码可能会反复执行多次。而这些代码除了变量不同外,没有任何的区别。这些代码实际上类似于数学表达式中的函数f(x),当我们给x赋值时,就会得到对应的结果。在Python中也提供了这样的特性,同样称之为“函数”。&/p&&p&函数将需要反复使用的代码进行模块化,从而减少了代码的重复,同时还增加了可读性和可维护性。当需要修改时,只要改变定义内的代码,就可以完成对每一次执行的修改。&/p&&p&定义函数的语法其实很简单,关于函数重点需要掌握的是函数的参数定义。Python函数的参数定义(即如何定义函数的输入)非常有特色,比如:&/p&&ul&&li&&b&默认参数&/b&&/li&&li&&b&可变参数&/b&&/li&&li&&b&关键字参数&/b&&/li&&li&&b&命名关键字参数&/b&&/li&&/ul&&p&本质上这些特性使得函数调用者进行传参时会更加得心应手,如何定义这些类型的参数可以参考&a href=&//link.zhihu.com/?target=https%3A//course.tianmaying.com/python-basic%2Bfunction%230& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python函数的参数类型&/a&。&/p&&h2&5、面向对象编程&/h2&&p&面向对象是一种非常符合人类思维的编程方法,因为现实世界就是由对象和对象之间的交互来构成的,所以我们其实很容易将现实世界映射到软件开发中。举个例子,一辆汽车、一篇博客、一个人,对应到软件系统中都是一个对象;而对象具有自己的状态和行为。&/p&&p&&br&&/p&&p&&b&面向对象:类的定义&/b&&/p&&p&&br&&/p&&p&你需要了解一个面向对象编程的核心概念:“类”。类描述一类对象的状态和行为的模板。可以把类想象成一个汽车设计图,根据这个汽车设计图生产出来的每一辆汽车就是类的一个实例,这些实例就称之为对象。&/p&&p&状态和行为,对应到Python语言中,就是一个类和对象的属性和方法(类中的函数一般称之为方法),属性方法可以进行外部的访问控制,从实现“封装”这一面向对象特性。&/p&&p&&b&所以对应到Python这门编程语言,首先你需要了解如何定义类,以及定义类的属性和方法。&/b&&/p&&p&&br&&/p&&p&&b&面向对象:理解继承和多态&/b&&/p&&p&&br&&/p&&p&在“封装”的基础上,面向对象编程还有“继承”和“多态”的特型。假如我们有一个动物(Animal)类,它包含有动物最基本的一些特型。现在我们要新写一个犬(Dog)类,显然我们知道犬也是动物的一种,因此它也肯定包含动物类的全部特性。因此我们利用“继承”的特型,并不需要将动物类的所有代码在犬类中重写一遍,而是在创建犬类时继承动物类。此时我们将动物类称之为犬类的父类,犬类称为动物类的子类。而“多态”的特性使得犬类在继承动物类的方法时,也可以重写这写方法,使得它更有符合犬的特征。多态的详细内容可参考&a href=&//link.zhihu.com/?target=https%3A//course.tianmaying.com/python-basic%2Binheritance-and-polymorphism%230& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python的继承与多态&/a&。&/p&&p&面向对象编程方法的在大型项目中被广泛的应用。现在人们谈论到面向对象编程时,不仅仅是一种程序设计方法,更多意义上是一种程序开发方法,了解面向对象编程时每个程序员必须要做的事。&/p&&h2&6、学习函数式编程&/h2&&p&也许你还觉得函数式编程很陌生,但许多的函数式编程风格已经渐渐开始流行。什么叫函数式编程呢?事实上只要语言将函数作为一等公民(或者借助工具达到类似效果) 就可以支持函数式编程。而将函数作为一等公民意味着函数可以像变量一样传参、赋值和返回。函数式编程的书写方式使得代码编写的效率更加高,极大地提高生产效率。&/p&&p&你需要了解高阶函数、匿名函数(lambda表达式),闭包等一些基本概念;了解函数式编程最好的方式是从下面几个非常实用的高阶函数开始。&/p&&p&&br&&/p&&p&&b&函数式编程:了解高阶函数的用法&/b&&/p&&p&函数式编程:&/p&&p&map&/p&&p&map多用于对列表数据的处理,它将一个方法依次对序列的每一个元素使用,比如:&/p&&div class=&highlight&&&pre&&code class=&language-text&&def f(x):
return x*x
map(f, [1,2,3])
&/code&&/pre&&/div&&p&该代码就会得到[f(1),f(2),f(3)],所以结果是[1,4,9]&/p&&p&reduce&/p&&p&reduce利用递归的思想,会将前一次的计算结果作为第一个参数,将下一个元素作为第二个参数进行计算:&/p&&div class=&highlight&&&pre&&code class=&language-text&&def f(x1,x2):
return x1*x2
reduce(f, [1,2,3,4])
&/code&&/pre&&/div&&p&实际上等价于f(f(f(1,2),3),4),结果也就是24了&/p&&p&filter&/p&&p&filter会根据传入函数对象f的计算结果对原序列进行筛选,对于一个元素x, 留下f(x)为真(True)的元素,删除f(x)为假(False)的元素&/p&&p&sort&/p&&p&sort会根据函数的返回结果来判定两个数的大小关系,并依次作为依据对序列内元素进行排序,比如:&/p&&div class=&highlight&&&pre&&code class=&language-text&&def compare(x, y):
return y - x #逆序
myList.sort(compare)
&/code&&/pre&&/div&&p&最后得到的myList就会是从大到小排列的序列。&/p&&p&&br&&/p&&p&&b&函数式编程:lambda表达式&/b&&/p&&p&&br&&/p&&p&lambda表达式就是匿名函数,它直接实现了函数,而不需要定义函数名。比如上面排序的代码,我们就可以这样实现:&/p&&div class=&highlight&&&pre&&code class=&language-text&&myList.sort(lambda x,y: y-x)
&/code&&/pre&&/div&&p&通过lambda表达式直接定义使用,这样就不需要去额外定义一个compare方法,代码会更加简洁。&/p&&p&&br&&/p&&p&&b&函数式编程:闭包&/b&&/p&&p&&br&&/p&&p&在一般的函数中,返回值都是诸如数字、字符串之类的对象。但实际上函数的返回值可以是一个函数。返回的函数不仅仅包含有其自身的代码,也同时包含了调用时的参数,并且多次返回的函数之间互不干扰,这一特性被称为“闭包(closure)”。听这样的解释估计有点蒙圈,可以看看&a href=&//link.zhihu.com/?target=https%3A//course.tianmaying.com/python-basic%2Bfunctional-programming%231& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&天码营提供的闭包的示例&/a&。&/p&&p&函数式编程的学习并不复杂,学会使用函数式编程往往能够起到事半功倍的效果。能够熟练的使用Python函数式编程也是每个Python程序员应该掌握的能力。&/p&&p&&br&&/p&&h2&7、掌握更多标准库中的模块&/h2&&p&我们都说Python简单好用,方便易学,很大部分要归功于Python提供的功能强大的标准库。标准库意味着,Python已经帮我们封装好了很多底层功能,我们拿来即用。因此,标准库中的一些基础模块我们需要掌握。&/p&&ul&&li&&b&输入输出:&/b&最为“基础”的模块便是对输入输出的编程,我们都知道可以通过input(),output()来完成对数据的输入和输出。但是如果想要读取的是图片?二进制文件?甚至于各类奇怪格式的文件。这种时候,我们就需要通过IO编程来完成对这一过程的定制化。&/li&&li&&b&异常处理&/b&:我们编写的程序也可能产生许多错误,甚至有些错误是我们在设计时就预计产生的。但是我们不能让这些错误影响我们程序的运行。例如,使用Python爬虫获取1000个网页,如果在开始爬第一个网页的时候程序就出错了,那么一般情况下我们的程序就会自动终止,从而后续的网页也都不会爬取。但是我们可以使用异常处理,来“catch”住这些错误,将没有成功获取的网页记录下来,然后继续处理后续的网页。基于这样的方式,我们就可以安心的让程序跑上一个晚上,然后在第二天回来处理那些产生了异常的网页。&/li&&li&&b&多进程与多线程&/b&:我们还可以通过多进程和多线程使得我们的Python程序拥有可以并行处理诸多复杂事物的功能。并行是一种能够充分利用计算机计算核心(CPU/GPU)性能的方法。在目前单核计算能力增长逐渐放缓的现在,并行是少有的能够大大增加计算速度的技术了。想象一下,使用单核CPU训练一次模型如果需要20小时,通过多核GPU(GPU内部本身就是并行的)就很有可能将这个时间缩短到1小时内。这会大大增加对模型参数的调整效率。&/li&&/ul&&p&Python标准库还有很多内容,这里列的肯定是不全的;实际上随着Python版本的逐渐更新,还有更多的高级特性会被逐渐加入这门语言当中。毋庸置疑的,随着数据科学的发展,Python的使用前景也将越来越好。而在这个过程中,保持对Python的熟悉和了解,会是你紧跟技术潮流的最佳助力。更多Python的学习资料请见&a href=&//link.zhihu.com/?target=https%3A//course.tianmaying.com/python-basic& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python入门基础教程&/a&。&/p&
推荐一个,教程将Python的入门基础知识贯穿在简单易懂的实例中,边学边练适合入门。在2017年旧金山召开的GitHub年度盛会GitHub Universe,GitHub公布了年度受欢迎编程语言排行,Python已经超过Java位居第二。实际上Python还是目前研究领…
&figure&&img src=&https://pic1.zhimg.com/v2-b91ae0b057febe0_b.jpg& data-rawwidth=&960& data-rawheight=&590& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic1.zhimg.com/v2-b91ae0b057febe0_r.jpg&&&/figure&&blockquote&要不要转行(报考)软件开发?程序员的高薪让我流口水,但好日子总有个到头的时候吧?不会我一入行就见顶了吧?&/blockquote&&p&这样的问题让我不胜其烦。为子女未来前途操碎了心的长辈们,长辈们的朋友们,还有微信知乎上的朋友,像候鸟一样,在一年里的两个时间:春节期间和高考报志愿前夕,准时开问。我大概六月份回答过一位长辈的咨询,他说小陈,你说的好像很有道理的样子啊,应该发篇文章我好能转给我的朋友们。我说叔叔好啊,就写就写。结果开了个头,就因为懒的原因(主要是红包没到位),一直搁在今天。最近翻看 git repo 里面一票未完成的文章,这篇蹦了出来,伸长脖子一个劲儿地向我示意:poke me,poke me,所以,就有了大家看到的这篇文章。&/p&&p&文章有点长,可以直接跳到底部看结论 —— 但我知道,你们其实都有结论,就是心里不踏实,要找些定心丸 —— 那就还是看下去吧。&/p&&p&唐太宗说:以史为镜,可以知兴替。我们把视角拉到七十年前,看看历史上程序员这个群体是如何一步步壮大的。&/p&&p&&br&&/p&&h2&&b&社会和经济的变迁&/b&&/h2&&p&虽然程序员的祖师娘是诗人拜伦的女儿 Ada,但第一个真正的程序员,是 Alan Turing。Alan Turing 不仅提出了图灵机,他还在最早的计算机上写过代码。如果说 1946 年 ENIAC 的诞生可算做通用计算机的元年,那么,当时程序员的数量可能只有不超过 10 个。&/p&&p&程序员这时还算不上一个职业 —— ENIAC 走出实验室后催生出来了一批计算机,这些计算机需要有人去使用,于是有了第一代「程序员」,他们大多是半路出家的数学家和科学家。&/p&&p&我们耳熟能详的骨灰级程序语言:&/p&&ul&&li&科学计算语言的鼻祖,Fortran,由数学家 John Backus 老爷子在 1957 年发明;&/li&&li&函数式语言的鼻祖,LISP,由数学家 John McCathy 老爷子在 1958 年发明;&/li&&li&命令式语言的鼻祖,Algol,由数学家 Friedrich L. Bauer 老爷子(不是你们熟悉的 Jack Bauer)在 1958 年发明;&/li&&/ul&&p&所以我们现在学的计算机专业叫 Computer Science,一点儿也没有夸大其词,老爷子们同时对得起 Scientist 和 Engineer 的称号。&/p&&p&如果算上顺带研究计算机的教授,以及他们的学生,第一代程序员数量撑死了成百上千。这个时代的计算机还和普通人没关系,除非你在一流大学学习,或者在 IBM 公司任职,否则别说见过计算机了,你连用于写程序的「答题卡」都没见过。。。&/p&&p&1964 年 IBM 推出了划时代的 System/360 大型机,起价 130k USD。由于相对物美价廉,商业公司纷纷购买和租用,在接下来的数年里,S/360 席卷美国,卖了数万台,是历史上最成功的大型机。S/360 催生了大量的第二代程序员。如果说一台计算机配五个程序员的话,这个年代,程序员的需求猛涨到十万这个量级。&/p&&p&需求强劲,供给侧不给力,怎么办?如何填补这出人意料的大窟窿?&/p&&p&马爸爸说,员工离职,只有两个真实原因:钱没给到位;心受委屈了。反过来,想请君入瓮,先把钱给到位了。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-642bab86f22e45acecbbb04_b.jpg& data-caption=&& data-rawwidth=&1262& data-rawheight=&1600& class=&origin_image zh-lightbox-thumb& width=&1262& data-original=&https://pic1.zhimg.com/v2-642bab86f22e45acecbbb04_r.jpg&&&/figure&&p&这是我 google 的 S/360 程序员的薪水。你看,在 1973 年,市场能给一个两三年经验的程序员 10k - 18k 不等的薪水。要知道,同期美国人平均工资是 6.5k。在巨大的利益驱动之下,有能耐的人开始转型:先是高素质的数学才子,继而其他领域的优秀工程师工程师,甚至会计师,都纷纷跳进软件开发这片生气勃勃的蓝海。&/p&&p&1970 年 DEC 发布的 售价仅在 10k 美金左右的 PDP-11 进一步释放了计算机的魔力,价廉物美的小型机迅速占领了更广阔的市场 —— DEC 那年卖了 17 万台 PDP-11 —— 连贵族中学(比如盖茨老师就学的湖滨中学)都开始将这东西用于教学,计算机渐渐不是西装革履,三四十岁的「中老年」的玩物。&/p&&p&随后,产生了一些划时代的东西:&/p&&ul&&li&Pascal 由 Niklaus Wirth 在 1970 年发明;&/li&&li&Unix 由 Ken Thompson, Dennis Ritchie 在 1971 年发布(第一版就工作在 PDP-11上);&/li&&li&C 由 Dennis Richie 在 1972 年发明(PDP-11 的硬件设计也影响了 C 的设计);&/li&&li&面向对象程序语言的鼻祖,Smalltalk 由 Alan Key 等人在 1972 年发明;&/li&&/ul&&p&尤其是 Unix 和 C,它们的影响辐射了几乎每一个程序员,而且一直辐射至今。发明 Pascal 的 Wirth 还是象牙塔里的教授,而 Ken 和 Dennis,则是正儿八经的程序员,或者说软件工程师。&/p&&p&PDP-11 和 Unix / C 催生出第三代程序员。那时候没有前后端程序员之分,也没有系统层和应用层程序员之分,一个程序员既能和硬件中断打交道,又能提供优质的 UI(命令行界面)。市场对程序员的需求继续疯狂扩展。&/p&&p&也就是几年的光景,PC 开始挑战小型机的地位。76 年 Apple I 发布,81 年 IBM PC 发布,PC 一下子把计算机的价格拉到了一千多美元,是小型机的1/7 到 1/10,这下中产都能买得起了 —— 计算机的发展从此以无法想象的速度大爆炸。我们敬爱的盖老师看到了这一历史性的时刻,萌发了让千家万户的卧室里都有一台电脑的宏大志向。&/p&&p&八十年代单是 Apple II 就销售了上百万台,更别说千万量级的 IBM PC 及其兼容机。&/p&&p&这么大的增量市场,需要海量的程序员来填补软件上的空白。到 1990年,还没有发布 Windows 95,行业地位并未垄断的微软已经有 5600 名雇员(其中主要是程序员),收入 11 亿(见:&a href=&http://link.zhihu.com/?target=https%3A//www.thocp.net/companies/microsoft/microsoft_company.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&thocp.net/companies/mic&/span&&span class=&invisible&&rosoft/microsoft_company.htm&/span&&span class=&ellipsis&&&/span&&/a&)。80年代的第四代程序员的数量,估计已经膨胀到了百万的量级。&/p&&p&八十年代产生的重量级语言是 C 的两个继承人:&/p&&ul&&li&Objective-C 由 Tom Love 和 Brad Cox 在 1984 年发明,其脱胎于 Smalltalk,根正苗红,却并未被市场认可;&/li&&li&C++ 由 Bjarne Stroustrup 在 1983 年发明,迅速被市场认可;&/li&&/ul&&p&90 年代多媒体电脑来临,奔腾的心配上 win95,个人电脑真正进入千家万户。大街小巷传唱的 &You don't even have to try, it comes easy for you ... good times, bad times gimme some of that& 简直就是程序员的内心独白。&/p&&p&win95 第一年的销售是四千万个拷贝。而个人电脑在 98 年,跨过了上亿的年销量。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-8fe7cde01f821_b.jpg& data-caption=&& data-rawwidth=&480& data-rawheight=&306& class=&origin_image zh-lightbox-thumb& width=&480& data-original=&https://pic2.zhimg.com/v2-8fe7cde01f821_r.jpg&&&/figure&&p&99 年到千禧年的世纪之交,一年时间,Microsoft 的雇员从 31k 涨到了 39k。而上文中提到的十年前的数字是,5.6k。猜猜 90 年代的第五代程序员的需求?起码在八十年代的基础上翻两番。&/p&&p&之后的历史大家应该都比较熟悉了,我就不详述了。互联网崛起,社交网络崛起,移动互联网崛起。从 07 年到 17 年,单是 mobile developer(iOS/android) ,从零增长到 1200 万(见:&a href=&http://link.zhihu.com/?target=http%3A//www.businessofapps.com/12-million-mobile-developers-worldwide-nearly-half-develop-android-first/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&businessofapps.com/12-m&/span&&span class=&invisible&&illion-mobile-developers-worldwide-nearly-half-develop-android-first/&/span&&span class=&ellipsis&&&/span&&/a&)。&/p&&p&这是一个多么可怕的数字!早期入局 mobile 的程序员将享受到无与伦比的红利。&/p&&p&而现在,全世界的程序员已经在数千万这个量级(github 用户数已突破 2100 万)。AI,Big Data,Crypto Currency,IoT 不出意料将会是新的需求大户。2017 年,美国劳工部公布的(&a href=&http://link.zhihu.com/?target=https%3A//www.bls.gov/news.release/jolts.t01.htm%23jolts_table1.f.3& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&bls.gov/news.release/jo&/span&&span class=&invisible&&lts.t01.htm#jolts_table1.f.3&/span&&span class=&ellipsis&&&/span&&/a&)在 IT 行业这个 sector 下,每月平均有 100k job opening,我们按半数是新增来计,全年 600k new opening,如果其中 1/2 是程序员,全美一年 IT 行业的程序员新增需求是 300k。考虑到其他行业虽然不属于 IT,如 Finance,Education & Health service 等,但也有大量程序员的需求,各行各业全部加起来也按 300k 算,那么一年 600k 新增需求,而 2016 年的 CS new grad 不到 50k。缺口依旧巨大。&/p&&p&历史告诉我们,对程序员的需求不仅仅总体强劲,围绕着热点的,局部的差异更加可观。PDP-11 热销的时候,C / unix 程序员相对于 Fortran 的新增需求,可能有十倍的差距;windows 时代,windows 平台上的程序员的新增需求,相对 unix,可能又是数十倍甚至百倍的差距。&/p&&p&另外一个有意思的特点是,由于供需的不平衡,在不同的地域间(比如中美),程序员这一职业产生了巨大的套利空间。聪明的公司会利用这个空间来降低自己的支出,从而引发低价格的区域的程序员溢价(鲶鱼效应),从而推高程序员的总体平均价格。2006 年我在 Juniper 时,一个美国程序员的薪水,相当于中国程序员的 3-4 倍,如今,仅仅在 2 倍上下(当然这也得益于中国互联网一日千里的发展)。印度的大量软件外包(劳务)公司,如 InfoSys,则是把程序员套利交易做成了一个利润空前的生意。&/p&&p&回顾这段历史,还有一个很值得玩味的地方:&b&市场一直对程序员的需求强劲,可靠的供给却严重不足&/b&。70 年来,几乎平均每五年,对程序员的需求就增长一倍。这意味着市场上大量充斥着 & 5 年工作经验的,新入行的程序员。这意味着什么?在这样一个疯狂的市场下,程序员这个职业本身已经获得比其他职业高得多的溢价,而靠谱的,有经验的程序员,则很容易在这个溢价的基础上,再翻上一两番。没办法,这是供需决定的。&/p&&p&供需的极度不平衡,局部领域(地域)变态级的不平衡,是程序员高薪的第一个秘密,也是最主要的一个秘密。&/p&&p&第二个秘密往往被人忽略,那就是,软件公司,尤其是互联网公司,有着无法企及的 unfair advantage:&b&它的融资成本太低了,太流氓了,流氓到美联储都自叹弗如。&/b&&/p&&p&就像美女爱英雄,贪婪的资本偏爱天生就具备颠覆能力的软件行业。开个服装店,你不大可能从银行拿到贷款,更别说找风投了;然而你注册个 deeperlearning.ai,放个漂亮的 landing page,VC 的肾上腺素就开始飙升 —— 如果你不是在忽悠,真有个五道杠的能力,且确实在做事情,那么你很大机会拿到一大笔让别人艳羡的资金。这是 startup 的现状。拿了钱干嘛,投资比特币当然是从市场上抢更多的程序员啦,然后拉新留存促增长,再融资,再招更多的程序员,一路循环下去,然后要么成为独角兽,要么卖身,要么玩完。&/p&&p&那位说了,这是 startup,不算数,要比就比上市公司。那我们看看宇宙最奇葩公司 amazon,就是那个上市十几年不盈利,靠讲故事和描绘未来蓝图让投资人屁颠屁颠为其市梦率添砖加瓦十几年的 amazon。从资产负债表来看,二者其实同样算是零售行业 —— 可过去十年,walmart 收入增加了 1370 亿,市值仅增加了 360 亿,而 amazon 在几乎不盈利的情况下收入仅增加了 1210 亿,市值却增加了 4620 亿,相当于增加了两个 walmart(来源:&a href=&http://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DGWBjUsmO-Lw& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&youtube.com/watch?&/span&&span class=&invisible&&v=GWBjUsmO-Lw&/span&&span class=&ellipsis&&&/span&&/a&,12分钟附近)。所谓男怕入错行女怕嫁错郎,walmart 这样的凤凰男使出浑身解数赚出一个个 penny 来讨好那个叫华尔街的小姐姐,人家转身施着粉黛,轻解罗裳上了 amazon 这纨绔子弟的靠融资借来的兰舟。&/p&&p&其他巨头虽然没有 amazon 这么离谱,但也是市盈率高得像个创业公司。本身的高利润,再加上低融资成本,使得他们在人力资源的竞争上,几乎是在降维攻击:拿着超高的市盈率,左手甩着大把钞票,右手挥舞着价值还预期会不断上涨的股票,他们想要什么人,就要什么人。&/p&&p&第三个秘密是,大公司出于对未来的恐惧,为维持其统治地位,从战略层面进行无休止的人才争夺。甚至,有时候延揽人才的目的是「走自己的路,让别人无路可走」—— 有谁还记得两千年前后,华为包下几乎所有一本院校的 CS 学生?让中兴(和其他企业)欲哭无泪?&/p&&p&我们知道,软件行业的高额利润(或者高额预期利润)几乎都来自于其垄断或者寡头地位。居上位者要保其位,居下位者时刻都觊觎着上位。和绝大多数行业不同的是,软件行业的农民起义来的太容易了些(这也是为何 VC 偏爱这个行业):几颗有想法能行动的脑袋就可以向巨头发起挑战。这让巨头永远保持着一种「离破产只有 18 个月」的恐惧。&/p&&p&这些获得了食物链顶端地位的掠食者,新巨头,比如 google,曾经也是起义军。和老巨头(e.g. microsoft)血战之后上位,身上的伤口还没结痂,不一会身后就有新的掠食者(e.g. facebook)喘着粗气伺机抢夺地盘。新巨头为了维持自己的地位,将行业的人才尽数延揽,给潜在的陈胜吴广们或许以王侯将相,或缚以良田美酒,既可以为自己攻城略地,又有效减少他们直接造反,或者加入新掠食者(e.g. facebook)的机会;而后者,在某个利基市场上活得滋润后,必不甘心久居人下,用更好的诱惑挖角巨头。就像战国时期养士成风,你千金买马,我就千金买马骨。受益的自然是我们这些「士人」。&/p&&p&在硅谷,一个公开的秘密是 counter offer。程序员拿了 F 家的 offer,再去 G 家整一个,即便对 G 家无感,如果 G 家的 offer 更大一些,回过头来再跟 F 家 recruiter 说,99% 的概率能拿到 counter offer。&/p&&p&某个程序员真的这么不可或缺么?似乎不是。像 google 这样的巨无霸,如果每个 team 各裁去 1/3 的程序员,业务估计不会受损,说不定还有提振哩!但是,谁都不敢说那个被我放弃的程序员会不会就是第一张多米诺骨牌呢?更何况,老子这么拽,口中餐却被后进小生截胡,这气怎能咽得下去!&/p&&p&总结一下,强劲的需求,人神共愤的超低融资成本,巨头对未来的恐惧,三个因素,大大催高了软件人才的价格。&/p&&p&上文说了,如今,我们又迎来了新一波浪潮,最抢眼的几个潮头是:AI,Big Data,Cryptocurrency 和 IoT。看上去,软件行业对程序员的强劲需求,还在继续延续。什么时候这一波又一波的浪潮才会停滞下来?我不知道。如果让我大胆地估计一下,也许就跟第一二次工业革命吞噬农业人口一样:当几乎所有的劳动力都在为信息产业打工(这不意味着他们都是程序员),当几乎所有的行业被软件重新定义完成后,才是程序员这个职业饱和的时刻。&/p&&p&而当下的软件行业,虽然程序员的体量已经足够庞大,但整体还在 early majority 的范围,而局部,甚至仅仅处于 innovators / early adopters 的位置:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-5e2fb360f3c593ff72112f_b.jpg& data-caption=&& data-rawwidth=&2480& data-rawheight=&1736& class=&origin_image zh-lightbox-thumb& width=&2480& data-original=&https://pic4.zhimg.com/v2-5e2fb360f3c593ff72112f_r.jpg&&&/figure&&p&所以程序员的好日子还远没到头呢。而且,如果你是女性朋友,对软件开发感兴趣的话,更要好好考虑一下这个职业:这个职业女性的比例小于 8%,严重失衡。女性在这个方向上大有作为,更容易脱颖而出。&/p&&h2&&b&个人如何提升自己的价值(leverage)&/b&&/h2&&p&好了,定心丸有了。下一个问题是:我该怎么办?毕竟程序员和程序员在个体上还有很大的差别 —— 我可不想入门便成为庞大分母的一员。&/p&&p&first thing first,我们先要对自己有一个明确的定位。我的职业生涯究竟想干嘛?该干嘛?&/p&&p&我经常看到程序员称自己为:java 程序员,iOS 工程师,windows 程序员,spark 工程师 ... 这么定位是极其不妥的,没想清楚就随波逐流。记住:&b&你绝对不要把自己的职业生涯和某个语言,某个产品,某种系统挂钩,绝对不要!&/b& 你见过有医生称自己是四环素医师,或者西门子螺旋 CT 医生的么?&/p&&p&某个编程语言会随着时间淡出人们的视野,某个软件产品有其不可避免的生命周期,总有一天它们会 EOL(end of life)—— S/360,Solaris,DOS,Fortran,Cobol,Delphi 等等,曾经那么辉煌,如今都烟消云散了 —— 但它们内在的思想,构建的技术是相通的。所以我们应该 &b&围绕某个技术方向来定位职业生涯&/b&。如果你心仪安全技术,那么就围绕着安全技术打造自己的核心能力;如果你痴迷分布式系统,那么就在这个领域发力。如果你仔细看上文中提到的 1973 年的招聘广告,large scale 这样的词就已经出现。你要想,几十年来,哪些技术和方向一直在演进,而非直接消失?&/p&&p&想明白了自己的定位,你才能从容从一个浪头跨入另一个浪头。&/p&&p&有了定位,接下来很重要的一件事就是打造自己的 unfair advantage。&/p&&p&unfair advantage 这个词儿有些猥琐,有点我的幸福要建立在你的平庸上一样。但这就是商业社会的本质。google 的强大的吸金能力就是建立在其无与伦比的 &Organize the world’s information and make it universally accessible and useful& 这样的信息处理能力上的 unfair advantage。除了它,没人做的了,所以他能据此产生比印发钞票还要高效的利润。&/p&&p&程序员的 unfair advantage 该是什么?我觉得,大概有这么几个方向:&/p&&ol&&li&我是组织中的关键因子 —— 有了我可以提升团队,产品或者服务的档次&/li&&li&我能够做平均水平 10x 的贡献却只拿 2x 的 package&/li&&li&我是难得的复合型人才:在代码写的好的人里我架构能力最强;在架构能力强的人里我表达能力强;在表达能力强的人里我公共关系最好,等等&/li&&/ol&&p&要成为组织中的关键因子,你得先成为某个 niche 的专家,比如能够突破现有系统的瓶颈,使其支持 10x 的 traffic;再比如能够把用户的 churn rate 降低 5%。注意我这里的描述都是场景化的,是冲着某类问题去的,而非冲着某种技术。懂某种技术的人很多,但能够用技术解决好商业上实实在在的问题才是关键因子。&/p&&p&程序员群体是个创作群体,创作群体的特点是突出的个体,其价值要远高于于平均水平。画家平均的画作售价不会超过 $500,但毕加索一幅画可以拍出数千万美金。优秀的程序员做出超过行业平均水平 10 倍的绩效,并不困难。注意这里 10 倍的绩效,并非说你写 100 行代码的时间里,我能写 1000 行,而是说在相同工作时间里带给公司的额外价值。&/p&&p&怎么带来额外的价值?最基本的要求是 &b&要带着脑子工作,多琢磨事情怎么能做得更好&/b&。不少程序员活得像被动接受指令的机器人 —— 老板指哪打哪,其他不关我事。这样的人,无法指望其可以做出额外的贡献。反之,平日里多想现存的问题,可以优化的地方,多找市场上优秀的实现方案,多方求证 ROI,在内部向利益相关人兜售自己的主意来获取认可,并调动自己和周边的资源将其落地。这样的人,走到哪里都能脱颖而出。&/p&&p&成为复合型人才就不多解释了。&/p&&p&有了 unfair advantage,你已经立于不败之地。如果还想最大化自己的价值,那么需要瞅准时机,变换赛道。程序员最忌讳的是把自己囿于一方小小的格子间,两耳不闻天下事。七十年的光景,软件行业迎来(同时送走)一个又一个潮头。一次浪潮,从启动,到崛起,到爆发,再到消亡,前后也就是二十年光景。对此,我们要有清新的认知。与其等待赛道到达其尽头,不变道就万劫不复,而不得不变道,不若先人一步,在合适的时间主动变道。这样,在新的赛道,你就是领跑者,就是需求爆炸期那个人人得而宠之的弄潮儿。&/p&&p&注意这里变换赛道并不意味着切换大的技能方向。频繁切换技能方向,会让你无法沉淀下来,打造自己的护城河。如果你把自己定位成安全领域的专家,那么,在个人电脑时代,你的关注点可能在操作系统和应用程序层面,在互联网时代,是网络层面。你的技能从 memory management,interrupt/exception handling,scheduling,Sandboxing 一路演进到 Anti spoofing,Anti injection,Anomaly Detection 等技术,但这并没有背离你的定位,已有的累积和新的知识互为印证,你的能力层层叠进,螺旋上升。&/p&&h2&&b&不可忽视的风险&/b&&/h2&&p&程序员第一大职业风险就是被科技浪潮无情淘汰。&/p&&p&很多行业,从业者的职业生涯从入场到退场,像是在乘机场的自动传送带。人少的时候,你可以往前挪挪,或者伺机走一下快速道,越过那些挡在你前面的浑浑噩噩的家伙,但你能做的也就这些,快不了太多;人多的时候,你只能耐心排着,什么岁数到什么位置,前面的人不离场,你不能抢下他的位置。这一路你走的慢慢悠悠,四平八稳,但好歹,不那么辛苦,除非遇着剧变,你被踢出传送带的几率不大。&/p&&p&程序员不一样。从入场到退场,活脱脱一出 tomb run 的游戏:身后怪物穷追不舍,你只能不停地往前跑。虽然沿途可以收获很多金币(package),但你一旦放慢脚步,或者没能及时变道,就不得不主动出局或者被清场出局。主动出局一般是体面的 —— 当 manager,当法人,转 VC,转 sales,去教书,做庄德扑等等, 总之换个角色浪,从此和之前的角色相忘于江湖;被清场则是不体面的 —— 钱还没赚够,就被服务了多年的东家无情抛弃。为了养家糊口,只得 restart,重归赛道。可赛道哪是那么好挤回来的 —— 略微谢顶,银发中间或夹杂着些许黑发,肚腩厚实得,从上往下看,都看不见脚趾的奔四大叔,被二十岁出头的毛头小子面试:大叔,说说看,你能给我们带来什么价值?&/p&&p&程序员的第二大职业风险是马太效应过于明显,有时候稍低的起点就意味着经年累月数倍于别人的奋斗。&/p&&p&2017年的计算机应届生,我听说到的白菜价是二十五万。我信,但这可能是 top 10% 在北上广深的水平。剩下的,平均收入至少要拦腰。五年后,这些 top 10% 平均水平能上五六十万,加上股票就没边了;而剩下的,平均水平可能还达不到他们同龄人五年前所谓的「白菜价」。&/p&&p&这个游戏是这么玩的:&/p&&ul&&li&你学习好,卯足劲上了 985,然后大学的四到六年又认认真真地学习和开发,毕业后工作找你,拿了 BAT 等一线的 offer,兢兢业业工作,工资水涨船高,公司股票翻番,周围还都是优秀的人,有闲得无聊读个 MBA 的,有出国接受更大挑战的,有跑去创业公司当 CTO 的,人比人气死人,你也就被逼不断学习维持优秀的状态,好让自己不至于垫底。市场上满满都是向你抛来的橄榄枝,挪个窝轻松二三成的涨幅,你却不待见;&/li&&li&你学习不好,仅仅够上了个一本,大学有点荒废,代码没写几行,毕业后你找工作,鞋底磨穿,勉勉强强有个外包公司收留,没日没夜地工作,但公司就这么个水平,薪水很难涨,周围的同事浑浑噩噩地混日子,你稍微努力点,就显得鹤立鸡群。想跳吧,履历不好,跳不出好结果 —— 给心仪的几个大公司发了简历,却好像荷叶上泻过的水,连个痕迹都没有。&/li&&/ul&&p&这个行业就是这么操蛋:起点低一些,人生的轨迹就差了很多。你要认清这一点,如果你不幸是那个起点低,现状差的人,那就加倍努力,想办法证明自己不比别人差。和咨询这种出生决定命运的行业,这一行还有很多证明你的水平的机会 —— 起码,talk is cheap. Show me your code 是行业的共识。&/p&&p&程序员的第三大职业风险是诱惑太多,容易毁了自己的职业生涯。&/p&&p&这里的诱惑主要是市场机会的诱惑。前面说了,局部供需严重不平衡,因而不乏挥舞着巨额钞票的工作机会。如果你没有一个良好的职业规划,也没有清楚地计算机会成本,那么就很容易被这样那样的高薪诱惑,从而在不合理的时间,不合适的机会上跳槽。当新的工作没有想象的那么好,或者新的公司遭遇崩盘,你不得不止损出局。这时候,找下一份工作就相当棘手。市场不认可你的价值,而你却经历了由俭入奢的过程,不愿回头,于是下一份工作依旧是一个不够深思熟虑的选择。当连续几次错误选择之后,你的职业生涯就岌岌可危了。&/p&&p&我见过五年换过八份工作的人,也见过对自己没有稳定定位,在几个方向上来回飘的人。我还见过履历倒着来的人 —— 在硅谷,见得多的是 Google - FB - Airbnb 的职业切换,我却见过 FB - Google - MS 的切换(没有贬低 MS 的意思)。这种没有想清楚,仅仅因为 package 一时之高低就随意跳槽,是程序员们的《伤仲永》。&/p&&p&&br&&/p&&p&以上。希望能触发你的思考。陷入深深的沉思前:请先不吝赞赏。&/p&
要不要转行(报考)软件开发?程序员的高薪让我流口水,但好日子总有个到头的时候吧?不会我一入行就见顶了吧?这样的问题让我不胜其烦。为子女未来前途操碎了心的长辈们,长辈们的朋友们,还有微信知乎上的朋友,像候鸟一样,在一年里的两个时间:春节期间…
&blockquote&&i&直到前一阵子出版社的人联系我,问我愿不愿意出书&br&我才意识到自己写这个专栏已经这么久了&br&最近也老人问我,怎么入门编程,要不要报班等等&br&我是从&b&零基础&/b&开始学习的,这里分享一下我的学习过程&/i&&/blockquote&&h2&&b&关于自学和培训班&/b&&/h2&&p&其实我没有什么资格来和大家讨论这个问题,&br&因为我也是刚刚入门而已,并不能指导性的告诉大家应该怎么样&br&我只是说一下自己的看法:&br&&b&自学,不用上培训班!!!&/b&&br&首先我自己是完全没有报培训班的,所以觉得也没这个必要&br&其次,如果你想将写代码作为自己的职业,那么&b&自学&/b&是必不可少的能力&br&如果什么都得让别人拉着你,那么是不是太被动了?&/p&&p&&br&&/p&&h2&&b&兴趣&/b&&/h2&&p&我没事喜欢逛知乎,有一段时间看到了这个问题:&br&&b&利用爬虫技术能做到哪些很酷很有趣很有用的事情&/b&: &a href=&//link.zhihu.com/?target=http%3A//t.cn/RptGOPx& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/RptGOPx&/span&&span class=&invisible&&&/span&&/a&&br&觉得回答的一个个炒鸡酷炫&br&就对爬虫产生了浓厚的兴趣,&br&于是就开始了我的一路摸爬滚打&/p&&h2&&b&文本资料&/b&&/h2&&p&想学写爬虫,Python的基础知识肯定得补起来&br&这里我推荐几本我觉得很棒的&b&入门书籍&/b&&br&最好按照&b&顺序&/b&阅读,难度是&b&由浅入深&/b&的&/p&&ul&&li&&b&父与子的编程之旅&/b&: &a href=&//link.zhihu.com/?target=http%3A//t.cn/R7s2ME8& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/R7s2ME8&/span&&span class=&invisible&&&/span&&/a&&br&这本书说的都是一些基本的概念,告诉我们编程到底是怎么一回事,初步了解Python的世界。&/li&&li&&b&笨方法学Python&/b&: &a href=&//link.zhihu.com/?target=http%3A//t.cn/Rie7W7L& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/Rie7W7L&/span&&span class=&invisible&&&/span&&/a&&br&这本书在知乎上都被推荐烂了,但是的确是一本不可多得的好书。但最后的部分对于零基础的人来说,跨越程度有点大,如果看不懂,可以暂时跳过&/li&&li&&b&菜鸟教程 Python3教程&/b& :&a href=&//link.zhihu.com/?target=http%3A//t.cn/RqM5aF8& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/RqM5aF8&/span&&span class=&invisible&&&/span&&/a&&br&从这里,就可以完整的掌握Python这门语言的基础语法、类型、函数、面向对象...&br&这里的内容都是最基本的解释,只能告诉你一个大概。但这就是目前的我们所需要的,因为太难的,真的看不懂(比如 线程锁 迭代器 生成器...)&/li&&li&&b&简明教程&/b&: &a href=&//link.zhihu.com/?target=http%3A//t.cn/RMP60Nw& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/RMP60Nw&/span&&span class=&invisible&&&/span&&/a&&br&这相对于菜鸟教程,更加的精炼和简介,也是非常的棒!&/li&&li&廖雪峰的Python3教程: &a href=&//link.zhihu.com/?target=http%3A//t.cn/RK0qGu7& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/RK0qGu7&/span&&span class=&invisible&&&/span&&/a&&br&相对于前面的教程来说,廖大的更加深入,我当初是直接看的廖大,看到后面云里雾里,所以完全零基础的小伙伴,还是先尝试其他比较简单的好一点。&/li&&/ul&&p&上面就是我推荐的一些入门的文本资料,&br&最后三个,可以按照自己的水平阅读学习&br&也不一非要按照我推荐的顺序,&br&当然,光看是没用的,上面的例子也要&b&跟着做&/b&才能有收获&/p&&h2&&b&视频慕课&/b&&/h2&&p&有的小伙伴可能一看书就犯困,&br&更喜欢直接一点的视频,&br&我当初是书和视频一起结合着看的&br&下面推荐我上的几门慕课:&/p&&ul&&li&&b&哈佛大学公开课:计算机科学cs50&/b&: &a href=&//link.zhihu.com/?target=http%3A//t.cn/RwvcReG& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/RwvcReG&/span&&span class=&invisible&&&/span&&/a&&br&这门课对于我这种文科生来说,简直是福音!!!通过这门课,你可以了解到计算机世界的基础,为你以后的学习打下良好的基础!没看过的同学一定要去看!&/li&&li&&b&中国大学慕课:Python语言程序设计&/b& &a href=&//link.zhihu.com/?target=http%3A//t.cn/R6ELBBH& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/R6ELBBH&/span&&span class=&invisible&&&/span&&/a&&br&这门课录制的水平很高,还有对应的在线习题,学到最后还能有证书拿,每周同步进行的话也不会有太大的压力&br&我还把每周的习题上传到Github了: &a href=&//link.zhihu.com/?target=https%3A//github.com/Ehco1996/PythonPractice& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/Ehco1996/Pyt&/span&&span class=&invisible&&honPractice&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&&b&中国大学慕课: Python网络爬虫与信息提取:&/b& &a href=&//link.zhihu.com/?target=http%3A//t.cn/R6phGd9& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/R6phGd9&/span&&span class=&invisible&&&/span&&/a&&br&上面那门慕课老师开设的爬虫课程,很棒很详细,我学习爬虫就是跟着这里入门的!&/li&&li&&b&中国大学慕课:用Python玩转数据:&/b& &a href=&//link.zhihu.com/?target=http%3A//t.cn/RSN2yYR& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/RSN2yYR&/span&&span class=&invisible&&&/span&&/a&&br&讲了一些用Python做数据分析的基本方法,老师很有意思,不过前面的章节还涉及到一些基础的部分,可以当做再复习一遍啦&/li&&li&&b&嵩天老师的其他Python课程&/b& : &a href=&//link.zhihu.com/?target=http%3A//t.cn/RptquK8& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&t.cn/RptquK8&/span&&span class=&invisible&&&/span&&/a&&br&这名老师开设了很多Python课程,各种方向的都有,&br&其实学到这里,可以多多尝试一下,发现自己喜欢的方向&br&看看嵩老师开设的课程:&/li&&/ul&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-0ca2abcda8cbefaec19c249_b.png& data-caption=&& data-rawwidth=&985& data-rawheight=&757& class=&origin_image zh-lightbox-thumb& width=&985& data-original=&https://pic2.zhimg.com/v2-0ca2abcda8cbefaec19c249_r.jpg&&&/figure&&p&&br&&/p&&h2&&b&基础掌握之后?&/b&&/h2&&p&当你觉得你已经掌握了Python的基本用法,&br&这个时候就该尝试去『写』一些小项目了,&br&不一定要自己去创造,可以去github上看看有什么适合自己的项目,&br&fork一份到本地,看看别人的代码是怎么样的&br&别人为什么这样写...&br&自己模仿着能写出差不多的东西么?&br&具体可以参考这个知乎问题:&br&&b&Python 的练手项目有哪些值得推荐&/b&?&a href=&https://www.zhihu.com/question/& class=&internal&&&span class=&invisible&&https://www.&/span&&span class=&visible&&zhihu.com/question/2937&/span&&span class=&invisible&&2574&/span&&span class=&ellipsis&&&/span&&/a&&/p&&h2&系统的学习爬虫?&/h2&&p&这里我就推荐三份资料&/p&&ul&&li&路人甲整理的:&b&一份Python爬虫电子书&/b&: &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&zhuanlan.zhihu.com/p/28&/span&&span class=&invisible&&865834&/span&&span class=&ellipsis&&&/span&&/a&&br&&br&甲哥人炒鸡nice啊!但是可能最近工作比较忙~这份资料是他辛苦整理出来的,内容很丰富!&/li&&li&&b&崔庆才的爬虫教程&/b& &a href=&//link.zhihu.com/?target=http%3A//cuiqingcai.com/1052.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&cuiqingcai.com/1052.htm&/span&&span class=&invisible&&l&/span&&span class=&ellipsis&&&/span&&/a&&br&这个博主也很nice,当初我学着入门的时候也在这里参考了很多资料!&/li&&li&我的 &b&从零开始写Python爬虫&/b& 专栏 &a href=&https://zhuanlan.zhihu.com/Ehco-python& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&zhuanlan.zhihu.com/Ehco&/span&&span class=&invisible&&-python&/span&&span class=&ellipsis&&&/span&&/a&&br&容我自卖自夸一下,专栏里从基础到实战都有&br&最近也把所&b&有的文章链接&/b&都汇总到导言里了:&br&可以看这里: &a href=&https://zhuanlan.zhihu.com/p/?refer=Ehco-python& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&zhuanlan.zhihu.com/p/26&/span&&span class=&invisible&&673214?refer=Ehco-python&/span&&span class=&ellipsis&&&/span&&/a&&/li&&/ul&&h2&&b&系统的学习Web?&/b&&/h2&&p&这里我推荐一个超级棒的Django教程:&/p&&ul&&li&&b&追梦人物的blog:&/b& &a href=&//link.zhihu.com/?target=http%3A//zmrenwu.com/post/2/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&zmrenwu.com/post/2/&/span&&span class=&invisible&&&/span&&/a&&br&我的blog就是跟着这个教程不断的完善,才有了现在的效果&/li&&/ul&&p&还有一份Python Web开发的知识清单:&/p&&ul&&li&&b&python web 入坑指南:&/b& &a href=&//link.zhihu.com/?target=http%3A//python-web-guide.readthedocs.io/zh/latest/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&python-web-guide.readthedocs.io&/span&&span class=&invisible&&/zh/latest/&/span&&span class=&ellipsis&&&/span&&/a&&br&这我还没看完,我准备利用最后这一年上学的时间来学习一下&/li&&/ul&&h2&剩下的?&/h2&&p&全得靠你自己啦&br&一起努力吧!&/p&&p&&br&&/p&&p&每天的学习记录都会 同步更新到:&br&微信公众号: findyourownway&br&&br&知乎专栏:&a href=&https://zhuanlan.zhihu.com/Ehco-python& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&zhuanlan.zhihu.com/Ehco&/span&&span class=&invisible&&-python&/span&&span class=&ellipsis&&&/span&&/a&&br&&br&blog : &a href=&//link.zhihu.com/?target=http%3A//www.ehcoblog.ml/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&www.ehcoblog.ml&/a&&br&&br&Github: &a href=&//link.zhihu.com/?target=https%3A//github.com/Ehco1996/Python-crawler& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/Ehco1996/Pyt&/span&&span class=&invisible&&hon-crawler&/span&&span class=&ellipsis&&&/span&&/a&&/p&
直到前一阵子出版社的人联系我,问我愿不愿意出书 我才意识到自己写这个专栏已经这么久了 最近也老人问我,怎么入门编程,要不要报班等等 我是从零基础开始学习的,这里分享一下我的学习过程关于自学和培训班其实我没有什么资格来和大家讨论这个问题, 因为…
&p&Python作为一种应用极为广泛的语言,几乎在任何领域都能派上用场。想做Web有Flask/Django/Tornado;想做分布式有Celery;想做手机App有Kivy;想做数据分析有Pandas;想做可视化有Matplotlib/Seaborn/Plotly/Bokeh;想做机器学习有Tensorflow/PyTorch/MxNet……&/p&&p&&br&&/p&&p&夸张一点说,几乎没有什么做不了的东西(笔芯)。小慕今天分享两个可以用Python做的非常好玩的事情,大家都可以试试看~&/p&&p&&br&&/p&&h2&&b&一、面部识别&/b&&/h2&&p&&br&&/p&&p&得益于大量前人的工作,如今利用Python做一些简单的计算机视觉工作已经变得非常非常简单了。像人脸识别、面部特征提取之类的工作,就可以直接拿来用,极少需要自己实现繁琐的算法。&/p&&p&&br&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//dlib.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DLib&/a&就是一个这样的C++库,而同时它也提供了Python接口。&/p&&p&&br&&/p&&p&想必大家都有过在办公室遭遇boss探视的经历,而此时此刻你却在毫无自知地逛着淘宝/知乎/豆瓣,场面一度十分尴尬……&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-0dc7f799f4fb31edc96c0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&205& data-rawheight=&210& class=&content_image& width=&205&&&/figure&&p&&br&&/p&&p&那我们就来尝试一下,用Python通过摄像头探测人脸。如果有人进入了摄像头范围,则让Python提出一个通知,告诉你——赶紧把不相关的东西关掉!&/p&&p&&br&&/p&&p&整个代码很短,无非几十行,为了能够使用,我们还需要安装一些包和库。这里需要用到的包括OpenCV和DLib。由于dlib需要boost-python,因此还需要安装boost和boost-python。(注意:boost-python默认情况下只编译python2依赖的库,如果使用python3,需要加编译开关;而d}

我要回帖

更多关于 代码生成器使用方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信