用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

俄罗斯方块

2018-01-21 作者: 李大叔吖举报

[c++]代码库

#include <stdio.h> 
#include <windows.h> 
#include <conio.h> 
#include <time.h> 
   
//游戏窗口 
#define FrameX 4   //游戏窗口左上角的X轴坐标 
#define FrameY 4   //游戏窗口左上角的Y轴坐标 
#define Frame_height  20 //游戏窗口的高度 
#define Frame_width   18 //游戏窗口的宽度 
   
//定义全局变量 
int i,j,temp,temp1,temp2; //temp,temp1,temp2用于记住和转换方块变量的值 
int a[80][80]={0};   //标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案 
int b[4];     //标记4个"口"方块:1表示有方块,0表示无方块 
     
//声明俄罗斯方块的结构体 
struct Tetris 
 int x;     //中心方块的x轴坐标 
 int y;     //中心方块的y轴坐标 
 int flag;    //标记方块类型的序号 
 int next;    //下一个俄罗斯方块类型的序号 
 int speed;    //俄罗斯方块移动的速度 
 int count;    //产生俄罗斯方块的个数 
 int score;    //游戏的分数 
 int level;    //游戏的等级 
}; 
   
//函数原型声明 
//光标移到指定位置 
void gotoxy(HANDLE hOut, int x, int y); 
//制作游戏窗口 
void make_frame(); 
//随机产生方块类型的序号 
void get_flag(struct Tetris *); 
//制作俄罗斯方块 
void make_tetris(struct Tetris *); 
//打印俄罗斯方块 
void print_tetris(HANDLE hOut,struct Tetris *); 
//清除俄罗斯方块的痕迹 
void clear_tetris(HANDLE hOut,struct Tetris *); 
//判断是否能移动,返回值为1,能移动,否则,不动 
int if_moveable(struct Tetris *); 
//判断是否满行,并删除满行的俄罗斯方块 
void del_full(HANDLE hOut,struct Tetris *); 
//开始游戏 
void start_game(); 
   
   
void main() 
{  
 //制作游戏窗口 
 make_frame();       
 //开始游戏 
 start_game(); 
   
/******光标移到指定位置**************************************************************/ 
void gotoxy(HANDLE hOut, int x, int y) 
 COORD pos; 
 pos.X = x;  //横坐标 
 pos.Y = y;  //纵坐标 
 SetConsoleCursorPosition(hOut, pos); 
   
/******制作游戏窗口******************************************************************/ 
void make_frame() 
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  //定义显示器句柄变量 
   
 gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);   //打印游戏名称 
 printf("俄罗斯方块"); 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);  //打印选择菜单 
 printf("**********下一个方块:"); 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13); 
 printf("**********"); 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17); 
 printf("↑键:变体"); 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19); 
 printf("空格:暂停游戏"); 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15); 
 printf("Esc :退出游戏"); 
   
 gotoxy(hOut,FrameX,FrameY);       //打印框角并记住该处已有图案 
 printf("╔"); 
 gotoxy(hOut,FrameX+2*Frame_width-2,FrameY); 
 printf("╗"); 
 gotoxy(hOut,FrameX,FrameY+Frame_height); 
 printf("╚"); 
 gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height); 
 printf("╝"); 
 a[FrameX][FrameY+Frame_height]=2;      
 a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2; 
   
 for(i=2;i<2*Frame_width-2;i+=2) 
 
  gotoxy(hOut,FrameX+i,FrameY); 
  printf("═");         //打印上横框 
 
 for(i=2;i<2*Frame_width-2;i+=2) 
 
  gotoxy(hOut,FrameX+i,FrameY+Frame_height); 
  printf("═");         //打印下横框 
  a[FrameX+i][FrameY+Frame_height]=2;    //记住下横框有图案 
 
 for(i=1;i<Frame_height;i++) 
 
  gotoxy(hOut,FrameX,FrameY+i);  
  printf("║");         //打印左竖框 
  a[FrameX][FrameY+i]=2;       //记住左竖框有图案 
 
 for(i=1;i<Frame_height;i++) 
 
  gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);  
  printf("║");         //打印右竖框 
  a[FrameX+2*Frame_width-2][FrameY+i]=2;   //记住右竖框有图案 
 
   
/******制作俄罗斯方块********************************************************************/ 
void make_tetris(struct Tetris *tetris) 
 a[tetris->x][tetris->y]=b[0];    //中心方块位置的图形状态:1-有,0-无 
 switch(tetris->flag)      //共6大类,19种类型 
 
  case 1:         //田字方块 
   {   
    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:         //直线方块:---- 
   {   
    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:         //直线方块: | 
   {   
    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字方块 
   {   
    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:         //T字顺时针转90度方块 
   {   
    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:         //T字顺时针转180度方块 
   {   
    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:         //T字顺时针转270度方块 
   {   
    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字方块 
   {   
    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字顺时针转90度方块 
   {   
    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字顺时针转180度方块 
   {   
    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字顺时针转270度方块 
   {   
    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字方块 
   {   
    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:        //7字顺时针转90度方块 
   {   
    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:        //7字顺时针转180度方块 
   {   
    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:        //7字顺时针转270度方块 
   
    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字方块 
   {  
    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:        //倒7字顺指针转90度方块 
   {  
    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:        //倒7字顺时针转180度方块 
   {   
    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:        //倒7字顺时针转270度方块 
   {   
    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 if_moveable(struct Tetris *tetris) 
 if(a[tetris->x][tetris->y]!=0)//当中心方块位置上有图案时,返回值为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==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==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==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==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==17 && ( 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==19 && ( a[tetris->x-2][tetris->y]==0   && 
    a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ) 
   
   
    return 1; 
   
 
 return 0; 
   
/******随机产生俄罗斯方块类型的序号**********************************************************/ 
void get_flag(struct Tetris *tetris) 
 tetris->count++;     //记住产生方块的个数 
 srand((unsigned)time(NULL));  //初始化随机数 
 if(tetris->count==1) 
 
  tetris->flag = rand()%19+1;  //记住第一个方块的序号 
 
 tetris->next = rand()%19+1;   //记住下一个方块的序号 
   
/******打印俄罗斯方块**********************************************************************/ 
void print_tetris(HANDLE hOut,struct Tetris *tetris) 
 for(i=0;i<4;i++) 
 
  b[i]=1;         //数组b[4]的每个元素的值都为1 
 
 make_tetris(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 ) 
   
    gotoxy(hOut,i,j); 
    printf("□");     //打印边框内的方块 
   
  
 
 //打印菜单信息 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1); 
 printf("level : %d",tetris->level); 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3); 
 printf("score : %d",tetris->score); 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5); 
 printf("speed : %dms",tetris->speed); 
  

[源代码打包下载]




网友评论    (发表评论)

共2 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...