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);
}/******清除俄罗斯方块的痕迹****************************************************************/
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语言之 俄罗斯方块源程序代码相关推荐
- c语言对抗程序代码,C语言贪吃蛇源程序代码双人对抗
C语言贪吃蛇源程序代码双人对抗 #include #include #include #include #include #include #include #define LEFT 100 #def ...
- 双人游戏c语言代码,C语言贪吃蛇源程序代码双人对抗.doc
C语言贪吃蛇源程序代码双人对抗 C语言贪吃蛇源程序代码双人对抗 #include #include #include #include #include #include #include #defi ...
- linux下c语言俄罗斯方块,Centos 6.2下的C语言编写俄罗斯方块游戏代码
俄罗斯方块游戏代码如下: 运行结果请点击:http://blog.chinaunix.net/uid- ...
- c语言五子棋游戏源程序代码,C语言五子棋游戏源代码
<C语言五子棋游戏源代码>由会员分享,可在线阅读,更多相关<C语言五子棋游戏源代码(12页珍藏版)>请在人人文库网上搜索. 1.include#define N 10void ...
- 超声波测距 c语言程序流程图,超声波测距c语言源程序代码-20210413051213.docx-原创力文档...
文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 超声波测距C语言源程序代码 /*{HZ即单位s的 ...
- c语言 源程序代码,编程(C语言源程序代码)
编程(C语言源程序代码) 已知 S=1+1/(1+2)+1/(1+2+3)+-+1/(1+2+3+-+N) ,当N的值为50时,求S的值. 要求:按四舍五入的方式精确到小数点后第四位. #includ ...
- C语言,自己当年编写的苹果(黑白)棋源程序代码
今天整理自己的文档,发现自己当年做一些的C语言程序,现在与大家分享 程序一.黑白棋程序,当年最早在mac上出现的小游戏,也就是俗称的苹果棋游戏,小时候没玩过?自己调试玩玩看看 调试环境 :GCC ,T ...
- linux下c语言俄罗斯方块,C语言实现俄罗斯方块源代码
本文实例为大家分享了C语言实现俄罗斯方块的具体代码,供大家参考,具体内容如下 Head.h #ifndef _HEAD_H_ #define _HEAD_H_ #include #include #i ...
- c语言超市账务管理源代码,C语言 超市管理系统源程序.doc
C语言 超市管理系统源程序.doc C语言超市管理系统源程序 超市管理系统源程序代码,要可以执行的.最好是文件,链表中的一种.好了一定重金酬谢~ 最佳答案 有一个小型超市,出售N(N>=10)种 ...
最新文章
- 初一下计算机课教案,川教版信息技术七下第1课《计算机资源管理》word教案1
- [mvc] 简单的forms认证
- 渗透知识-常用DOS命令windows
- 【白话机器学习】算法理论+实战之K近邻算法
- Excel中R1C1引用样式
- POJ-2069 Super Star(最小球覆盖)
- java. oracle 存储文件,oracle调用java类遍历磁盘文件
- 父元素遮住子元素的问题
- Delphi如何获取本机IP地址
- 趣图:21 副 GIF 动图让你了解各种数学概念
- java方法的理解、调用栈与异常处理
- HTML中常见元素及格式
- 给年轻人几点买房建议
- 信息系统项目管理师必背核心考点(二十四)WBS分解的原则
- python 移动平均函数_python – NumPy版本的“指数加权移动平均线...
- Matlab一维数据的中值滤波与均值滤波函数
- 华为认证高级网络工程师(Huawei Certified Senior Network Engineer HCSE)
- 利用python合并关联两个表中的数据
- android连接wifi不能上网,手机已经连接wifi但无法上网的详细解决方法
- TCGA临床数据整理
热门文章
- finalcut剪切快捷键_Final Cut Pro 中的键盘快捷键
- JavaScript 计算星座和生肖
- c语言1h什么意思,标准现代精确——1C开叫1H应叫及其他应叫
- 哇塞!清华竟然开了《摸鱼》课程!1000多学子在线摸鱼,开课老师为大一新生...
- Python中的bbox_overlaps()函数详解
- ubuntu13.10编译android文件系统4.0.4错误全部解析
- TensorRT+yolov5:yolov5添加小目标检测层2--TensorRT部署
- Pr——2020版本对导入视频如何编辑的操作
- 新媒体运营,微博运营活动技巧分享
- 心路历程(一)--天圆地方的时候