目录
制作一个可移动的飞机
发射激光
设置一个可击中的障碍物
完整代码
声明:本游戏参考《c语言课程设计与游戏开发实践教程》。
先来放一个效果图
怎么样,真的是新手级别吧?
(效果视频c语言练习草稿_game1.2.5飞机-CSDN直播)
- 可以通过wasd四个键控制飞机的移动,按空格键可以发射激光击中前方的障碍物*,击中后障碍物消失。
下面来看看如何制作吧
制作一个可移动的飞机
#include #include #include int main(){int x=15;int y=5;int i,n;while(1) //意思是死循环{system("cls"); //清屏函数for(i=0;i<y;i++)printf("\n"); //输出飞机上面的空行for(n=0;n<x;n++)printf(" "); //输出飞机左侧的空格printf(" *\n"); //输出飞机头部for(n=0;n<x;n++)printf(" "); //输出飞机身体部分左侧的空格printf("*---*\n"); //因为飞机头部输出后有回车,所以飞机身体已经在下一行for(n=0;n<x;n++)printf(" "); //输出飞机尾巴部分左侧的空格printf(" +-+ \n"); ... ...未完待续
- 以上代码可以输出一个完整的飞机图案,但是飞机还不能自由移动。我们本来可以使用scanf函数输入来实现控制飞机移动:if按某个键,x或者y就会+1或者-1。
- 但是,使用scanf还要按下回车键才能使飞机移动,这样玩自然很不爽。所以这里我们使用一个新的函数getch()。
- getch函数:该函数来自 函数库,因此函数头文件需要加上#include 。只接收单个字符,接受单个字符之后不需要回车键就可以返回值,能让飞机直接移动。我们把这个函数应用到后续代码中
... ...续接上方代码char move; move=getch(); //注意getch函数的使用if(move=='a') //注意是==不是=x--; //就是x-1的意思,实现让飞机左移if(move=='d')x++;if(move=='w')y--;if(move=='s')y++;} //这些代码都在while(1)内}
现在这个飞机可以实现自由移动了!
发射激光
现在我们添加一些代码实现发射激光
- 定义一个新变量int bill(随便叫什么),这个变量负责控制激光。当bill=0的时候不发射激光,当bill=1的时候发射激光。
- 在system下方添加代码。如1
- 相应在输入指令下方添加空格发射激光的指令,如2
1.if(bill==0){ for(i=0;i<y;i++) printf("\n");}else { for(i=0;i<y;i++){ for(n=0;n<(x+2);n++) //x+2的原因是飞机头左侧空格有x+2个 printf(" "); //这个+2是为了和身体对称而手动输出的 printf("|\n"); //记得换行 } }bill=0;/*如果bill==0,就输出飞机上方的空行如果bill!=0,也会先输出空行这个空行坐标既是飞机的,也是激光的这样的话,程序下方输出空行的指令就不再需要程序下方输出空行的指令可以删去*//*else的解析:else中进行了for的嵌套循环,外层循环使得每一行都输出|内层循环使每一个 | 都在飞机头上方同一位置,呈现激光状*/
2.... ...续接在一连串if(move==××)y/x++/--的下方添加if(move==' ')bill=1;这一步意思是,按下空格使bill!=0,这时就会执行图1的else
大家理解了吗?下放给大家呈现能发射激光的完整代码
#include #include #include int main(){int x=15;int y=5;int i,n;int bill=0;char move;while(1) //意思是死循环{system("cls"); //清屏函数if(bill==0){ for(i=0;i<y;i++) printf("\n");}else { for(i=0;i<y;i++){ for(n=0;n<(x+2);n++) //x+2的原因是飞机头左侧空格有x+2个 printf(" "); //这个+2是为了和身体对称而手动输出的 printf("|\n"); } }bill=0;for(n=0;n<x;n++)printf(" "); //输出飞机左侧的空格printf(" *\n"); //输出飞机头部for(n=0;n<x;n++)printf(" "); //输出飞机身体部分左侧的空格printf("*---*\n"); //因为飞机头部输出后有回车,所以飞机身体已经在下一行for(n=0;n<x;n++)printf(" "); //输出飞机尾巴部分左侧的空格printf(" +-+ \n"); move=getch(); //注意getch函数的使用if(move=='a') //注意是==不是=x--; //就是x-1的意思,实现让飞机左移if(move=='d')x++;if(move=='w')y--;if(move=='s')y++;if(move==' ')bill=1;} //这些代码都在while(1)内}
设置一个可击中的障碍物
同样是在原来代码的基础上添加代码。其实每一步的添加都不是孤立的,而是相互环扣的,请仔细思考每一步的意思。
- 定义新变量int a作为障碍物的横坐标(如果你想的话,可以用类比的方法添加纵坐标)。
- 如何实现障碍物被激光射到就消失呢?我们可以再定义一个新变量int live,live=1的时候障碍物存在,live!=0的时候障碍物不显示。如3.
- 在输出bill代码下方,输出改变live数字的代码。见4.
3.... ...int a=10; //障碍物的横坐标int live=1; //障碍物存活状态... ......system("cls");if(live==1){ for(i=0;i
4.| if(bill==0)| {|for(i=0; i<y; i++)|printf("\n");| }|else| {|for(i=0; i<y; i++)|{for(n=0; n<x; n++)|printf(" ");|printf(" +");|printf("\n");|}以上是原先代码————————————————————————————————if(x+2==a) //意思是,如果射线横坐标+2等于障碍物坐标,那么障碍物被赋值为0,也就消失了live=0; //+2是因为要配合机身对准机头 }fire=0;
分步完成,现在合体。
完整代码
#include #include #include int main(){int x=15;int y=5;int i,n;int bill=0;char move;int a=10; //障碍物的横坐标int live=1; //障碍物存活状态while(1) //意思是死循环{system("cls"); //清屏函数if(live==1){ for(i=0;i
如果有不懂的地方可以在评论区问我
就酱,拜拜~