C语言程序设计基础体会
在第一次的C语言程序设计课上我们第一次接触到将近200行程序的大型程序。即使现在已经将这个程序分析的十分清楚,但是每次看到这么多的程序还是令我感到头痛不已。
这个大型的程序是一个基础的飞机类型的游戏。虽然比我们现在手机上、电脑上玩的游戏要简陋不止几百倍而且由于它是利用C语言的循环语句进行输出所以在玩的时候总是在不停地闪烁使人有些头晕。但我还是觉得异常有趣。
在这个程序中需要用到许多的C语言语句:
printf 显示
while 循环
if else 判断
switch...case 多条件判断
scr[][]二维数组
其中我们最熟悉的是前三个语句然而后两个语句对于我们来说颇为陌生。首先swith...case是多条件判断。顾名思义他能够对复数的条件进行同时的判断。对于游戏软件制作来说要比用if...else方便得多。
scr[][]二维数组,是可以把数据按照类似表格的方式存在每一行每一列中。例如:scr[i][j]就代表这个字符存在于第i行第j列。所以很好理解。
接下来我们介绍程序:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define N 35
void print(int [][N]);//输出函数
void movebul(int [][N]);//×××移动函数
void movepla(int [][N]);//敌机移动函数
void setting(void);//设置函数
void menu(void);//菜单函数
void oper(void);//操作函数
int scr[22][N]={0},li=21,pl=9,width=24,height=22,speed=3,density=30,score=0,death=0;//全局变量:界面、我机初始位、界面宽度、界面高度、敌机速度、敌机密度、得分、死亡
这些是这个飞机游戏程序的基本所需的函数和变量。为了能让飞机可以上下左右四面移动我们需要给界面的宽度与高度进行赋值。并且要设置游戏开始时飞机的初始位置。由于是飞机类型的游戏得分和死亡次数也是必不可少。
main(void)
{
menu();//开机菜单
oper();//操作飞机,敌机以及×××
}
这两个语句是这个程序的大框架也是最必不可少的部分同时也做好了整个程序的分化。也就相当于为程序中的各个部分做好了分工。
接下来就是进行操作系统的设定(这一部分我认为是整个程序中最重要的):
void oper()
{
int i=0,j=0;
scr[li][pl]=1;
scr[0][5]=3;
while(1)
{
if(kbhit())
switch(getch())//控制左右移动和进入菜单
{
case 'a':case 'A':
if(pl>0)
scr[li][pl]=0,scr[li][--pl]=1;
break;
case 'd':case 'D':
if(pl<width-2)
scr[li][pl]=0,scr[li][++pl]=1;
break;
case 'w':case 'W':
if(li>=0)
scr[li][pl]=0,scr[--li][pl]=1;
break;
case 's':case 'S':
if(li<=height-2)
scr[li][pl]=0,scr[++li][pl]=1;
break;
case 'b':case 'B':
scr[li][pl]=2;
break;
case 27 :
setting();
break;
}
if(++j%density==0)//控制生产敌机的速度
{
j=0;srand(time(NULL));
scr[0][rand()%width]=3;
}
if(++i%speed==0)//控制敌机移动速度,相对于×××移动速度
movepla(scr);
movebul(scr);
print(scr);
if(i==30000)
i=0;//以免i 越界
}
}
这个阶段看起来相当的复杂而且麻烦。但如果你思维清晰而且逐步去看的话是十分容易理解的。
其中1代表:自己的飞机。2代表:发射出去的×××。3代表:敌方的飞机。首先设置己方飞机的操作系统。如果想要设置成按A飞机向左移动就如此输入:
case 'a':case 'A':
if(pl>0)
scr[li][pl]=0,scr[li][--pl]=1;
break;
就如程序上描述的:按“a”或者“A”之后如果(if)飞机初始位置大于0的时候就执行飞机初始位置的列数-1。
其他的都按照这样输入就行(注意:可以将整个界面看成坐标系最低行是0,最左列是0。所以在让飞机上下移动的时候要注意是scr[++li],还是scr[--li])
接下来是调整敌方飞机和×××的移动速度(注意:一定要设置界面边界否则会有地方飞机跑到游戏画面之外)
if(++j%density==0)//控制生产敌机的速度
{
j=0;srand(time(NULL));
scr[0][rand()%width]=3;
}
if(++i%speed==0)//控制敌机移动速度,相对于×××移动速度
movepla(scr);
movebul(scr);
print(scr);
if(i==30000)
i=0;//以免i 越界
}
}
下一步是进行界面的设置,具体来说就是进行积分的记录和死亡次数的记录。具体程序如下:
void print(int a[][N])
{
system("cls");
int i,j;
for(i=0;i<22;i++)
{
a[i][width-1]=4;
for(j=0;j<width;j++)
{
if(a[i][j]==0)
printf(" ");
if(a[i][j]==1)
printf("\5");//输出我机的符号
if(a[i][j]==2)
printf(".");//×××
if(a[i][j]==3)
printf("\3"); //输出敌机符号
if(a[i][j]==4)
printf("|");
if(i==0&&j==width-1)
printf("得分:%d",score);//右上角显示得分
if(i==1&&j==width-1)
printf("死亡:%d",death);
if(i==2&&j==width-1)
printf("设置:Esc");
if(i==3&&j==width-1)
printf("Copyright:杨成");
}
printf("\n");
}
}
然后就开始制作×××移动的函数。由于C语言中不存在flash。所以×××移动就是指每秒进行界面的刷新和×××符号的移动来达到发射×××的效果。
void movebul(int a[][N])
{
int i,j;
for(i=0;i<22;i++)
for(j=0;j<width;j++)
{
if(i==0&&a[i][j]==2)
a[i][j]=0;
if(a[i][j]==2)
{
if(a[i-1][j]==3)
score+=10,printf("\7");
a[i][j]=0,a[i-1][j]=2;
}
}
}
这个程序同时也设定了×××没打死一架敌机就增加10点分数。然而这个程序判定打死敌机也十分的有趣。利用a[][N]语句。a[i][j]代表设定一个由ixj的空间。每个字符代表一个格所以设定成当敌机与×××所在的格相同时,敌方飞机和×××的输出变为0,分数增加10点。
×××函数接下来就是敌机函数,并且记录死亡数。
void movepla(int a[][N])
{
int i,j;
for(i=21;i>=0;i--)//从最后一行往上是为了避免把敌机直接冲出数组。
for(j=0;j<width;j++)
{
if(i==21&&a[i][j]==3)
a[i][j]=0;//底行赋值0 以免越界。
if(a[i][j]==3)
a[i][j]=0,a[i+1][j]=3;
}
if(a[li-1][pl]==3&&a[li][pl]==1)
death++;
}
最后一步就是进行菜单界面的设置,和游戏难度调节的设置。
void setting(void)
{
int sw=0,i,j;
system("cls");
do{sw=0;printf("\n 游戏界面的大小:1.大2.小>> ");
switch(getche())
{
case '1':
width=34;
break;
case '2':
width=24;
break;
default:
printf("\n 错误,请重新选择...\n");
sw=1;
}
}
while(sw);
do
{
sw=0;
printf("\n 请选择敌机密度:1.大2.中3.小>> ");
switch(getche())
{
case '0':
density=10;
break;
case '1':
density=20;
break;
case '2':
density=30;
break;
case '3':
density=40;
break;
default:
printf("\n 错误,请重新选择...\n");
sw=1;
}
}while(sw);
do
{
sw=0;
printf("\n 敌机的飞行速度:1.快2.中3.慢>> ");
switch(getche())
{
case '1':
speed=2;
break;
case '2':
speed=3;
break;
case '3':
speed=4;
break;
default:
printf("\n 错误,请重新选择...\n");
sw=1;
}
}while(sw);
for(i=0;i<22;i++)
for(j=0;j<45;j++)
scr[i][j]=0;
scr[21][pl=9]=1;
printf("\n 按任意键保存...");
getch();
}
void menu(void)
{
printf("说明:按W S A D 控制我机上下左右飞行,B 发射×××\n 设置:请按Esc\n 开始游戏:任意键\n by yan_xu");
if(getch()==27)
setting();
}
就是按照这个步骤:飞机游戏的程序就完成了。通过这次学习我知道了c语言程序其实也可以利用简单易懂的语言来表达出复杂的事情。而且在进行编程的时候一定要细心而且有耐心。注意每个细节并且要先理清思路在进行编辑才更容易成功。
在最后将完整的程序发出:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define N 35
void print(int [][N]);//输出函数
void movebul(int [][N]);//×××移动函数
void movepla(int [][N]);//敌机移动函数
void setting(void);//设置函数
void menu(void);//菜单函数
void oper(void);//操作函数
int scr[22][N]={0},li=21,pl=9,width=24,height=22,speed=3,density=30,score=0,death=0;//全局变量:界面、我机初始位、界面宽度、界面高度、敌机速度、敌机密度、得分、死亡
main(void)
{
menu();
oper();
}
void oper()
{
int i=0,j=0;
scr[li][pl]=1;
scr[0][5]=3;
while(1)
{
if(kbhit())
switch(getch())//控制左右移动和进入菜单
{
case 'a':case 'A':
if(pl>0)
scr[li][pl]=0,scr[li][--pl]=1;
break;
case 'd':case 'D':
if(pl<width-2)
scr[li][pl]=0,scr[li][++pl]=1;
break;
case 'w':case 'W':
if(li>=0)
scr[li][pl]=0,scr[--li][pl]=1;
break;
case 's':case 'S':
if(li<=height-2)
scr[li][pl]=0,scr[++li][pl]=1;
break;
case 'b':case 'B':
scr[li][pl]=2;
break;
case 27 :
setting();
break;
}
if(++j%density==0)//控制生产敌机的速度
{
j=0;srand(time(NULL));
scr[0][rand()%width]=3;
}
if(++i%speed==0)//控制敌机移动速度,相对于×××移动速度
movepla(scr);
movebul(scr);
print(scr);
if(i==30000)
i=0;//以免i 越界
}
}
void print(int a[][N])
{
system("cls");
int i,j;
for(i=0;i<22;i++)
{
a[i][width-1]=4;
for(j=0;j<width;j++)
{
if(a[i][j]==0)
printf(" ");
if(a[i][j]==1)
printf("\5");//输出我机的符号
if(a[i][j]==2)
printf(".");//×××
if(a[i][j]==3)
printf("\3"); //输出敌机符号
if(a[i][j]==4)
printf("|");
if(i==0&&j==width-1)
printf("得分:%d",score);//右上角显示得分
if(i==1&&j==width-1)
printf("死亡:%d",death);
if(i==2&&j==width-1)
printf("设置:Esc");
if(i==3&&j==width-1)
printf("Copyright:杨成");
}
printf("\n");
}
}
void movebul(int a[][N])
{
int i,j;
for(i=0;i<22;i++)
for(j=0;j<width;j++)
{
if(i==0&&a[i][j]==2)
a[i][j]=0;
if(a[i][j]==2)
{
if(a[i-1][j]==3)
score+=10,printf("\7");
a[i][j]=0,a[i-1][j]=2;
}
}
}
void movepla(int a[][N])
{
int i,j;
for(i=21;i>=0;i--)//从最后一行往上是为了避免把敌机直接冲出数组。
for(j=0;j<width;j++)
{
if(i==21&&a[i][j]==3)
a[i][j]=0;//底行赋值0 以免越界。
if(a[i][j]==3)
a[i][j]=0,a[i+1][j]=3;
}
if(a[li-1][pl]==3&&a[li][pl]==1)
death++;
}
void setting(void)
{
int sw=0,i,j;
system("cls");
do{sw=0;printf("\n 游戏界面的大小:1.大2.小>> ");
switch(getche())
{
case '1':
width=34;
break;
case '2':
width=24;
break;
default:
printf("\n 错误,请重新选择...\n");
sw=1;
}
}
while(sw);
do
{
sw=0;
printf("\n 请选择敌机密度:1.大2.中3.小>> ");
switch(getche())
{
case '0':
density=10;
break;
case '1':
density=20;
break;
case '2':
density=30;
break;
case '3':
density=40;
break;
default:
printf("\n 错误,请重新选择...\n");
sw=1;
}
}while(sw);
do
{
sw=0;
printf("\n 敌机的飞行速度:1.快2.中3.慢>> ");
switch(getche())
{
case '1':
speed=2;
break;
case '2':
speed=3;
break;
case '3':
speed=4;
break;
default:
printf("\n 错误,请重新选择...\n");
sw=1;
}
}while(sw);
for(i=0;i<22;i++)
for(j=0;j<45;j++)
scr[i][j]=0;
scr[21][pl=9]=1;
printf("\n 按任意键保存...");
getch();
}
void menu(void)
{
printf("说明:按W S A D 控制我机上下左右飞行,B 发射×××\n 设置:请按Esc\n 开始游戏:任意键\n ");
if(getch()==27)
setting();
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。