本文目录一览:
教你如何使用C语言编写简单小游戏
爱玩是人的天性,而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, y;/*该点的位置,包括x坐标和y坐标*/ int xv, yv;/*该点在x轴,y轴的速度*/};运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码:gotoxy(man.x, man.y);/*把光标移到指定的坐标*/printf(" ");/*输出一个空格,把先前的字符擦去*/然后我们让物体按其速度运动:man.x += man.xv;/*水平方向按x轴的速度运动*/man.y += man.yv;/*垂直方向按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[…][…] == '#') break;/*如果前面是墙壁,就不执行下去*/哇噻!真棒,我们做出了一个完整的游戏了.当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性.不过,我们要设计一个更好玩的游戏—— 5, 聪明的搬运工 大家一定玩过"搬运工"的游戏吧!这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的"搬运工"吧!程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,'b'表示箱子,'#'表示墙壁,'*'表示目的地,'i'表示箱子在目的地.我们以后每推一下箱子,不但要改变屏幕的显示,也要改变map相应元素的值.游戏的主循环依然是接受按键.当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推箱子前进,否则不可移动.好的,我们在switch中增加了这些判断语句.程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了.真棒啊!我们可以做游戏了.而且是一个老少皆宜,趣味十足的游戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图,我们还可以相互分享好的游戏地图呢. 尾声: 在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的.C语言在与硬件联系紧密的编程中,也占有重要地位.其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习.象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法. 好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏.
求C语言 小游戏设计
我写了个贪吃蛇,有单人版,也有双人版
这是单人版:
#include stdio.h
#include stdlib.h
#include windows.h
#include conio.h
#include time.h
#include malloc.h
int food[2];
int feng;
int dengji=3;
int speed=150;
struct snake
{
int x,y,life;
struct snake *next;
};
void welcome()
{
system("MODE con: COLS=79 LINES=24");
system("color 8F");
printf("欢迎来到贪吃蛇的世界\n");
printf(" By HB\n");
printf("↑ ↓ ← →\n");
printf("上 下 左 右\n");
printf("食物为:★\n");
printf("按空格暂停\n");
printf("按Z(大写)切换等级\n");
printf("等级从5级到1级是从高到低\n");
printf("注意:每次增加的分数=当前等级*10\n");
printf("按任意键开始游戏!\n");
getch();
system("cls");
}
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void makefood(struct snake*p)
{
int fx;
struct snake*p1=p;
srand(time(NULL));
fx=rand()%77+2;
if(fx%2==0)
{
fx--;
}
food[0]=fx;
food[1]=rand()%22+1;
while(p!=NULL)
{
if(p-x==food[0]p-y==food[1])
{
makefood(p1);
}
p=p-next;
}
}
void drawmap(struct snake* p)
{
system("cls");
printf("你的分数为:%d分 当前等级为:%d级",feng,dengji);
gotoxy(p-x,p-y);
printf("◇");
p=p-next;
while(p!=NULL)
{
gotoxy(p-x,p-y);
printf("※");
p=p-next;
}
gotoxy(food[0],food[1]);
printf("★");
}
struct snake *mvsnake(struct snake *p,int z)
{
struct snake *p2,*p3;
int x,y;
x=p-x;
y=p-y;
switch(z)
{
case 1:
{
x-=2;
break;
}
case 2:
{
x+=2;
break;
}
case 3:
{
y--;
break;
}
case 4:
{
y++;
break;
}
}
p2=(struct snake*)malloc(sizeof(struct snake));
p2-x=x;
p2-y=y;
p2-life=1;
p2-next=p;
if(p2-x=79||p2-y=24||p2-x0||p2-y1)
{
p2-life=0;
}
p3=p;
while(p3!=NULL)
{
if(p2-x==p3-xp2-y==p3-y)
{
p2-life=0;
}
p3=p3-next;
}
if(p2-x==food[0]p2-y==food[1])
{
feng+=dengji*10;
makefood(p2);
}
else
{
while(p-next-next!=NULL)
{
p=p-next;
}
p3=p-next;
p-next=NULL;
free(p3);
}
return p2;
}
int scan(int z)
{
char ch;
if(kbhit()){
ch=getch();
switch(ch)
{
case 75:if(z!=2)z=1;break;
case 77:if(z!=1)z=2;break;
case 72:if(z!=4)z=3;break;
case 80:if(z!=3)z=4;break;
case 32:z=5;break;
case 'Z':speed-=50;
dengji++;
if(speed==0){speed=250;dengji=1;}
break;
default :break;
}
if(ch==27)z=27;
fflush(stdin);
}
return z;
}
int main(int argc, char *argv[])
{
welcome();
loop:system("cls");
struct snake *snakenext;
struct snake *snk=(struct snake*)malloc(sizeof(struct snake));
snk-x=15;
snk-y=15;
snk-life=1;
snk-next=(struct snake*)malloc(sizeof(struct snake));
snk-next-x=14;
snk-next-y=snk-y;
snk-next-next=(struct snake*)malloc(sizeof(struct snake));
snk-next-next-x=13;
snk-next-next-y=snk-y;
snk-next-next-next=NULL;
int z=2;
makefood(snk);
while(1)
{
int temp_z=z;
z=scan(z);
if(z==27)exit(0);
if(z==5)
{
gotoxy(30,15);
printf("暂停");
getch();z=temp_z;
}
snk=mvsnake(snk,z);
if(snk-life==0)break;
drawmap(snk);
Sleep(speed);
}
system("cls");
gotoxy(25,11);
printf("GAME OVER,你的最终分数为:%d分\n",feng);
gotoxy(25,12);
printf("按空格重新开始,按其他键结束!\n");
while(snk!=NULL)
{
snakenext=snk-next;
free(snk);
snk=snakenext;
}
Sleep(500);
char cha;
cha=getch();
if(cha==32)
{
goto loop;
}
return 0;
}
这是双人版:
#include stdio.h
#include stdlib.h
#include windows.h
#include conio.h
#include time.h
#include malloc.h
int food[2];
int feng1,feng2;
int speed=150;
int dengji=3;
int chi;
struct snake
{
int x,y,life;
struct snake *next;
};
void welcome()
{
system("MODE con: COLS=79 LINES=24");
system("color 8F");
printf("欢迎来到双人贪吃蛇游戏\n");
printf(" By HB\n");
printf("玩家1:□□◇\n");
printf("W S A D(大写)\n");
printf("上 下 左 右\n");
printf("玩家2:■■◆\n");
printf("↑ ↓ ← →\n");
printf("上 下 左 右\n");
printf("食物为:★\n");
printf("按空格暂停\n");
printf("按Z(大写)切换等级\n");
printf("等级从5级到1级是从高到低\n");
printf("注意:每次增加的分数=当前等级*10\n");
printf("按任意键开始游戏!\n");
getch();
system("cls");
}
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void makefood(struct snake *p,struct snake *p2)
{
int fx;
struct snake*p1=p;
struct snake*p3=p2;
srand(time(NULL));
fx=rand()%77+2;
if(fx%2==0)
{
fx--;
}
food[0]=fx;
food[1]=rand()%22+1;
while(p!=NULLp2!=NULL)
{
if((p-x==food[0]p-y==food[1])||(p2-x==food[0]p2-y==food[1]))
{
makefood(p1,p3);
}
p=p-next;
p2=p2-next;
}
}
void drawmap(struct snake *p,struct snake *p2)
{
system("cls");
printf("玩家1的分数为:%d分 当前等级为:%d级 玩家2的分数为:%d分",feng1,dengji,feng2);
gotoxy(p-x,p-y);
printf("◇");
p=p-next;
gotoxy(p2-x,p2-y);
printf("◆");
p2=p2-next;
while(p!=NULL)
{
gotoxy(p-x,p-y);
printf("□");
p=p-next;
}
while(p2!=NULL)
{
gotoxy(p2-x,p2-y);
printf("■");
p2=p2-next;
}
gotoxy(food[0],food[1]);
printf("★");
}
struct snake *mvsnake(struct snake *p,struct snake *p4,int z,int i)
{
struct snake *p2,*p3;
int x,y;
x=p-x;
y=p-y;
switch(z)
{
case 1:
{
x-=2;
break;
}
case 2:
{
x+=2;
break;
}
case 3:
{
y--;
break;
}
case 4:
{
y++;
break;
}
}
p2=(struct snake*)malloc(sizeof(struct snake));
p2-x=x;
p2-y=y;
p2-life=1;
p2-next=p;
if(p2-x=79||p2-y=24||p2-x0||p2-y1)
{
p2-life=0;
}
p3=p;
while(p3!=NULL)
{
if(p2-x==p3-xp2-y==p3-y)
{
p2-life=0;
}
p3=p3-next;
}
if(p2-x==food[0]p2-y==food[1])
{
if(i==1)
{
feng1+=dengji*10;
}
else if(i==2)
{
feng2+=dengji*10;
}
makefood(p2,p4);
}
else
{
while(p-next-next!=NULL)
{
p=p-next;
}
p3=p-next;
p-next=NULL;
free(p3);
}
return p2;
}
int scan(int z)
{
char ch;
if(kbhit()){
ch=getch();
switch(ch)
{
case 75:
case 'A':if(z!=2)z=1;break;
case 77:
case 'D':if(z!=1)z=2;break;
case 72:
case 'W':if(z!=4)z=3;break;
case 80:
case 'S':if(z!=3)z=4;break;
case 32:z=5;break;
case 'Z':speed-=50;
dengji++;
if(speed==0){speed=250;dengji=1;}
break;
default :break;
}
if(ch==27)z=27;
}
return z;
}
int main(int argc, char *argv[])
{
welcome();
loop:system("cls");
struct snake *snakenext;
struct snake *snk=(struct snake*)malloc(sizeof(struct snake));
snk-x=15;
snk-y=15;
snk-life=1;
snk-next=(struct snake*)malloc(sizeof(struct snake));
snk-next-x=14;
snk-next-y=snk-y;
snk-next-next=(struct snake*)malloc(sizeof(struct snake));
snk-next-next-x=13;
snk-next-next-y=snk-y;
snk-next-next-next=NULL;
struct snake *snake2next;
struct snake *snk2=(struct snake*)malloc(sizeof(struct snake));
snk2-x=17;
snk2-y=10;
snk2-life=1;
snk2-next=(struct snake*)malloc(sizeof(struct snake));
snk2-next-x=16;
snk2-next-y=snk2-y;
snk2-next-next=(struct snake*)malloc(sizeof(struct snake));
snk2-next-next-x=15;
snk2-next-next-y=snk2-y;
snk2-next-next-next=NULL;
int z=2;
int k=2;
makefood(snk,snk2);
while(1)
{
int temp_z=z;
z=scan(z);
k=scan(k);
if(z==27)exit(0);
if(z==5)
{
gotoxy(30,15);
printf("暂停");
getch();z=temp_z;
}
snk=mvsnake(snk,snk2,z,1);
snk2=mvsnake(snk2,snk,k,2);
if(snk-life==0||snk2-life==0)break;
drawmap(snk,snk2);
Sleep(speed);
}
system("cls");
gotoxy(15,11);
printf("GAME OVER,玩家1的分数为:%d分,玩家2的分数为:%d分\n",feng1,feng2);
gotoxy(33,12);
if(feng1feng2)
{
printf("玩家1赢了!\n");
}
else if(feng2feng1)
{
printf("玩家2赢了!\n");
}
else
{
printf("你们打成了平手!\n");
}
gotoxy(25,13);
printf("按空格重新开始,按其他键结束!\n");
while(snk!=NULL)
{
snakenext=snk-next;
free(snk);
snk=snakenext;
}
while(snk2!=NULL)
{
snake2next=snk2-next;
free(snk2);
snk2=snake2next;
}
Sleep(500);
char cha;
cha=getch();
if(cha==32)
{
goto loop;
}
return 0;
}
一种C语言小游戏程序设计(程序已经附上)
"扫雷"小游戏C代码
#includestdio.h
#includemath.h
#includetime.h
#includestdlib.h
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; /*循环变量*/
int x,y,z[999]; /*雷的位置*/
int t,s; /*标记*/
int m,n,lei; /*计数*/
int u,v; /*输入*/
int hang,lie,ge,mo; /*自定义变量*/
srand((int)time(NULL)); /*启动随机数发生器*/
leb1: /*选择模式*/
printf("\n 请选择模式:\n 1.标准 2.自定义\n");
scanf("%d",mo);
if(mo==2) /*若选择自定义模式,要输入三个参数*/
{do
{t=0; printf("请输入\n行数 列数 雷的个数\n");
scanf("%d%d%d",hang,lie,ge);
if(hang2){printf("行数太少\n"); t=1;}
if(hang100){printf("行数太多\n");t=1;}
if(lie2){printf("列数太少\n");t=1;}
if(lie100){printf("列数太多\n");t=1;}
if(ge1){printf("至少要有一个雷\n");t=1;}
if(ge=(hang*lie)){printf("雷太多了\n");t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;} /*否则就是选择了标准模式(默认参数)*/
for(i=1;i=ge;i=i+1) /*确定雷的位置*/
{do
{t=0; z[i]=rand( )%(hang*lie);
for(j=1;ji;j=j+1){if(z[i]==z[j]) t=1;}
}while(t==1);
}
for(i=0;i=hang+1;i=i+1) /*初始化a,b,c*/
{for(j=0;j=lie+1;j=j+1) {a[i][j]='1'; b[i][j]='1'; c[i][j]='0';} }
for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1) {a[i][j]='+';} }
for(i=1;i=ge;i=i+1) /*把雷放入c*/
{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]='#';}
for(i=1;i=hang;i=i+1) /*计算b中数字*/
{for(j=1;j=lie;j=j+1)
{m=48;
if(c[i-1][j-1]=='#')m=m+1; if(c[i][j-1]=='#')m=m+1;
if(c[i-1][j]=='#')m=m+1; if(c[i+1][j+1]=='#')m=m+1;
if(c[i][j+1]=='#')m=m+1; if(c[i+1][j]=='#')m=m+1;
if(c[i+1][j-1]=='#')m=m+1; if(c[i-1][j+1]=='#')m=m+1;
b[i][j]=m;
}
}
for(i=1;i=ge;i=i+1) /*把雷放入b中*/
{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]='#';}
lei=ge; /*以下是游戏设计*/
do
{leb2: /*输出*/
system("cls");printf("\n\n\n\n");
printf(" ");
for(i=1;i=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("\n |");
for(i=1;i=lie;i=i+1){printf("---|");}
printf("\n");
for(i=1;i=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩余雷个数");
if(i==3)printf(" %d",lei);
printf("\n |");
for(j=1;j=lie;j=j+1){printf("---|");}
printf("\n");
}
scanf("%d%c%d",u,w,v); /*输入*/
u=u+1,v=v+1;
if(w!='#'a[u][v]=='@')
goto leb2;
if(w=='#')
{if(a[u][v]=='+'){a[u][v]='@'; lei=lei-1;}
else if(a[u][v]=='@'){a[u][v]='?'; lei=lei+1;}
else if(a[u][v]=='?'){a[u][v]='+';}
goto leb2;
}
a[u][v]=b[u][v];
leb3: /*打开0区*/
t=0;
if(a[u][v]=='0')
{for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i=hang;i=i+1)
{for(j=lie;j=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i=1;i=i-1)
{for(j=1;j=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i=1;i=i-1)
{for(j=lie;j=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1;if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i=hang;i=i+1) /*检测0区*/
{for(j=1;j=lie;j=j+1)
{if(a[i][j]=='0')
{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1;
if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1;
if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1;
if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1;
if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1;
if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1;
if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1;
if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1;
}
}
}
if(t==1)goto leb3;
}
n=0; /*检查结束*/
for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1)
{if(a[i][j]!='+'a[i][j]!='@'a[i][j]!='?')n=n+1;}
}
}
while(a[u][v]!='#'n!=(hang*lie-ge));
for(i=1;i=ge;i=i+1) /*游戏结束*/
{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]='#'; }
printf(" ");
for(i=1;i=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("\n |");
for(i=1;i=lie;i=i+1){printf("---|");}
printf("\n");
for(i=1;i=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩余雷个数");
if(i==3)printf(" %d",lei); printf("\n |");
for(j=1;j=lie;j=j+1) {printf("---|");}
printf("\n");
}
if(n==(hang*lie-ge)) printf("你成功了!\n");
else printf(" 游戏结束!\n");
printf(" 重玩请输入1\n");
t=0;
scanf("%d",t);
if(t==1)goto leb1;
}
/*注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入【0a9】三个字符再按回车键。3行7列不是雷,则输入【3a7】回车;第8行第5列是雷,就输入【8#5】回车,9行0列是雷则输入【9#0】并回车*/
怎样用C语言编写一个小游戏?
“贪吃蛇”C代码:
#include stdio.h
#include stdlib.h
#include conio.h
#include time.h
#include Windows.h
#define W 78 //游戏框的宽,x轴
#define H 26 //游戏框的高,y轴
int dir=3; //方向变量,初值3表示向“左”
int Flag=0; //吃了食物的标志(1是0否)
int score=0; //玩家得分
struct food{ int x; //食物的x坐标
int y; //食物的y坐标
}fod; //结构体fod有2个成员
struct snake{ int len; //身长
int speed; //速度
int x[100];
int y[100];
}snk; //结构体snk有4个成员
void gtxy( int x,int y) //控制光标移动的函数
{ COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void gtxy( int x,int y); //以下声明要用到的几个自编函数
void csh( ); //初始化界面
void keymove( ); //按键操作移动蛇
void putFod( ); //投放食物
int Over( ); //游戏结束(1是0否)
void setColor(unsigned short p, unsigned short q); //设定显示颜色
int main( ) //主函数
{ csh( );
while(1)
{ Sleep(snk.speed);
keymove( );
putFod( );
if(Over( ))
{system(“cls”);
gtxy(W/2+1,H/2); printf(“游戏结束!T__T”);
gtxy(W/2+1,H/2+2); printf(“玩家总分:%d分”,score);
getch( );
break;
}
}
return 0;
}
void csh( ) //初始化界面
{ int i;
gtxy(0,0);
CONSOLE_CURSOR_INFO cursor_info={1,0}; //以下两行是隐藏光标的设置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);
for(i=0;i=W;i=i+2) //横坐标要为偶数,因为这个要打印的字符占2个位置
{ setColor(2, 0); //设定打印颜色为绿字黑底
gtxy(i,0); printf("■"); //打印上边框
gtxy(i,H); printf("■"); //打印下边框
}
for(i=1;iH;i++)
{ gtxy(0,i); printf("■"); //打印左边框
gtxy(W,i); printf("■"); //打印右边框
}
while(1)
{ srand((unsigned)time(NULL)); //初始化随机数发生器srand( )
fod.x=rand()%(W-4)+2; //随机函数rand( )产生一个从0到比”(W-4)”小1的数再加2
fod.y=rand()%(H-2)+1; //随机函数rand( )产生一个从0到比”(H-2)”小1的数再加1
if (fod.x%2==0) break; //fod.x是食物的横坐标,要是2的倍数(为偶数)
}
setColor(12, 0); //设定打印颜色为淡红字黑底
gtxy(fod.x,fod.y); printf("●"); //到食物坐标处打印初试食物
snk.len=3; //蛇身长
snk.speed=350; //刷新蛇的时间,即是移动速度
snk.x[0]=W/2+1; //蛇头横坐标要为偶数(因为W/2=39)
snk.y[0]=H/2; //蛇头纵坐标
setColor(9, 0); //设定打印颜色为淡蓝字黑底
gtxy(snk.x[0], snk.y[0]); printf("■"); //打印蛇头
for(i=1;isnk.len;i++)
{ snk.x[i]=snk.x[i-1]+2; snk.y[i]=snk.y[i-1];
gtxy(snk.x[i],snk.y[i]); printf("■"); //打印蛇身
}
setColor(7, 0); //恢复默认的白字黑底
return;
}
void keymove( ) //按键操作移动蛇
{ int key;
if( kbhit( ) ) //如有按键输入才执行下面操作
{ key=getch( );
if (key==224) //值为224表示按下了方向键,下面要再次获取键值
{ key=getch( );
if(key==72dir!=2)dir=1; //72表示按下了向上方向键
if(key==80dir!=1)dir=2; //80为向下
if(key==75dir!=4)dir=3; //75为向左
if(key==77dir!=3)dir=4; //77为向右
}
if (key==32)
{ while(1) if((key=getch( ))==32) break; } //32为空格键,这儿用来暂停
}
if (Flag==0) //如没吃食物,才执行下面操作擦掉蛇尾
{ gtxy(snk.x[snk.len-1],snk.y[snk.len-1]); printf(" "); }
int i;
for (i = snk.len - 1; i 0; i--) //从蛇尾起每节存储前一节坐标值(蛇头除外)
{ snk.x[i]=snk.x[i-1]; snk.y[i]=snk.y[i-1]; }
switch (dir) //判断蛇头该往哪个方向移动,并获取最新坐标值
{ case 1: snk.y[0]--; break; //dir=1要向上移动
case 2: snk.y[0]++; break; //dir=2要向下移动
case 3: snk.x[0]-=2; break; //dir=3要向左移动
case 4: snk.x[0]+=2; break; //dir=4要向右移动
}
setColor(9, 0);
gtxy(snk.x[0], snk.y[0]); printf("■"); //打印蛇头
if (snk.x[0] == fod.x snk.y[0] == fod.y) //如吃到食物则执行以下操作
{ printf("\007"); snk.len++; score += 100; snk.speed -= 5; Flag = 1; } //007是响铃
else Flag = 0; //没吃到食物Flag的值为0
if(snk.speed150) snk.speed= snk.speed+5; //作弊码,不让速度无限加快
}
void putFod( ) //投放食物
{ if (Flag == 1) //如吃到食物才执行以下操作,生成另一个食物
{ while (1)
{ int i,n= 1;
srand((unsigned)time(NULL)); //初始化随机数发生器srand( )
fod.x = rand( ) % (W - 4) + 2; //产生在游戏框范围内的一个x坐标值
fod.y = rand( ) % (H - 2) + 1; //产生在游戏框范围内的一个y坐标值
for (i = 0; i snk.len; i++) //随机生成的食物不能在蛇的身体上
{ if (fod.x == snk.x[i] fod.y == snk.y[i]) { n= 0; break;} }
if (n fod.x % 2 == 0) break; //n不为0且横坐标为偶数,则食物坐标取值成功
}
setColor(12, 0);
gtxy(fod.x, fod.y); printf("●"); //光标到取得的坐标处打印食物
}
return;
}
int Over( ) //判断游戏是否结束的函数
{ int i;
setColor(7, 0);
gtxy(2,H+1); printf(“暂停键:space.”); //以下打印一些其它信息
gtxy(2,H+2); printf(“游戏得分:%d”,score);
if (snk.x[0] == 0 || snk.x[0] == W) return 1; //蛇头触碰左右边界
if (snk.y[0] == 0 || snk.y[0] == H) return 1; //蛇头触碰上下边界
for (i = 1; i snk.len; i++)
{ if (snk.x[0] == snk.x[i] snk.y[0] == snk.y[i]) return 1; } //蛇头触碰自身
return 0; //没碰到边界及自身时就返回0
}
void setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0)
{ HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute( handle, ForeColor + BackGroundColor * 0x10 );
} //用来设定颜色的函数
如何使用C语言编写简单小游戏?
C语言是计算机专业都要学习的一门基础学科。一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣。
例如2048这款游戏:
方法/步骤:
#includestdio.h
#includestdlib.h
#includetime.h
#includeconio.h
#includewindows.h
#define SIZE 4
static 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;iSIZE;i++)
{
for(j=0;jSIZE;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))
break;
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;iSIZE;i++)
{
for(j=0;jSIZE;j++)
printf("| ");
printf("|\n");
for(j=0;jSIZE;j++)
{
if(n[i][j]==0)
printf("| ");
else
printf("|%4d ",n[i][j]);
}
printf("|\n");
for(j=0;jSIZE;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;iSIZE;i++)
for(j=0;jSIZE;j++)
if(n[i][j]==0)
count++;
return count;
}
int isfull(int n[][SIZE])
{
int i,j,count=0;
for(i=0;iSIZE;i++)
{
for(j=1;jSIZE-1;j++)
{
if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])
count++;
}
}
for(j=0;jSIZE;j++)
{
for(i=1;iSIZE-1;i++)
{
if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])
count++;
}
}
return count0?0:1;
}
void math(int n[][SIZE],char c)
{
switch(c)
{
case 'w':tow(n);break;
case 'a':toa(n);break;
case 's':tos(n);break;
case 'd':tod(n);break;
default :;
}
}
void tow(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;aSIZE;a++)
m[a]=0;
for(j=0;jSIZE;j++)
{
for(a=0;aSIZE;a++)
{
for(i=0;iSIZE-1;i++)
{
if(n[i][j]==0)
{
n[i][j]=n[i+1][j];
n[i+1][j]=0;
}
}
}
}
for(j=0;jSIZE;j++)
{
for(a=0,i=0;iSIZE;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;iSIZE;i++)
{
n[i][j]=m[i];
m[i]=0;
}
}
}
void toa(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;aSIZE;a++)
m[a]=0;
for(i=0;iSIZE;i++)
{
for(a=0;aSIZE;a++)
{
for(j=0;jSIZE-1;j++)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j+1];
n[i][j+1]=0;
}
}
}
}
for(i=0;iSIZE;i++)
{
for(a=0,j=0;jSIZE;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;jSIZE;j++)
{
n[i][j]=m[j];
m[j]=0;
}
}
}
void tos(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;aSIZE;a++)
m[a]=0;
for(j=SIZE-1;j=0;j--)
{
for(a=SIZE-1;a=0;a--)
{
for(i=SIZE-1;i0;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;aSIZE;a++)
m[a]=0;
for(i=SIZE-1;i=0;i--)
{
for(a=SIZE-1;a=0;a--)
{
for(j=SIZE-1;j0;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;
}
}
}