#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);
}/******清除俄罗斯方块的痕迹****************************************************************/
void clear_tetris(HANDLE hOut,struct Tetris *tetris)
{for(i=0;i<4;i++){b[i]=0;         //数组b[4]的每个元素的值都为0}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]==0 && j>FrameY ){gotoxy(hOut,i,j);printf("  ");     //清除方块}}}
}/******判断是否满行并删除满行的俄罗斯方块****************************************************/
void del_full(HANDLE hOut,struct Tetris *tetris)
{       //当某行有Frame_width-2个方块时,则满行int k,del_count=0;  //分别用于记录某行方块的个数和删除方块的行数的变量for(j=FrameY+Frame_height-1;j>=FrameY+1;j--){k=0;for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2){  if(a[i][j]==1) //竖坐标依次从下往上,横坐标依次由左至右判断是否满行{k++;  //记录此行方块的个数if(k==Frame_width-2){for(k=FrameX+2;k<FrameX+2*Frame_width-2;k+=2){  //删除满行的方块a[k][j]=0;gotoxy(hOut,k,j);printf("  ");Sleep(1);}for(k=j-1;k>FrameY;k--){  //如果删除行以上的位置有方块,则先清除,再将方块下移一个位置for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2){if(a[i][k]==1){a[i][k]=0;gotoxy(hOut,i,k);printf("  ");a[i][k+1]=1;gotoxy(hOut,i,k+1);printf("□");}}}j++;   //方块下移后,重新判断删除行是否满行del_count++; //记录删除方块的行数}}}}tetris->score+=100*del_count; //每删除一行,得100分if( del_count>0 && ( tetris->score%1000==0 || tetris->score/1000>tetris->level-1 ) ){        //如果得1000分即累计删除10行,速度加快20ms并升一级tetris->speed-=20;tetris->level++;}
}/******开始游戏******************************************************************************/
void start_game()
{HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  //定义显示器句柄变量struct Tetris t,*tetris=&t;       //定义结构体的指针并指向结构体变量unsigned char ch;         //定义接收键盘输入的变量tetris->count=0;      //初始化俄罗斯方块数为0个tetris->speed=300;      //初始移动速度为300mstetris->score=0;      //初始游戏的分数为0分tetris->level=1;      //初始游戏为第1关while(1){//循环产生方块,直至游戏结束get_flag(tetris);     //得到产生俄罗斯方块类型的序号temp=tetris->flag;     //记住当前俄罗斯方块序号//打印下一个俄罗斯方块的图形(右边窗口)tetris->x=FrameX+2*Frame_width+6;tetris->y=FrameY+10;tetris->flag = tetris->next;print_tetris(hOut,tetris);tetris->x=FrameX+Frame_width;  //初始中心方块x坐标tetris->y=FrameY-1;     //初始中心方块y坐标tetris->flag=temp;     //取出当前的俄罗斯方块序号while(1){//控制方块方向,直至方块不再下移label:print_tetris(hOut,tetris);//打印俄罗斯方块Sleep(tetris->speed);   //延缓时间clear_tetris(hOut,tetris);  //清除痕迹temp1=tetris->x;    //记住中心方块横坐标的值temp2=tetris->flag;    //记住当前俄罗斯方块序号if(kbhit())   {        //判断是否有键盘输入,有则用ch↓接收ch=getch(); if(ch==75)     //按←键则向左动,中心横坐标减2{      tetris->x-=2;}if(ch==77)     //按→键则向右动,中心横坐标加2{      tetris->x+=2;    }if(ch==72)     //按↑键则变体即当前方块顺时针转90度{      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)     //按空格键,暂停{print_tetris(hOut,tetris);while(1){if(kbhit())   //再按空格键,继续游戏{ch=getch();if(ch==32){goto label;}}}}if(if_moveable(tetris)==0) //如果不可动,上面操作无效{tetris->x=temp1;tetris->flag=temp2;}else      //如果可动,执行操作{goto label;}}tetris->y++;     //如果没有操作指令,方块向下移动if(if_moveable(tetris)==0)  //如果向下移动且不可动,方块放在此处{    tetris->y--;print_tetris(hOut,tetris);del_full(hOut,tetris);break;}}for(i=tetris->y-2;i<tetris->y+2;i++){//游戏结束条件:方块触到框顶位置if(i==FrameY){j=0;      //如果游戏结束,j=0}}if(j==0)       {system("cls");getch();break;}//清除下一个俄罗斯方块的图形(右边窗口)tetris->flag = tetris->next;tetris->x=FrameX+2*Frame_width+6;tetris->y=FrameY+10;clear_tetris(hOut,tetris);  }
}


喜欢我的可以关注我哟

c语言之 俄罗斯方块源程序代码相关推荐

  1. c语言对抗程序代码,C语言贪吃蛇源程序代码双人对抗

    C语言贪吃蛇源程序代码双人对抗 #include #include #include #include #include #include #include #define LEFT 100 #def ...

  2. 双人游戏c语言代码,C语言贪吃蛇源程序代码双人对抗.doc

    C语言贪吃蛇源程序代码双人对抗 C语言贪吃蛇源程序代码双人对抗 #include #include #include #include #include #include #include #defi ...

  3. linux下c语言俄罗斯方块,Centos 6.2下的C语言编写俄罗斯方块游戏代码

    俄罗斯方块游戏代码如下:                                                  运行结果请点击:http://blog.chinaunix.net/uid- ...

  4. c语言五子棋游戏源程序代码,C语言五子棋游戏源代码

    <C语言五子棋游戏源代码>由会员分享,可在线阅读,更多相关<C语言五子棋游戏源代码(12页珍藏版)>请在人人文库网上搜索. 1.include#define N 10void ...

  5. 超声波测距 c语言程序流程图,超声波测距c语言源程序代码-20210413051213.docx-原创力文档...

    文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 超声波测距C语言源程序代码 /*{HZ即单位s的 ...

  6. c语言 源程序代码,编程(C语言源程序代码)

    编程(C语言源程序代码) 已知 S=1+1/(1+2)+1/(1+2+3)+-+1/(1+2+3+-+N) ,当N的值为50时,求S的值. 要求:按四舍五入的方式精确到小数点后第四位. #includ ...

  7. C语言,自己当年编写的苹果(黑白)棋源程序代码

    今天整理自己的文档,发现自己当年做一些的C语言程序,现在与大家分享 程序一.黑白棋程序,当年最早在mac上出现的小游戏,也就是俗称的苹果棋游戏,小时候没玩过?自己调试玩玩看看 调试环境 :GCC ,T ...

  8. linux下c语言俄罗斯方块,C语言实现俄罗斯方块源代码

    本文实例为大家分享了C语言实现俄罗斯方块的具体代码,供大家参考,具体内容如下 Head.h #ifndef _HEAD_H_ #define _HEAD_H_ #include #include #i ...

  9. c语言超市账务管理源代码,C语言 超市管理系统源程序.doc

    C语言 超市管理系统源程序.doc C语言超市管理系统源程序 超市管理系统源程序代码,要可以执行的.最好是文件,链表中的一种.好了一定重金酬谢~ 最佳答案 有一个小型超市,出售N(N>=10)种 ...

最新文章

  1. 初一下计算机课教案,川教版信息技术七下第1课《计算机资源管理》word教案1
  2. [mvc] 简单的forms认证
  3. 渗透知识-常用DOS命令windows
  4. 【白话机器学习】算法理论+实战之K近邻算法
  5. Excel中R1C1引用样式
  6. POJ-2069 Super Star(最小球覆盖)
  7. java. oracle 存储文件,oracle调用java类遍历磁盘文件
  8. 父元素遮住子元素的问题
  9. Delphi如何获取本机IP地址
  10. 趣图:21 副 GIF 动图让你了解各种数学概念
  11. java方法的理解、调用栈与异常处理
  12. HTML中常见元素及格式
  13. 给年轻人几点买房建议
  14. 信息系统项目管理师必背核心考点(二十四)WBS分解的原则
  15. python 移动平均函数_python – NumPy版本的“指数加权移动平均线...
  16. Matlab一维数据的中值滤波与均值滤波函数
  17. 华为认证高级网络工程师(Huawei Certified Senior Network Engineer HCSE)
  18. 利用python合并关联两个表中的数据
  19. android连接wifi不能上网,手机已经连接wifi但无法上网的详细解决方法
  20. TCGA临床数据整理

热门文章

  1. finalcut剪切快捷键_Final Cut Pro 中的键盘快捷键
  2. JavaScript 计算星座和生肖
  3. c语言1h什么意思,标准现代精确——1C开叫1H应叫及其他应叫
  4. 哇塞!清华竟然开了《摸鱼》课程!1000多学子在线摸鱼,开课老师为大一新生...
  5. Python中的bbox_overlaps()函数详解
  6. ubuntu13.10编译android文件系统4.0.4错误全部解析
  7. TensorRT+yolov5:yolov5添加小目标检测层2--TensorRT部署
  8. Pr——2020版本对导入视频如何编辑的操作
  9. 新媒体运营,微博运营活动技巧分享
  10. 心路历程(一)--天圆地方的时候