/* run this program using the console pauser or add your own getch, system("pause") or input loop /
/头文件/
#include
#include <stdio.h> //标准输入输出函数库
#include <windows.h> //控制dos界面(设置颜色位置等)
#include <conio.h> //键盘输入
#include <time.h>//随机数
#include <dos.h>
/******* 宏定义 /
#define FrameX 50 //x左上角坐标值
#define FrameY 2 //y坐标值
#define Frame_height 30//窗体高度
#define Frame_width 18 //窗体宽度
/ 全局变量 /
int i,j,Temp,Temp1,Temp2; //存储方块变量值
int a[80][80]; //标记游戏图案,0代表无图案,1有方块图案,2游戏边框
int b[4]; //俄罗斯方块由4个小方块组成,b[i]=0表示无方块,b[i]=1表示有方块
/俄罗斯方块结构体/
struct Tetris{
int x; //x坐标
int y; //y坐标
int flag; //标记方块类型
int next; //下一块方块类型
int speed; //速度
int number; //方块个数
int score; //得分
int level; //游戏等级
};
HANDLE hOut; //定义控制台句柄
/ 函数声明 *******/
int color(int c); //设置文字颜色
void gotoxy(int x,int y); //设置光标移动的坐标位置
void title(); //欢迎界面标题
void head(); //机器人头部装饰
void welcome(); //欢迎界面边框及菜单
void DrawGameFrame(); //游戏界面
void MakeTetris(struct Tetris *tetris); //制作俄罗斯方块
void PrintTetris(struct Tetris *tetris);//打印俄罗斯方块
int ifMove(struct Tetris *tetris); //判断方块可否移动
void Flag(struct Tetris *tetris); //随机产生方块的序号
void CleanTetris(struct Tetris *tetris); //清除方块的痕迹
void Del_Fullline(struct Tetris *tetris); //判断是否满行
void Gameplay();
void Replay(struct Tetris *tetris);
/****游戏欢迎界面/
int color(int c){ //改变文字颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
return 0;
}
void gotoxy(int x,int y){
COORD pos; //结构体变量
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void title(){
color(15); //游戏名称
gotoxy(50,2);
printf(" 经 典 俄 罗 斯 方 块");
gotoxy(55,4);
printf("Тетрис");
color(11); //形状 1
gotoxy(40,6);
printf("■");
gotoxy(40,7);
printf("■■");
gotoxy(40,8);
printf("■");
color(14); //形状 2
gotoxy(50,6);
printf("■");
gotoxy(50,7);
printf("■");
gotoxy(50,8);
printf("■■");
color(2); //形状 3
gotoxy(60,7);
printf(" ■");
gotoxy(60,8);
printf("■■■");
color(4); //形状 4
gotoxy(72,7);
printf("■■");
gotoxy(72,8);
printf("■■");
color(5); //形状 5
gotoxy(82,6);
printf("■");
gotoxy(82,7);
printf("■");
gotoxy(82,8);
printf("■");
gotoxy(82,9);
printf("■");
}
void head(){ //机器人头部装饰
color(1);
gotoxy(101,28);
printf(" ■");
gotoxy(101,29);
printf("■■■");
color(4);
gotoxy(103,26);
printf("■");
gotoxy(103,27);
printf("■");
gotoxy(101,27);
printf("■");
gotoxy(101,28);
printf("■");
color(10);
gotoxy(105,21);
printf("■■");
gotoxy(105,22);
printf("■");
gotoxy(105,23);
printf("■");
color(14);
gotoxy(107,28);
printf("■■");
gotoxy(107,29);
printf("■■");
color(2);
gotoxy(99,8);
printf(" ▇▇▇");
gotoxy(99,9);
printf(" ▇▇▇▇");
gotoxy(99,10);
printf(" ▇▇▇▇▇▇ ");
gotoxy(99,11);
printf("◢▇ ▇▇ ▇◣");
gotoxy(99,12);
printf("◥▇▇▇▇▇▇◤");
gotoxy(99,13);
printf(" ▇▇ ▇▇");
gotoxy(99,14);
printf(" ▇▇ ▇▇");
gotoxy(99,15);
printf(" ▇▇▇▇▇▇ ");
gotoxy(99,16);
printf(" ▇▇▇▇ ");
}
void welcome(){ //欢迎界面边框及菜单
int i,j;
color(8);
for(i=10;i<=30;i++)
//循环y轴,打印=边框
{
for(j=25;j<=95;j++)
//循环x轴,打印[]边框
{
gotoxy(j,i);
if(i==10||i==30)printf("=");
else if(j==25||j==94)printf("[]");
}
}
color(10);
gotoxy(52,14);
printf("1.开 始 游 戏");
gotoxy(52,18);
printf("2.按 键 说 明");
gotoxy(52,22);
printf("3.游 戏 规 则");
gotoxy(52,26);
printf("4.退 出 游 戏");
color(5);
gotoxy(49,31);
printf("请选择[1 2 3 4]:[ ]\b\b");
color(14);
int n;
scanf("%d",&n);
switch(n)
{
case 1:
system("cls"); //清屏
DrawGameFrame();
Gameplay();
break;
case 2: break;
case 3: break;
case 4: break;
}
}
/**游戏主窗体/
void DrawGameFrame(){ //游戏界面
//游戏界面的游戏名称
color(7);
gotoxy(FrameX,FrameY);
printf(" 经 典 俄 罗 斯 方 块");
gotoxy(FrameX+5,FrameY+2);
printf("Тетрис");
//游戏界面边框四个角
color(8);
gotoxy(FrameX-15,FrameY+5);
printf("┏");
gotoxy(FrameX+25,FrameY+5);
printf("┓");
gotoxy(FrameX-15,14*FrameY+1);
printf("┗");
gotoxy(FrameX+25,14FrameY+1);
printf("┛");
a[FrameX-15][FrameY+5]=2;//记住此处已有图案
a[FrameX+25][FrameY+5]=2;
a[FrameX-15][14FrameY+1]=2;
a[FrameX+25][14*FrameY+1]=2;
//游戏界面上下边框
for(i=1;i<2*Frame_width+2;i+=2){
gotoxy(FrameX-14+i,FrameY+5);
printf("-");
a[FrameX-14+i][FrameY+5]=2;//记住此处已有图案
}
for(i=1;i<2*Frame_width+2;i+=2){
gotoxy(FrameX-14+i,FrameY+Frame_height-3);
printf("-");
a[FrameX-14+i][FrameY+Frame_height-3]=2;//记住此处已有图案
}
//游戏界面左右边框
for(i=2;i<Frame_height-7;i++){
gotoxy(FrameX-15,FrameY+4+i);
printf("┃");
a[FrameX-15][FrameY+4+i]=2;//记住此处已有图案
}
for(i=2;i<Frame_height-7;i++){
gotoxy(FrameX+Frame_width+7,FrameY+4+i);
printf("┃");
a[FrameX+Frame_width+7][FrameY+4+i]=2;//记住此处已有图案
}
color(2);
gotoxy(FrameX+28,FrameY+14);
printf("*****下一方块*****");
color(2);
gotoxy(FrameX+28,FrameY+20);
printf("******************");
color(14);
gotoxy(FrameX+Frame_width+10,FrameY+22);
printf("↑ 键:旋转方块");
gotoxy(FrameX+Frame_width+10,FrameY+24);
printf("空 格:暂停游戏");
gotoxy(FrameX+Frame_width+10,FrameY+26);
printf("ESC键:退出游戏");
}
void MakeTetris(struct Tetris *tetris){ //制作俄罗斯方块
a[tetris->x][tetris->y]=b[0];
switch(tetris->flag)
{
case 1:{ //方形方块
color(10);
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 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+1]=b[2];
a[tetris->x][tetris->y+2]=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-2][tetris->y]=b[2];
a[tetris->x][tetris->y+1]=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-2][tetris->y]=b[1];
a[tetris->x][tetris->y+1]=b[2];
a[tetris->x+2][tetris->y+1]=b[3];
break;
}
case 9:{ //顺时针90 Z型
color(14);
a[tetris->x-2][tetris->y]=b[1];
a[tetris->x][tetris->y-1]=b[2];
a[tetris->x-2][tetris->y+1]=b[3];
break;
}
case 10:{ //顺时针180 Z型
color(14);
a[tetris->x+2][tetris->y]=b[1];
a[tetris->x][tetris->y+1]=b[2];
a[tetris->x-2][tetris->y+1]=b[3];
break;
}
case 11:{ //顺时针270 Z型
color(14);
a[tetris->x-2][tetris->y]=b[1];
a[tetris->x-2][tetris->y-1]=b[2];
a[tetris->x][tetris->y+1]=b[3];
break;
}
case 12:{ //7型方块
color(12);
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x-2][tetris->y-1]=b[2];
a[tetris->x][tetris->y+1]=b[3];
break;
}
case 13:{ //顺时针90 7型
color(12);
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x-2][tetris->y]=b[2];
a[tetris->x-4][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+4][tetris->y]=b[2];
a[tetris->x][tetris->y+1]=b[3];
break;
}
case 16:{ //反7型方块
color(12);
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x+2][tetris->y-1]=b[2];
a[tetris->x][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][tetris->y-1]=b[1];
a[tetris->x+2][tetris->y]=b[2];
a[tetris->x+4][tetris->y]=b[3];
break;
}
}
}
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-1;j<=tetris->y+2;j++){
if(a[i][j]==1 && j>FrameY)
{
gotoxy(i,j);
printf("■");
}
}
}
gotoxy(FrameX+28,FrameY+6);//设置打印位置
color(4);
printf("level : ");//输出等级
color(12);
printf("%d",tetris->level);
gotoxy(FrameX+28,FrameY+8);//打印显示分数的位置
color(4);
printf("score : ");
color(12);
printf(" %d",tetris->score);
gotoxy(FrameX+28,FrameY+10);
color(4);
printf("speed : ");
color(12);
printf(" %dms",tetris->speed);
}
/****游戏逻辑设计/
int ifMove(struct Tetris *tetris){ //判断方块可否移动
if(a[tetris->x][tetris->y]!=0){
return 0;
}
else{
if(tetris->flag==1 &&(a[tetris->x][tetris->y+1]==0&&a[tetris->x+2][tetris->y]==0&&a[tetris->x+2][tetris->y+1]==0)||
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+1]==0&&a[tetris->x][tetris->y+2]==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-2][tetris->y]==0&&a[tetris->x][tetris->y+1]==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-2][tetris->y]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x+2][tetris->y+1]==0)||
tetris->flag==9 &&(a[tetris->x-2][tetris->y]==0&&a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y+1]==0)||
tetris->flag==10 &&(a[tetris->x+2][tetris->y]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y+1]==0)||
tetris->flag==11 &&(a[tetris->x-2][tetris->y]==0&&a[tetris->x-2][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0)||
tetris->flag==12 &&(a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0)||
tetris->flag==13 &&(a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y]==0&&a[tetris->x-4][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+4][tetris->y]==0&&a[tetris->x][tetris->y+1]==0)||
tetris->flag==16 &&(a[tetris->x][tetris->y-1]==0&&a[tetris->x+2][tetris->y-1]==0&&a[tetris->x][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][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0&&a[tetris->x+4][tetris->y]==0))
{
return 1;
}
}
return 0;
}
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 CleanTetris(struct Tetris *tetris){ //清除方块的痕迹
for(i-0;i<4;i++)
{
b[i]=0;
}
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]==0&&j>FrameY){
gotoxy(i,j);
printf(" ");
}
}
}
}
void Del_Fullline(struct Tetris tetris){ //判断是否满行
int k,del_rows=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(k,j);
printf(" ");
}
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(i,k);
printf(" ");
a[i][k+1]=1;
gotoxy(i,k+1);
printf("■");
}
}
}
j++;
del_rows++;
}
}
}
}
tetris->score+=100del_rows;
if(del_rows>0&&(tetris->score%1000==0||tetris->score/1000>tetris->level-1))
{
tetris->speed=20;
tetris->level++;
}
}
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+35;
tetris->y=FrameY+17;
tetris->flag=tetris->next;
PrintTetris(tetris);
tetris->x=FrameX+Frame_width;
tetris->y=FrameY-1;
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-2;
}
}
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,6400sizeof(int));
welcome();
}
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;iy+2;i++)
{
if(i==FrameY)
{
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;
tetris->y=FrameY;
CleanTetris(tetris);
}
}
void Replay(struct Tetris tetris)
{
system("cls");
memset(a,0,6400sizeof(int));
DrawGameFrame();
Gameplay();
}
int main(){ //主函数
title(); //欢迎界面的标题
head(); //欢迎界面装饰部分
welcome(); // 欢迎界面边框
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。