⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 youxi.txt

📁 游戏编写 实现游戏俄罗斯方块游戏代码,操作简便
💻 TXT
字号:
/**************************************************/
/*                                    */
/*       俄罗斯方块游戏  程序设计:刘红石          */
/*                          */
/*  http://www.liuhs.com              */
/* 为便有理解程序,此程序尽量简化,并使用文本方式 */ 
/*                          */
/**************************************************/

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

/* 七种拼块的形状数据 */
char fk[7][4][2]={
      1,1,1,2,1,3,1,4,
      1,1,1,2,1,3,2,3,
      2,1,2,2,1,3,2,3,
      1,1,1,2,2,2,2,3,
      2,1,2,2,1,3,2,3,
      1,1,2,1,1,2,2,2,
      1,1,1,2,1,3,2,2};
/* 存放组成拼块的四个小方块X和Y坐标 */
int kx[4],ky[4];
/* 桶 */
int tong[13][25];

/* 等待按键并延时的函数 */
char key(int s)
{
  clock_t t1,t2;
  char c;
  t1=clock();
  do
    t2=clock();
  while (((t2-t1)<s) && !kbhit());
  if (kbhit())
    c=getch();
  else
    c=0;
  return  c;
}


/* 显示或清除方块的函数 */
void kuai(int x,int y,int c)
{
  char cc[3];
  if(c==1)
    strcpy(cc,"[]");
  else
    strcpy(cc,"  ");
  gotoxy(x*2,y);
  puts(cc);
  gotoxy(79,24);
}

/* 画出拼块 */
void hua()
{
  int i;
  for(i=0;i<4;i++)
    kuai(kx[i],ky[i],1);
}

/* 清除拼块的函数 */
void ca()
{
  int i;
  for(i=0;i<4;i++)
    kuai(kx[i],ky[i],0);
}

/* 拼块下落一行 */
int xialuo()
{
  int t,i;
  ca();
  t=1;
  for(i=0;i<4;i++){
    if(ky[i]==24) {t=0; break;};
    if(tong[kx[i]][ky[i]+1]==1) {t=0; break;};
  }
  if(t==1)
    for(i=0;i<4;i++)
      ky[i]=ky[i]+1;
  else
    for(i=0;i<4;i++)
      tong[kx[i]][ky[i]]=1;
  hua();
  return t;
}

/* 拼块左右移动函数 */
void yidong(int p)
{
  int t,i;
  ca();
  t=1;
  i=0;
  do{
    if((kx[i]==1)&&(p==-1)) {t=0; break;};
    if((kx[i]==12)&&(p==1)) {t=0; break;};
    if (tong[kx[i]+p][ky[i]]==1) {t=0; break;};
    i++;
  } while (i<4);
  if(t==1)
    for(i=0;i<4;i++)
      kx[i]=kx[i]+p;
  hua();
}

/* 旋转拼块的函数 */
void zhuan()
{
  int i,t,x,y;
  int kx1[4],ky1[4];
  ca();
  x=kx[1]; y=ky[1];
  for(i=0;i<4;i++) {
    kx1[i]=x+y-ky[i]; ky1[i]=y-x+kx[i];
  }
  t=1;
  for(i=0;i<4;i++){
    if((kx1[i]<1)||(kx1[i]>12)||(ky1[i]<1)||(ky1[i]>24)) {t=0; break;};
    if (tong[kx1[i]][ky1[i]]==1) {t=0; break;};
  }
  if(t==1)
    for(i=0;i<4;i++){
      kx[i]=kx1[i]; ky[i]=ky1[i];
    };
  hua();
}

/* 计算一行中的方块数 */
int fangkuaishu(int h)
{
  int i,p=0;
  for(i=1;i<=12;i++)
    p=p+tong[i][h];
  if(p==12)
    for(i=1000;i<=4000;i+=80){
      sound(i);
      delay(10);
    }
  nosound();
  return p;
}

/* 桶中方块除去一行,在此行上面的方块下移一行 */
void yihang(int h)
{
  int k,j,q;
  for(k=h;k>0;k--){
    q=0;
    for(j=1;j<=12;j++){
      if(tong[j][k]!=tong[j][k-1]){
    kuai(j,k,tong[j][k-1]);
    tong[j][k]=tong[j][k-1];
       }
       q=q+tong[j][k];
    }
    if(q==0) break;
  }
}

/* 检查有无完成的行,并处理之 */
void jiancha()
{
  int i,n;
  i=24;
  do{
    n=fangkuaishu(i);
    if(n==12) yihang(i); else i--;
  } while((i>0)&&(n>0));
}

/* 开始函数,初始化,画出空桶*/
void kaishi()
{
  int i,j;
  for(i=1;i<=24;i++)
    for(j=1;j<=12;j++)
      tong[j][i]=0;
  clrscr();
  for(i=0;i<24;i++)
    puts("|                        |");
  printf("`------------------------'");
  randomize();
}


/**********************************************/

/* 主程序 */
main()
{
   int i,j,k,s;
   int m,t;
   char kk;

   kaishi();      /* 屏幕初始化,显示空桶 */
   for(;;){       /* 开始一个循环,在此循环中不断检测按键并处理之 */ 
     m=rand()%7;  /* 随机产生一种拼块 */
     for(i=0;i<4;i++){               /* 计算拼块在桶中的坐标 */
       kx[i]=fk[m][i][0]+5;
       ky[i]=fk[m][i][1];
     }
     t=1;
     for(i=0;i<4;i++)     /* 检查拼块是否能放入桶中,不能放则退出游戏 */
       if (tong[kx[i]][ky[i]]==1)
     exit(0);
     hua();  /* 画出拼块 */
     s=0;    /* S是一个标志,指示是否按了空格键 */
     for(;;){  /* 此循环中处理一个拼块的下落过程 */
       if(s==0) kk=key(9); else kk=key(0); /* 按过了空格键则不延时 */
       if((kk>='a')&&(kk<='z')) kk=kk-32;  /* 将小写字母转换为大写 */
       switch (kk){                        /* 根据按键作相应处理 */  
     case ' ' : s=1;      break;     /* 按空格, 快速下落 */  
     case 'K': zhuan();      break;     /* 按K,旋转拼块 */
     case 'J': yidong(-1);     break;     /* 按J,左移拼块 */
     case 'L': yidong(1);     break;     /* 按L,右移拼块 */
     case 'S': while(kbhit()==0);break;  /* 按S,暂停游戏 */
     case 'E': exit(0);     break;     /* 按E,结束游戏 */    
     default : t=xialuo(); /* 没按上面的键,或未按任何键,拼块下落一格 */ 
       }
       if(t==0) break;    /* 拼块落到桶底或不能再下落退出循环 */
     }
     jiancha();           /* 检查是否有完成的行,并处理之 */
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -