能不能介绍点C语言编程的小游戏,例如贪吃蛇,。。好玩点的。要有代码,谢谢了

 我来答
小女子刚及笄
2020-04-10 · TA获得超过457个赞
知道小有建树答主
回答量:411
采纳率:100%
帮助的人:65.9万
展开全部

可以学写“俄罗斯方块”代码:

#include <stdio.h>

#include <conio.h>

#include <time.h>

#include <windows.h>

#define  ZL  4    //坐标增量, 不使游戏窗口靠边

#define W  36   //游戏窗口的宽度

#define H  20   //游戏窗口的高度

int i,j,Ta,Tb,Tc;     // Ta,Tb,Tc用于记住和转换方块变量的值

int a[60][60]={0};   //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框

int b[4];       //标记4个"口"方块:1有,0无,类似开关

int x,y, level,score,speed;   //方块中心位置的x,y坐标,游戏等级、得分和游戏速度

int flag,next;   //当前要操作的方块类型序号,下一个方块类型序号

void gtxy(int m, int n);  //以下声明要用到的自编函数

void setColor(unsigned short p, unsigned short q); //设定显示颜色

void gflag( );  //获得下一方块类型的序号

void csh( );   //初始化界面

void start( );  //开始部分

void prfk ( );   //打印方块

void clfk( );   //清除方块

void mkfk( );  //制作方块

void keyD( );  //按键操作

int  ifmov( );  //判断能否移动

void clHA( );  //清除满行的方块

void clNEXT( );  //清除边框外的NEXT方块

int main( )

{ csh( );

  while(1)

    { start( );

      while(1)

        { setColor(5, 0); 

           prfk( );   Sleep(speed);  clfk( );

           Tb=x;Tc=flag;  //临存当前x坐标和序号,以备撤销操作

           keyD( );  

           y++;     //方块向下移动

           if (ifmov( )==0) { y--; setColor(2, 0);prfk( ); clHA( ); break;} //不可动时的操作

         }

      for(i=y-2;i<y+2;i++){ if (i==ZL) { j=0; } }  //方块触到框顶

     if (j==0) {  system("cls");gtxy(10,10); setColor(6, 0);

                       printf("游戏结束!"); getch(); break;  }

     clNEXT( );  

    }

  return 0;

}

void gtxy(int m, int n)  //控制光标移动

{COORD pos;  //定义变量

 pos.X = m;  //横坐标

 pos.Y = n;   //纵坐标

 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); //获得显示器句柄

}

void setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0)

{ HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);

}

void csh( )    //初始化界面

{gtxy(ZL+W/2-5,ZL-2); setColor(10, 0); printf("俄罗斯方块");      //打印游戏名称

 gtxy(ZL+W+3,ZL+7); setColor(5, 0);printf("******* NEXT:");  //打印菜单信息

 gtxy(ZL+W+3,ZL+13); setColor(5, 0);printf("************");

 gtxy(ZL+W+3,ZL+15); setColor(9, 0);printf("Esc :退出游戏");

gtxy(ZL+W+3,ZL+17); setColor(9, 0);printf("↑键:变体");

 gtxy(ZL+W+3,ZL+19); setColor(9, 0);printf("空格:暂停游戏");

 gtxy(ZL,ZL); setColor(2, 0); printf("╔");  gtxy(ZL+W-2,ZL);  printf("╗");  //打印框角

 gtxy(ZL,ZL+H); printf("╚");  gtxy(ZL+W-2,ZL+H);  printf("╝");

a[ZL][ZL+H]=2;  a[ZL+W-2][ZL+H]=2;  //记住有图案

 for(i=2;i<W-2;i+=2) {gtxy(ZL+i,ZL);  printf("═"); }  //打印上横框

 for(i=2;i<W-2;i+=2) {gtxy(ZL+i,ZL+H); printf("═"); a[ZL+i][ZL+H]=2; } //打印下横框有图案

 for(i=1;i<H;i++) { gtxy(ZL,ZL+i);  printf("║"); a[ZL][ZL+i]=2; }  //打印左竖框记住有图案

 for(i=1;i<H;i++) {gtxy(ZL+W-2,ZL+i); printf("║"); a[ZL+W-2][ZL+i]=2; } //打印右竖框有图案

 CONSOLE_CURSOR_INFO cursor_info={1,0};   //以下是隐藏光标的设置

 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);

 level=1; score=0; speed=400;

 gflag( );  flag=next;  //获得一个当前方块序号

}

 

void gflag( )  //获得下一个方块类型的序号

{ srand((unsigned)time(NULL)); next = rand()%19+1; }

 

void start( )  //开始部分

