时间:2022-10-30 11:08:13 | 栏目:C代码 | 点击:次
本文实例为大家分享了C语言实现飞机游戏的具体代码,供大家参考,具体内容如下
本节我们将在上一节 弹跳小球 实现基础上完成简单的飞机游戏。
scanf 控制飞机移动
我们可以使用 scanf 函数来检测输入,分别使用 a , s , d , w .来控制 x , y 坐标来实现飞机移动。
#include <stdio.h> #include <stdlib.h> int main(){ int i,j; int x = 5; int y = 10; char input; //此处声明变量用于检测输入 while(1){ system("cls"); //清屏,Linux改为clear //输出上方空行 for(i=0; i<x; i++) printf("\n"); //输出左侧空格 for(j=0; j<y; j++) printf(" "); printf("*"); //飞机使用 * 表示 printf("\n"); scanf("%c", &input); //检测输入 if(input == 'a') y --; if(input == 'd') y ++; if(input == 's') x ++; if(input == 'w') x --; } return 0; }
说明 :
scanf 函数中,%c 表示输入值类型为字符(char),&input表示把输入的值赋给 input 。
getch 控制飞机移动
之前我们使用 scanf 函数来控制移动,它要求每次输入之后按下回车才能继续,交互效果不好。
为了优化效果,我们使用 getch 函数,不需要回车就能得到输入字符。首先要包含 <conio.h>。
注意
一般Unix/Linnux系统没有<conio.h>头文件,需要从互联网下载使用。
除此之外,还需要 kbhit 函数来 监听 用户输入,如果用户输入,此函数返回 1 ,否则返回 0 ,从而避免不输入就暂停的情况。
#include <stdio.h> #include <stdlib.h> #include <conio.h> int main(){ int i,j; int x = 5; int y = 10; char input; //此处声明变量用于检测输入 while(1){ system("cls"); //清屏,Linux改为clear //输出上方空行 for(i=0; i<x; i++) printf("\n"); //输出左侧空格 for(j=0; j<y; j++) printf(" "); printf("*"); //飞机使用 * 表示 printf("\n"); if(kbhit()){ //判断是否有输入 input = getch(); if(input == 'a') y --; if(input == 'd') y ++; if(input == 's') x ++; if(input == 'w') x --; } } return 0; }
更炫酷的飞机
谁家的飞机就一个 “ * ” 啊?
你以为这是闪闪的红星吗?
仅仅用一个简单的星号来代替飞机未免有些太草率了!
所以得想办法在输出飞机那里做一个更炫酷的替换方案。
//更炫酷的飞机 for(j=0; j<y; j++) printf(" "); printf(" * \n"); //飞机头 for(j=0; j<y; j++) printf(" "); printf("*****\n"); //飞机身 for(j=0; j<y; j++) printf(" "); printf(" * * \n"); //飞机尾
发射激光
通常我们看到的飞机游戏都是可以哒哒哒的,所以我们现在也来给我们的飞机加个发射激光的功能。
可以定义一个变量 isFire 来表示激光状态,默认为 0 ,按下空格后改变为 1 ,此后可以加判断句,若为 1 ,则输出激光(用 “|” 表示),否则无输出。
if(isFire == 0) { //无激光,正常输出空行 for(i=0; i<x; i++) printf("\n"); } else { //有激光,在飞机上方输出“|” for(i=0; i<x; i++) //首先遍历x坐标,确保上方每行都有激光 { for(j=0; j<y; j++) printf(" "); //在y坐标之前输出空行 printf(" |\n"); //到达对应飞机头的坐标输出“|” } isFire = 0; //每次输出激光后把isFire的值归零,不然会一直输出 }
打靶练习
在加入敌人之前,我们首先要完成打靶,也就是先要清楚怎么判断敌人是否被消灭。
我们以 “+” 表示靶子,使用变量 isKilled 来记录其是否被击中,当其值为0时说明未击中,输出靶子;否则不再输出靶子。
首先定义关于靶子的量:
int ny = 5; //ny表示靶子y坐标,默认在第一行 int isKilled = 0; //击中状态为0
然后在死循环中首行输出靶子:
if(!isKilled){ for(j=0; j<ny; j++) printf(" "); printf("+\n"); }
这里判断条件中 ! 是指 “非” ,因为默认 isKilled 是 0 ,也就是 “否” 的意思,那么这儿条件就是 “非否” ,双重肯定表否定嘛。那么当 isKilled 为 1 的时候条件就成了 “非是”,即不执行输出。
最后输出激光后要判断是否击中:
if(y + 2 == ny){ isKilled = 1; }
这里 y + 2 是因为激光在飞机中心输出,而飞机中心距 y 坐标有2个空格。
注意这一段代码必须插入在输出激光后面,且要在 isFire 归零之前(要是 isFire 先归零了那你还打个锤子)。
小结
完整代码:
#include <stdio.h> #include <stdlib.h> #include <conio.h> int main(){ int i,j; int x = 5; int y = 10; char input; //此处声明变量用于检测输入 int ny = 5; //ny表示靶子y坐标,默认在第一行 int isKilled = 0; //击中状态为0 int isFire = 0; //激光状态为0 while(1){ system("cls"); //清屏,Linux改为clear if(isFire == 0) { //无激光,正常输出空行 for(i=0; i<x; i++) printf("\n"); } else { //有激光,在飞机上方输出“|” for(i=0; i<x; i++) //首先遍历x坐标,确保上方每行都有激光 { for(j=0; j<y; j++) printf(" "); //在y坐标之前输出空行 printf(" |\n"); //到达对应飞机头的坐标输出“|” } if(y + 2 == ny) isKilled = 1; isFire = 0; //每次输出激光后把isFire的值归零,不然会一直输出 } //更炫酷的飞机 for(j=0; j<y; j++) printf(" "); printf(" * \n"); //飞机头 for(j=0; j<y; j++) printf(" "); printf("*****\n"); //飞机身 for(j=0; j<y; j++) printf(" "); printf(" * * \n"); //飞机尾 printf("\n"); if(kbhit()){ //判断是否有输入 input = getch(); if(input == 'a') y --; if(input == 'd') y ++; if(input == 's') x ++; if(input == 'w') x --; } } return 0; }
思考题:
1.打个移动靶?
目前游戏还是很简单,大家先不要急,以后会有更多更复杂的游戏。