有什么有趣的C语言小程序吗?

一个“消灭敌机”的小游戏,用DEVc++编译的:?

# include & ltstdio.h & gt

# include & ltconio.h & gt

# include & ltstdlib.h & gt

# include & ltwindows.h & gt

# include & lttime.h & gt

#定义zlx 10?//增量坐标(X)保持游戏框不移动到一边。

#定义zly 3?//增量坐标(Y)保持游戏框不移动到一边。

#定义W 26?//游戏框的宽度

#定义H 24?//游戏框的高度

int jiem[22][22]={0},wj = 10;?//接口数组,本机位置(初始值为10)

int速度=4,密度=30,分数=0,死亡= 0;//敌人速度,敌人密度,玩家表现,死亡次数。

int m=0,n = 0;?// m,n是控制敌机的变量。

void gtxy (int x,int y)?//控制光标位置的函数

{坐标位置;

位置。X = x?位置。Y = y?

SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),pos);

}

作废?颜色(int?a)?//设置颜色的函数(A应为1-15)

{ SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),a);}

void yinc(int x=1,int y=0)?//隐藏光标的功能

{控制台_光标_信息?gb={x,y };//y设置为0表示隐藏。

SetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE),& ampGB);

}

void csh()?//初始化函数

{ int I;

颜色(7);

gtxy(zlx,zly);printf("╔”);?gtxy(zlx+W-2,zly);printf("╗”);?//框的左上角和右上角

gtxy(zlx,zly+H-1);printf("╚”);gtxy(zlx+W-2,zly+H-1);printf("╝”);//降低两个框角

for(I = 2;我& ltw-2;i+=2) {gtxy(zlx+i,zly);?printf("═”);}?//打印顶部水平框架

for(I = 2;我& ltw-2;i+=2) {gtxy(zlx+i,zly+H-1);printf("═”);} ?//打印下水平框架

for(I = 1;我& lth-1;i++) { gtxy(zlx,zly+I);?printf("║”);}//打印左竖框

for(I = 1;我& lth-1;i++) {gtxy(zlx+W-2,zly+I);printf("║”);}?//打印右竖框

颜色(14);gtxy(19,2);Printf(“消灭敌机”);颜色(10);

gtxy(37,5);printf(" setting:Esc ");

gtxy(37,7);Printf("发射:↑");

gtxy(37,9);printf(" Control:←→");

gtxy(37,11);Printf("分数:%d ",分数);

gtxy(37,13);Printf("死亡:%d ",死亡);

yinc(1,0);

}

void qcjm()?//清除接口函数

{int i,j;

for(I = 0;我& lth-2;i++)

for(j = 0;j & ltw-4;j++){gtxy(zlx+2+j,zly+1+I);printf(" ");}

}

void feiji()?//飞机运动功能

{int i,j;

for(I = 21;我& gt=0;我-)?//从下往上是为了防止敌机直接冲出阵列。

for(j = 0;j & lt22;j++)

{ if(I = = 21 & amp;& ampjiem[i][j]==3)?jiem[I][j]= 0;?//将0赋给底线,避免越线。

?if(jiem[i][j]==3)?jiem[i][j]=0,jiem[I+1][j]= 3;

}

if(jiem[20][wj]= = 3 & amp;& ampjiem[21][wj]= = 1)death++;

}

void紫丹()?//项目符号移动函数

{ int i,j;

for(I = 0;我& lt22;i++)

for(j = 0;j & lt22;j++)

{ if(I = = 0 & amp;& ampjiem[I][j]= = 2)jiem[I][j]= 0;

if(jiem[i][j]==2) {?if(jiem[I-1][j]= = 3)score+= 100,printf(" \ 7 ");?

?jiem[i][j]=0,jiem[I-1][j]= 2;}

}

}

作废打印(?) ?//输出接口函数

{int i,j;

qcjm();

for(I = 0;我& lt22;i++)

for(j = 0;j & lt22;j++)

{ gtxy(12+j,4+I);

if(jiem[I][j]= = 3){ Color(13);printf("□");}

if(jiem[I][j]= = 2){ Color(10);printf(" . ");}

if(jiem[I][j]= = 1){ Color(10);printf("■");}

}

gtxy(37,11);颜色(10);Printf("分数:%d ",分数);

gtxy(37,13);Printf("死亡:%d ",死亡);

}

void设置()?//游戏设置功能

{ qcjm();

gtxy(12,4);Printf("选择敌人速度:");

gtxy(12,5);printf("?1.快速2。中等3。慢>;>);

开关(getche())

?{案例' 1 ':速度= 2;打破;

情况“2”:速度= 4;打破;

情况“3”:速度= 5;打破;

默认:gtxy(12,6);printf("?不对!默认值”);

?}

gtxy(12,7);Printf("选择敌人密度:");

gtxy(12,8);printf("?1.大2。中等3。小>;>);

开关(getche())

{事例“1”:密度= 20;打破;

情况2:密度= 30;?打破;

情况“3”:密度= 40;打破;

?默认:gtxy(12,9);printf("?不对!默认值”);

}

for(int I = 0;我& lt22;i++)

for(int j = 0;j & lt22;j++)jiem[I][j]= 0;

jiem[21][wj = 10]= 1;jiem[0][5]= 3;

gtxy(12,10);printf("?按任意键保存... ");

getch();

qcjm();

}

空运行()?//游戏运行功能

{ jiem[21][wj]= 1;?//1的值代表我们的机器(2是子弹)。

jiem[0][5]= 3;//值为3表示敌机。

SetConsoleTitle(“摧毁敌机”);?//设置窗口标题

while(1)

{?if (kbhit())?//按下一个键,控制我的机器左右移动,发射或者设置。

?{ int key

if((key = getch())= = 224)key = getch();

开关(钥匙)?

{案例75:if(wj & gt;0) jiem[21][wj]=0,jiem[21][-wj]= 1;打破;

?案例77:如果(wj & lt20)?jiem[21][wj]=0,jiem[21][+++wj]= 1;?打破;

?案例72:jiem[20][wj]= 2;打破;

案例27:设置();

}

}

如果(++n %密度==0)?//控制敌机速度。

{ n = 0;srand((无符号)时间(空));

?jiem[0][rand()% 20+1]= 3;

}

?if(++m % speed = = 0){ feiji();m = 0;} ?//控制敌机的移动速度(相对于子弹)

?紫丹();

print();

睡眠(120);?//延迟120毫秒

}

}

int main()

{ csh();

?run();

?返回0;

}

新手需要轻松编写代码,可以收集以下自编译函数:

SetConsoleTitle(“俄罗斯方块”);?//设置“俄罗斯方块”一词出现在窗口左上角的标题栏中。

srand((无符号)时间(空));?//初始化随机数生成器

n=兰特(?) % 20;?//生成随机数0-19中的一个,比如rand(?)%5产生一个从0到4的数。

SetConsoleTitle(?)功能在

就是同时使用它,在

睡眠(300);?//延迟300毫秒(也就是说,程序会在300毫秒后继续运行)

系统(“cls”);?//清空屏幕(清空窗口中的所有内容,并将光标置于(0,0))

两种功能都在

void gtxy (int x,int y)?//控制光标位置的函数

{坐标位置;

位置。X = x?

位置。Y = y?

SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),pos);

}

空色(int a)?//设置颜色的功能

{ SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),a);}

void yinc (int x,int y)?//隐藏光标的功能

{控制台_光标_信息?gb={ x,y };?//gb代表光标。

SetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE),?& ampGB);

}

void kou(int w,int h)?//设置窗口大小的函数

{手柄?HL = GetStdHandle(STD _ OUTPUT _ HANDLE);?

坐标?size={ w,h };?

SetConsoleScreenBufferSize( hl,size);?

小_RECT?rc={ 0,0,w,h };?

setconsolewindoinfo(HL,1,& ampRC);?

}

在最后一个函数中,参数w是宽的,参数h是高的。五行中的第一行定义了句柄变量hl并给它赋值。

第二行定义了坐标结构变量的大小,它的值决定了缓冲区的大小。第三行是使用

size的值设置缓冲区的大小。第四行定义了变量rc,它的值决定了当前窗口的显示位置。

大小(不得超过缓冲区的大小)。前两个0,0从缓冲区左上角的0列0行的位置开始,后两个0从0列0行的位置开始。

参数可以小于w和h,例如?rc={0,0,w-10,h-5 };最后一行设置窗口的值为rc,在中间。

该参数必须是“1”或写“true”才有效。