{ gflag( );  Ta=flag;  flag=next;  //保存当前方块序号,将下一方块序号临时操作

  x=ZL+W+6; y=ZL+10; setColor(5, 0); prfk( );  //给x,y赋值,在框外打印出下一方块

 flag=Ta; x=ZL+W/2; y=ZL-1;  //取回当前方块序号,并给x,y赋值

}

void prfk ( )  //打印俄罗斯方块

{ for(i=0;i<4;i++) {b[i]=1; }  //数组b[4]每个元素的值都为1

  mkfk ( );  //制作俄罗斯方块

 for( i= x-2; i<=x+4; i+=2 )  //打印方块

   { for(j=y-2;j<= y+1;j++) { if( a[i][j]==1 && j>ZL ){ gtxy(i,j); printf("□"); } } }

 gtxy(ZL+W+3,ZL+1); setColor(9, 0);  printf("level : %d",level);  //以下打印菜单信息

 gtxy(ZL+W+3,ZL+3); setColor(9, 0);  printf("score : %d",score);

 gtxy(ZL+W+3,ZL+5); setColor(9, 0);  printf("speed : %d",speed);

}

void clfk( )  //清除俄罗斯方块

{ for(i=0;i<4;i++) { b[i]=0; }  //数组b[4]每个元素的值都为0

  mkfk ( );  //制作俄罗斯方块

 for( i=x-2; i<=x+4; i+=2 )  //清除方块

  { for(j=y-2;j<=y+1;j++){ if( a[i][j]==0 && j>ZL ){ gtxy(i,j); printf("  "); } } }

}

 

void mkfk( )  //制作俄罗斯方块

{ a[x][ y]=b[0];  //方块中心位置状态: 1-有,0-无

 switch(flag)   //共6大类,19种小类型

 { case 1: { a[x][y-1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //田字方块

  case 2: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x+4][y]=b[3]; break; }  //直线方块:----

  case 3: { a[x][y-1]=b[1]; a[x][y-2]=b[2]; a[x][y+1]=b[3]; break; }  //直线方块: |

  case 4: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x][y+1]=b[3]; break; }  //T字方块

  case 5: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y]=b[3]; break; }  //T字顺时针转90度

  case 6: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转180度

  case 7: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转270度

  case 8: { a[x][y+1]=b[1]; a[x-2][y]=b[2]; a[x+2][y+1]=b[3]; break; } //Z字方块

  case 9: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x-2][y+1]=b[3]; break; }  //Z字顺转90度

  case 10: { a[x][y-1]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //Z字顺转180度

  case 11: { a[x][y+1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][ y]=b[3]; break; } //Z字顺转270度

  case 12: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y-1]=b[3]; break; }  //7字方块

case 13: {a[x-2][y]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转90度

  case 14: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y+1]=b[3]; break; }  //7字顺转180度

  case 15: { a[x-2][y]=b[1]; a[x-2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转270度

  case 16: { a[x][y+1]=b[1]; a[x][y-1]=b[2]; a[x+2][y-1]=b[3]; break; }  //倒7字方块

case 17: { a[x-2][y]=b[1]; a[x+2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转90度

case 18: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y+1]=b[3]; break; }  //倒7字顺转180度

  case 19: { a[x-2][y]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转270度

 }

}

void keyD( )  //按键操作

{ if (kbhit( ))       

   { int key;

key=getch();

     if (key==224)

       { key=getch();

if (key==75) { x-=2; }  //按下左方向键,中心横坐标减2

         if (key==77) { x+=2; }  //按下右方向键,中心横坐标加2

if (key==72)     //按下向上方向键,方块变体

          { if (flag>=2 && flag<=3 ) { flag++; flag%=2; flag+=2; }

           if ( flag>=4 && flag<=7 ) { flag++; flag%=4; flag+=4; }

           if (flag>=8 && flag<=11 ) { flag++; flag%=4; flag+=8; }

           if (flag>=12 && flag<=15 ) { flag++; flag%=4; flag+=12; }

           if ( flag>=16 && flag<=19 ) { flag++; flag%=4; flag+=16; } }

        }

     if (key==32)     //按空格键,暂停

        { setColor(5, 0);prfk( ); while(1) { if (getch( )==32) { clfk( );break;} } } //再按空格键,继续游戏

     if (ifmov( )==0) { x=Tb; flag=Tc; } //如果不可动,撤销上面操作

     else { setColor(5, 0); prfk( ); Sleep(speed); clfk( ); Tb=x;Tc=flag;} //如果可动,执行操作

}

}

int ifmov( )   //判断能否移动

{ if (a[x][y]!=0) { return 0; }  //方块中心处有图案返回0,不可移动

 else{ if ( (flag==1 && ( a[x][ y-1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||  //田字方块

       (flag==2 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x+4][y]==0 ) ) ||  //以下为其它方块

       (flag==3 && ( a[x][y-1]==0 && a[x][y-2]==0 && a[x][y+1]==0 ) ) ||

       (flag==4 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x][y+1]==0 ) ) ||

       (flag==5 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y]==0 ) ) ||

       (flag==6 && ( a[x][ y-1]==0 && a[x-2][y]==0 && a[x+2][y]==0 ) ) ||

       (flag==7 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y]==0 ) ) ||

       (flag==8 && ( a[x][y+1]==0 && a[x-2][y]==0 && a[x+2][y+1]==0 ) ) ||

       (flag==9 && ( a[x][y-1]==0 && a[x-2][y]==0 && a[x-2][y+1]==0 ) ) ||

       (flag==10 && ( a[x][y-1]==0 && a[x-2][y-1]==0 && a[x+2][y]==0 ) ) ||

       (flag==11 && ( a[x][y+1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||

       (flag==12 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y-1]==0 ) ) ||

( flag==13 && ( a[x-2][y]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||

       ( flag==14 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y+1]==0 ) ) ||

(flag==15 && ( a[x-2][y]==0 && a[x-2][y+1]==0 && a[x+2][y]==0 ) ) ||

(flag==16 && ( a[x][y+1]==0 && a[x][y-1]==0 && a[x+2][y-1]==0 ) ) ||

( flag==17 && ( a[x-2][y]==0 && a[x+2][y+1]==0 && a[x+2][y]==0 ) ) ||

       (flag==18 && ( a[x][y-1]==0 &&a[x][y+1]==0 && a[x-2][y+1]==0 ) ) ||

       (flag==19 && ( a[x-2][y]==0 && a[x-2][y-1]==0 && a[x+2][y]==0 ) ) ) { return 1; }

    }

  return 0;  //其它情况返回0

}

void clNEXT( )  //清除边框外的NEXT方块

{ flag = next;  x=ZL+W+6;  y=ZL+10;  clfk( ); }

 

void clHA( )  //清除满行的方块

{ int k, Hang=0;   //k是某行方块个数, Hang是删除的方块行数

 for(j=ZL+H-1;j>=ZL+1;j--)  //当某行有W/2-2个方块时,则为满行

  { k=0; for(i=ZL+2;i<ZL+W-2;i+=2)

    { if (a[i][j]==1)   //竖坐标从下往上,横坐标由左至右依次判断是否满行

     { k++;  //下面将操作删除行

if (k==W/2-2) { for(k=ZL+2;k<ZL+W-2;k+=2) { a[k][j]=0; gtxy(k,j); printf("  "); Sleep(1); }

         for(k=j-1;k>ZL;k--)

           { for(i=ZL+2;i<ZL+W-2;i+=2)  //已删行数的上面有方块,先清除再全部下移一行

            { if(a[i][k]==1) { a[i][k]=0; gtxy(i,k); printf("  ");a[i][k+1]=1; gtxy(i,k+1);

setColor(2, 0); printf("□"); } }

           }

        j++;     //方块下移后,重新判断删除行是否满行

        Hang++;  //记录删除方块的行数

        }

      }

     }

   }

  score+=100*Hang;  //每删除一行,得100分

  if ( Hang>0 && (score%500==0 || score/500> level-1 ) )  //满500分速度加快,升一级

   { speed-=20; level++; if(speed<200)speed+=20;}

}

匿名用户
推荐于2017-10-10
展开全部
贪吃蛇的源码,用'A''S''D''W'操作

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>

