俄罗斯方块掉出边界

求大佬解决

#include <stdio.h>

#include <windows.h>
#include <time.h>
#include <conio.h>
#define FrameX 3
#define FrameY 13
#define Frame_height 20
#define Frame_width 18
int i,j,Temp,Temp1,Temp2;
int a[80][80]={0};
int b[4];
struct Tetris
{
int x;
int y;
int number;
int flag;
int speed;
int score;
int level;
int next;
};
HANDLE hOut;


void  gotoxy(int x,int y);
void MakeTetris(struct Tetris *);
void PrintTetris(struct Tetris *);
void CleanTetris(struct Tetris *);
void regulation();
void Replay(struct Tetris*);
void Gameplay();
void Flag(struct Tetris *);
void close();
void welcom();
void title();
void explation();
void DrwaGameframe();
int ifMove(struct Tetris *);
void Del_Fullline(struct Tetris *);


void gotoxy(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}


int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
return 0;
}


void DrwaGameframe()
{
gotoxy(FrameX+Frame_width+5,FrameY-11);
color(11);
printf("趣味俄罗斯方块");
gotoxy(FrameX+Frame_width+30,FrameY-2);
color(2);
printf("***************************");
gotoxy(FrameX+Frame_width+30,FrameY+2);
color(3);
printf("下一个出现方块:");
gotoxy(FrameX+Frame_width+30,FrameY+4);
color(2);
printf("***************************");
gotoxy(FrameX+Frame_width+30,FrameY+6);
color(14);
printf("↑键:旋转");
gotoxy(FrameX+Frame_width+30,FrameY+8);
color(10);
printf("空格:暂停");
gotoxy(FrameX+Frame_width+30,FrameY+10);
color(11);
printf("Esc:退出游戏");
color(12);
gotoxy(FrameX+10,FrameY-9);
printf("╔");
gotoxy(FrameX+Frame_width+26,FrameY-9);
printf("╗");
gotoxy(FrameX+10,FrameY+Frame_height-9);
printf("╚");
gotoxy(FrameX+Frame_width+26,FrameY+Frame_height-9);
printf("╝");
a[FrameX+10][FrameY+Frame_height-9]=2;
a[FrameX+Frame_width+26][FrameY+Frame_height-9]=2;
for(i=2;i<Frame_width+16;i+=2)
{
gotoxy(FrameX+10+i,FrameY-9);
printf("═");

for(i=2;i<Frame_width+16;i+=2)
{
gotoxy(FrameX+10+i,FrameY+Frame_height-9);
printf("═");
a[FrameX+10+i][FrameY+Frame_height-9]=2;
}
for(i=1;i<Frame_height;i++)
{
gotoxy(FrameX+10,FrameY-9+i);
printf("║");
a[FrameX+10][FrameY-9+i]=2;
}
for(i=1;i<Frame_height;i++)
{
gotoxy(FrameX+Frame_width+26,FrameY-9+i);
printf("║");
a[FrameX+Frame_width+26][FrameY-9+i]=2;
}
}


void title()
{
color(11);
gotoxy(28,4);
printf("趣 味 俄 罗 斯 方 块");
color(14);
gotoxy(15,6);
printf("■");
gotoxy(15,7);
printf("■■");
gotoxy(15,8);
printf("■");
color(6);
gotoxy(25,6);
printf("■■");
gotoxy(27,7);
printf("■■");
color(10);
gotoxy(35,6);
printf("■■");
gotoxy(35,7);
printf("■■");
color(13);
gotoxy(45,5);
printf("■");
gotoxy(45,6);
printf("■");
gotoxy(45,7);
printf("■");
gotoxy(45,8);
printf("■");
color(12);
gotoxy(55,7);
printf("■■■");
gotoxy(59,6);
printf("■");
}


void close()
{
exit(0);
}


void welcom()
{
int n;
int i,j=1;
color(14);
for(i=9;i<=26;i++)
{
for(j=15;j<=61;j++)
{
gotoxy(j,i);
if(i==9 || i==26) printf("=");
else if(j==15 || j==60) printf("||");
}
}
color(12);
gotoxy(20,11);
printf("1.开始游戏");
color(5);
gotoxy(45,11);
printf("2.游戏规则");
color(10);
gotoxy(20,20);
printf("3.按键说明");
color(8);
gotoxy(45,20);
printf("4.退出游戏"); 
color(12);
gotoxy(30,30);
printf("请输入[1 2 3 4]:[ ]\b\b");
scanf("%d",&n);
switch(n)
{
case 1:
system("cls"); 
DrwaGameframe();
Gameplay();
break;
case 2:
system("cls");
// regulation();
break;
case 3:
system("cls");
// explation();
break;
case 4:
system("cls");
close();
break;
}
}


void Flag(struct Tetris *tetris)
{
tetris->number++;
srand(time(NULL));
if(tetris->number==1)
{
tetris->flag=rand()%19+1;
}
tetris->next=rand()%19+1;
}


void Gameplay()
{
int n;
struct Tetris t,*tetris=&t;
char ch;
tetris->number=0;
tetris->speed=300;
tetris->score=0;
tetris->level=1;
while(1)
{
Flag(tetris);
Temp=tetris->flag;
tetris->x=FrameX+Frame_width+48;
tetris->y=FrameY+1;
tetris->flag=tetris->next;
PrintTetris(tetris);
tetris->x=FrameX+Frame_width+9;
tetris->y=FrameY-7;
tetris->flag=Temp;
while(1)
{
label:PrintTetris(tetris);
Sleep(tetris->speed);
CleanTetris(tetris);
Temp1=tetris->x;
Temp2=tetris->flag;
if(kbhit())
{
ch=getch();
if(ch==75)
{
tetris->x-=2;
}
if(ch==77)
{
tetris->x+=2;
}
if(ch==80)
{
if(ifMove(tetris)!=0)
{
tetris->y+=2; 
}
if(ifMove(tetris)==0)
{
tetris->y=FrameY+Frame_height-8; 

}
if(ch==72)
{
if( tetris->flag>=2 && tetris->flag<=3 )
      {
      tetris->flag++; 
      tetris->flag%=2;
      tetris->flag+=2;
      }
      if( tetris->flag>=4 && tetris->flag<=7 )
      {
      tetris->flag++;
      tetris->flag%=4;
      tetris->flag+=4;
      }    
      if( tetris->flag>=8 && tetris->flag<=11 )
      {
      tetris->flag++;
      tetris->flag%=4;
      tetris->flag+=8;
      }    
      if( tetris->flag>=12 && tetris->flag<=15 )
      {
      tetris->flag++;
      tetris->flag%=4;
      tetris->flag+=12;
      }    
      if( tetris->flag>=16 && tetris->flag<=19 )
      {
      tetris->flag++;
      tetris->flag%=4;
      tetris->flag+=16;
      }
}
if(ch==32)
{
PrintTetris(tetris);
while(1)
{
if(kbhit())
{
ch=getch();
if(ch==32)
{
goto label;
}
}
}
}
if(ch==27)
{
system("cls");
memset(a,0,6400*sizeof(int));
welcom();
}
if(ifMove(tetris)==0)
{
tetris->x=Temp1;
tetris->flag=Temp2; 
}
else
{
goto label;
}

tetris->y++;
if(ifMove(tetris)==0)
{
tetris->y--;
PrintTetris(tetris);
Del_Fullline(tetris);
break;
}
}
for(i=tetris->y-2;i<tetris->y+2;i++)
{
if(i==FrameY-9)
{
system("cls");
                gotoxy(29,7);
                printf("   \n");
color(12);
printf("\t\t\t■■■■   ■     ■   ■■     \n");
                printf("\t\t\t■         ■■   ■   ■  ■   \n");
                printf("\t\t\t■■■     ■  ■ ■   ■   ■  \n");
printf("\t\t\t■         ■   ■■   ■  ■   \n");
printf("\t\t\t■■■■   ■     ■   ■■     \n");
gotoxy(17,18);
color(14);
printf("我要重新玩一局-------1");
gotoxy(44,18);
printf("不玩了,退出吧-------2\n");
int n;
gotoxy(32,20);
printf("选择【1/2】:");
color(11);
scanf("%d", &n);
    switch (n)
    {
    case 1:
        system("cls");
        Replay(tetris);       //重新开始游戏
        break;
    case 2:
        exit(0);
        break;
}
}
}
tetris->flag=tetris->next;
tetris->x=FrameX+Frame_width+48;
tetris->y=FrameY+1;
CleanTetris(tetris);
}
}




void Del_Fullline(struct Tetris *tetris)
{
int k,del_rows=0;
for(j=FrameY+Frame_height-9;j>=FrameY-9;j--)
{
k=0;
for(i=FrameX+10;i<FrameX+Frame_width+26;i+=2)
{
if(a[i][j]==1)
{
k++;
if(k==7)
{
for(k=FrameX+12;k<FrameX+Frame_width+26;k+=2)
{
a[k][j]=0;
gotoxy(k,j);
printf("  "); 

for(k=j-1;k>FrameY;k--)
{
for(i=FrameX+12;i<FrameX+Frame_width+26;i+=2)
{
if(a[i][k]==1)
{
a[i][k]=0;
gotoxy(i,k);
printf("  ");
a[i][k+1]=1;
gotoxy(i,k+1);
printf("■");
}
}
}
j++;
del_rows++;
}
}
}
}
tetris->score+=100*del_rows;
if(del_rows>0 && (tetris->score%1000==0||tetris->score/1000>tetris->level-1))
{
tetris->speed-=20;
tetris->level++;
}
}


int ifMove(struct Tetris *tetris)
{
if(a[tetris->x][tetris->y]!=0)
{
return 0;
}
else
  {
  if( //当为田字方块且除中心方块位置外,其他"■"字方块位置上无图案时,说明这个位置能够放下田字方块,可以移动到这个位置,返回值为1,即可移动
//比如田字方块,它的中心方块是左下角的■,如果它的上,右,右上的位置为空,则这个位置就可以放一个田字方块;如果有一个位置上不为空,都放不下一个田
    ( tetris->flag==1  && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||
    //或为直线方块且除中心方块位置外,其他"■"字方块位置上无图案时,返回值为1,即可移动
    ( tetris->flag==2  && ( a[tetris->x-2][tetris->y]==0   && 
    a[tetris->x+2][tetris->y]==0 && a[tetris->x+4][tetris->y]==0 ) )   ||
    ( tetris->flag==3  && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x][tetris->y-2]==0 && a[tetris->x][tetris->y+1]==0 ) )   ||
    ( tetris->flag==4  && ( a[tetris->x-2][tetris->y]==0   &&
    a[tetris->x+2][tetris->y]==0 && a[tetris->x][tetris->y+1]==0 ) )   ||
    ( tetris->flag==5  && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y]==0 ) )   ||
    ( tetris->flag==6  && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y]==0 ) )   ||
    ( tetris->flag==7  && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) )   ||
    ( tetris->flag==8  && ( a[tetris->x][tetris->y+1]==0   &&
    a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) ||
    ( tetris->flag==9  && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x-2][tetris->y]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) ||
    ( tetris->flag==10 && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||
    ( tetris->flag==11 && ( a[tetris->x][tetris->y+1]==0   &&
    a[tetris->x-2][tetris->y-1]==0 && a[tetris->x-2][tetris->y]==0 ) ) ||
    ( tetris->flag==12 && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y-1]==0 ) ) ||
    ( tetris->flag==15 && ( a[tetris->x-2][tetris->y]==0   &&
    a[tetris->x-2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||
    ( tetris->flag==14 && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) ||
    ( tetris->flag==13 && ( a[tetris->x-2][tetris->y]==0   &&
    a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||
    ( tetris->flag==16 && ( a[tetris->x][tetris->y+1]==0   &&
    a[tetris->x][tetris->y-1]==0 && a[tetris->x+2][tetris->y-1]==0 ) ) ||
    ( tetris->flag==19 && ( a[tetris->x-2][tetris->y]==0   &&
    a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||
    ( tetris->flag==18 && ( a[tetris->x][tetris->y-1]==0   &&
    a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) ||
    ( tetris->flag==17 && ( a[tetris->x-2][tetris->y]==0   &&
    a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) )
    {
    return 1;
    }
}
 
}


void Replay(struct Tetris *)
{
system("cls");
memset(a,0,6400*sizeof(int));
DrwaGameframe();
Gameplay();
}


void PrintTetris(struct Tetris *tetris)
{
for(i=0;i<4;i++)
{
b[i]=1;
}
MakeTetris(tetris);
for(i=tetris->x-2;i<tetris->x+4;i+=2)
{
for(j=tetris->y-2;j<=tetris->y+1;j++)
{
if(a[i][j]==1 && j>FrameY-9)
{
gotoxy(i,j);
printf("■"); 

}
}
gotoxy(FrameX+Frame_width+30,FrameY-7);
color(4);
  printf("level : ");
  color(12);
  printf(" %d",tetris->level);
gotoxy(FrameX+Frame_width+30,FrameY-5);
color(4);
  printf("score : ");
  color(12);
  printf(" %d",tetris->score);
gotoxy(FrameX+Frame_width+30,FrameY-3);
color(4);
  printf("speed : ");
  color(12);
printf(" %dms",tetris->speed);
}


void CleanTetris(struct Tetris *tetris)
{
  for(i=0;i<4;i++)
  {
  b[i]=0;         //数组b[4]的每个元素的值都为0
  }
MakeTetris(tetris);      //制作俄罗斯方块
for( i = tetris->x - 2;i <= tetris->x + 4; i+=2 )       //■X ■■  X为中心方块
{
  for(j = tetris->y-2;j <= tetris->y + 1;j++)        /* ■
 ■
 X
   ■ */
  {
    if( a[i][j] == 0 && j > FrameY-9 )
    {
    gotoxy(i,j);
    printf("  ");    //清除方块
    }
  }
  }
}


 
void MakeTetris(struct Tetris *tetris)
{
  a[tetris->x][tetris->y]=b[0];    //中心方块位置的图形状态
  switch(tetris->flag)      //共7大类,19种类型
  {
  case 1:         /*田字方块 ■■
                ■■  */
    {
color(10);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x+2][tetris->y-1]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    break;
    }
  case 2:         /*直线方块 ■■■■*/
    {
  color(13);
    a[tetris->x-2][tetris->y]=b[1];
    a[tetris->x+2][tetris->y]=b[2];
    a[tetris->x+4][tetris->y]=b[3];
    break;
    }
  case 3:         /*直线方块 ■
                ■
  ■
  ■  */
    {
  color(13);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x][tetris->y-2]=b[2];
    a[tetris->x][tetris->y+1]=b[3];
    break;
    }
  case 4:         /*T字方块 ■■■
                 ■  */
    {
  color(11);
    a[tetris->x-2][tetris->y]=b[1];
    a[tetris->x+2][tetris->y]=b[2];
    a[tetris->x][tetris->y+1]=b[3];
    break;
    }
  case 5:         /* 顺时针90°T字方块   ■
                          ■■
          ■*/
    {
  color(11);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x][tetris->y+1]=b[2];
    a[tetris->x-2][tetris->y]=b[3];
    break;
    }
  case 6:         /* 顺时针180°T字方块     ■
                             ■■■*/
    {
  color(11);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x-2][tetris->y]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    break;
    }
  case 7:         /* 顺时针270°T字方块   ■
                             ■■
           ■  */
    {
  color(11);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x][tetris->y+1]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    break;
    }
  case 8:         /* Z字方块   ■■
                    ■■*/
    {
  color(14);
    a[tetris->x][tetris->y+1]=b[1];
    a[tetris->x-2][tetris->y]=b[2];
    a[tetris->x+2][tetris->y+1]=b[3];
    break;
    }
  case 9:         /* 顺时针Z字方块      ■
                         ■■
       ■  */
    {
  color(14);                                                                                                      
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x-2][tetris->y]=b[2];
    a[tetris->x-2][tetris->y+1]=b[3];
    break;
    }
  case 10:        /* 反转Z字方块      ■■
                       ■■  */
    {
  color(14);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x-2][tetris->y-1]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    break;
    }
  case 11:        /* 顺时针Z字方块    ■
                         ■■
         ■  */
    {
  color(14);
    a[tetris->x][tetris->y+1]=b[1];
    a[tetris->x-2][tetris->y-1]=b[2];
    a[tetris->x-2][tetris->y]=b[3];
    break;
    }
  case 12:        /* 7字方块    ■■
                     ■
   ■  */
    {
  color(12);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x][tetris->y+1]=b[2];
    a[tetris->x-2][tetris->y-1]=b[3];
    break;
    }
  case 13:        /* 顺时针90°7字方块        ■
                             ■■■*/
    {
  color(12);
    a[tetris->x-2][tetris->y]=b[1];
    a[tetris->x+2][tetris->y-1]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    break;
    }
  case 14:        /* 顺时针180°7字方块      ■
                                ■
              ■■  */
    {
  color(12);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x][tetris->y+1]=b[2];
    a[tetris->x+2][tetris->y+1]=b[3];
    break;
    }
  case 15:        /* 顺时针270°7字方块    ■■■
                              ■    */
    {
  color(12);
    a[tetris->x-2][tetris->y]=b[1];
    a[tetris->x-2][tetris->y+1]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    break;
    }
  case 16:        /* 反转7字方块    ■■
                       ■
 ■    */
    {
  color(12);
    a[tetris->x][tetris->y+1]=b[1];
    a[tetris->x][tetris->y-1]=b[2];
    a[tetris->x+2][tetris->y-1]=b[3];
    break;
    }
  case 17:        /* 顺时针转90°7字方块    ■■■
                                   ■*/
    {
  color(12);
    a[tetris->x-2][tetris->y]=b[1];
    a[tetris->x+2][tetris->y+1]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    break;
    }
  case 18:        /* 顺时针转180°7字方块    ■
                                ■
            ■■    */
    {
  color(12);
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x][tetris->y+1]=b[2];
    a[tetris->x-2][tetris->y+1]=b[3];
    break;
    }
  case 19:        /* 顺指针转270°7字方块    ■
                                ■■■*/
  {
  color(12);
    a[tetris->x-2][tetris->y]=b[1];
    a[tetris->x-2][tetris->y-1]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    break;
  }
  } 
}




int main()
{
title();
welcom();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值