typedef struct snake
{
int a;
int b;
struct snake *u;
struct snake *n;
}snake,*snake1;
typedef struct food
{
int a;
int b;
}food;
void main()
{
char c,c0 = 'd';
int i,j,k,n=1,t,at;
snake p,q;
snake *dd,*dd0,*dd1,*dd2;
food f;
srand(time(NULL));
p.u = NULL;
p.n = &q;
p.a = 5;p.b = 6;q.a = 5;q.b = 5;
q.u = &p;q.n = NULL;
dd=dd2= &q;
f.a=(rand()%15+1);
f.b=(rand()%15+1);
while(1)
{
srand(time(NULL));
system("cls");
for(i = 0;i < 17;i ++)
{
for(j = 0; j < 17;j++)
{

if(i == 0 )
printf("▁");
else if(i == 16)
printf("▔");
else if(j == 0)
printf("▕");
else if(j == 16)
printf("▏");
else if(i == p.a && j == p.b)
printf("■");
else if(i == f.a && j == f.b)
printf("★");
else
{
t = 0;
dd = dd2;
for(k = 0; k < n ;k++)
{
if(i == dd->a && j == dd->b)
{
printf("□");
t = 1;
break;
}

dd = dd->u;
}
if(t == 0)
printf(" ");
}

}printf("\n");
}
at = 0;
dd =dd2;
for(i=0;i<n;i++)
{
if(p.a == dd->a && p.b == dd->b)
{
printf("game over!!\n");
exit(0);
}
dd = dd->u;
}
if(p.a == f.a && p.b == f.b)
{
dd = dd2;
at =1;
f.a = (rand()%15+1);
f.b = (rand()%15+1);
for(i=0;i<n;i++)
{
if(f.a == dd->a && f.b == dd->b)
{
f.a = dd2->a;
f.b = dd2->b;
break;
}
}
n++;
}
if(kbhit())
{
c = getch();
dd = dd2;
if(c == 'w' && c0 != 's')
{
if(at == 1)
{
dd0 =(snake1)malloc(sizeof(snake));
dd0->a = dd2->a;dd0->b = dd2->b;
dd0->n = NULL;dd0->u = dd2;
dd2=dd0;
}
dd = dd2;
for(i = 0; i<n ; i++)
{
dd1 = dd->u;
dd->b = dd1->b;
dd->a = dd1->a;
dd = dd->u;
}
if(p.a == 1)
p.a = 15;
else
p.a = (p.a-1)%15;
}
else if(c == 's' && c0 != 'w')
{
if(at == 1)
{
dd0 =(snake1)malloc(sizeof(snake));
dd0->a = dd2->a;dd0->b = dd2->b;
dd0->n = NULL;dd0->u = dd2;
dd2=dd0;
}
dd = dd2;
for(i = 0; i<n ; i++)
{
dd1 = dd->u;
dd->b = dd1->b;
dd->a = dd1->a;
dd = dd->u;
}
p.a = (p.a%15)+1;
}
else if(c == 'a' && c0 != 'd')
{
if(at == 1)
{
dd0 =(snake1)malloc(sizeof(snake));
dd0->a = dd2->a;dd0->b = dd2->b;
dd0->n = NULL;dd0->u = dd2;
dd2=dd0;
}
dd = dd2;
for(i = 0; i<n ; i++)
{
dd1 = dd->u;
dd->b = dd1->b;
dd->a = dd1->a;
dd = dd->u;
}
if(p.b == 1)
p.b = 15;
else
p.b = (p.b-1)%15;
}
else if(c == 'd' && c0 != 'a')
{
if(at == 1)
{
dd0 =(snake1)malloc(sizeof(snake));
dd0->a = dd2->a;dd0->b = dd2->b;
dd0->n = NULL;dd0->u = dd2;
dd2=dd0;
}
dd = dd2;
for(i = 0; i<n ; i++)
{
dd1 = dd->u;
dd->b = dd1->b;
dd->a = dd1->a;
dd = dd->u;
}
p.b = (p.b%15)+1;
}
else
{
goto qq;
}
c0 = c;
}
else
{
qq: if(c0 == 'w')
{
if(at == 1)
{
dd0 =(snake1)malloc(sizeof(snake));
dd0->a = dd2->a;dd0->b = dd2->b;
dd0->n = NULL;dd0->u = dd2;
dd2=dd0;
}
dd = dd2;
for(i = 0; i<n ; i++)
{
dd1 = dd->u;
dd->b = dd1->b;
dd->a = dd1->a;
dd = dd->u;
}
if(p.a == 1)
p.a = 15;
else
p.a=(p.a-1)%15;
}
else if(c0 == 's')
{
if(at == 1)
{
dd0 =(snake1)malloc(sizeof(snake));
dd0->a = dd2->a;dd0->b = dd2->b;
dd0->n = NULL;dd0->u = dd2;
dd2=dd0;
}
dd = dd2;
for(i = 0; i<n ; i++)
{
dd1 = dd->u;
dd->b = dd1->b;
dd->a = dd1->a;
dd = dd->u;
}
p.a=(p.a%15)+1;
}
else if(c0 == 'a')
{

if(at == 1)
{
dd0 =(snake1)malloc(sizeof(snake));
dd0->a = dd2->a;dd0->b = dd2->b;
dd0->n = NULL;dd0->u = dd2;
dd2=dd0;
}
dd = dd2;
for(i = 0; i<n ; i++)
{
dd1 = dd->u;
dd->b = dd1->b;
dd->a = dd1->a;
dd = dd->u;
}
if(p.b == 1)
p.b = 15;
else
p.b=(p.b-1)%15;
}
else if(c0 == 'd')
{
if(at == 1)
{
dd0 =(snake1)malloc(sizeof(snake));
dd0->a = dd2->a;dd0->b = dd2->b;
dd0->n = NULL;dd0->u = dd2;
dd2=dd0;
}
dd = dd2;
for(i = 0; i<n ; i++)
{
dd1 = dd->u;
dd->b = dd1->b;
dd->a = dd1->a;
dd = dd->u;
}
p.b=(p.b%15)+1;

}
}
fflush(stdin);
dd = &q;
_sleep(200);
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式