效果图如下
#ifndef _DAY7_H
#define _DAY7_H
#include<windows.h>
#include<time.h>
#include<stdbool.h>
#include<conio.h>//控制台输入输出函数getch通过键盘进行的操作
//游戏区域位置设计
#define COL_BEGIN 2
#define COL_END 14
#define ROW_BEGIN 4
#define ROW_END 26
HANDLE Output;//控制台输出句柄
//存储游戏相关数据的结构体
typedef struct TetrisManager//俄罗斯管理
{
unsigned int pool[28];//游戏池
int x;//当前方块的x坐标,左上角坐标
int y;//
int type[3];//当前,下一个,下下一个方块的类型
int orientation[3];//当前,下一个,下下一个方块的旋转状态
//左边栏
unsigned score;//得分
unsigned erasedTotal;//消行总数
unsigned erasedCount[4];//消几行数
unsigned tetrisTotal;//目前出现方块总数
unsigned tetrisCount[7];//目前出现各种方块数
bool dead;//挂
}Manager;//结构体别名
//构造存储游戏控制相关数据的结构体
typedef struct TetrisControl
{
bool pause;//暂停
bool clockwise;//旋转方向;顺时针方向为ture
int direction;//移动方向:0向左移动 1向右移动
//游戏池内每格的颜色
//此版本是彩色的,仅用游戏池数据无法存储颜色
int color[28][16];
}Control;//Control是结构体别名
//初始状态的游戏池
//每个元素表示游戏池的一行
//两端各置两个1,底部两行全部为1,便于进行碰撞
//这样一来游戏池的宽度为12列 共16列
//当某个元素为OXFFFF时,说明该行已经填满
//顶部4行用于给方块,不显示
//底部2行不显示,显示出来的游戏池高度为22行
static const unsigned int gs_uInitialTetrisPool[28]=
{
0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,
0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,
0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,
0XC003,0XC003,0XC003,0XC003,0XC003,0XFFFF,0XFFFF
//C003 1100 0000 0000 0011
};
//7种方块的4种旋转状态(4位一行)
static const unsigned int TetrisTable[7][4]=
{
{
0x00f0, 0x2222,0x00f0,0x2222 },//I
{
0x0072, 0x0262,0x0270,0x0232 },//T
{
0x0223, 0x0074,0x0622,0x0170 },//L
{
0x0226, 0x0470,0x0322,0x0071 },//J
{
0x0063, 0x0264,0x0063,0x0264 },//Z
{
0x006c, 0x0462,0x006c,0x0462 },//S
{
0x0660, 0x0660,0x0660,0x0660 },//O
};
//函数声明
void printPoolBorder();//显示游戏池边界
void gotoxyWithFullwidth(short x,short y);//全角显示鼠标定位函数
void printPrompting();//显示按键提示信息
void printScore(const Manager *manager);
void intiGame(Manager* manager,Control*control);//初始化游戏
void startGame(Manager *manager,Control *control);
void printNextTetris(const Manager *manager);
void printTetrisPool(const Manager *manager,Control *control);//显示游戏池
void initTetris(Manager *manager);//初始化方块
void insertTetris(Manager *manager);//插入方块
bool checkCollision(const Manager *manager);//检测碰撞
void setPoolColor(const Manager *manager,Control *control);
void printCurrentTetris(const Manager *manager,const Control *control);
void removeTetris(Manager *manager);//移除当前方块
void moveDownTetris(Manager *manager, Control *control);//向下移动方块
void runGame(Manager *manager, Control *control);//运行游戏
void horzMoveTetris(Manager *manager, Control *control);//水平移动方块
void keydownControl(Manager *manager, Control *control,int key);//按键按下控制
void rotateTetris(Manager *manager, Control *control);//旋转方块
void dropDownTetris(Manager *manager, Control *control);//方块直接落地
bool ifPlayAgain();//是否重玩
bool checkErasing(Manager *manager, Control *control);//消行检测
#endif // _DAY7_H
#include <stdio.h>
#include <stdlib.h>
#include"day7.h"
int main()
{
Manager manager;
Control control;
intiGame(&manager,&control);//初始化游戏
do
{
printPrompting();//按键提示信息
printPoolBorder();//游戏池
runGame(&manager,&control);
if(ifPlayAgain())
{
SetConsoleTextAttribute(Output,0x07);
system("cls") ;//清屏
startGame(&manager,&control);//从新开始游戏
}
else
break;
}while(1);
intiGame(&manager,&control);//初始化游戏
CloseHandle(Output);
return 0;
}
//初始化游戏
void intiGame(Manager* manager,Control*control)
{
Output=GetStdHandle(STD_OUTPUT_HANDLE);
//定义光标隐藏变量并初始化
CONSOLE_CURSOR_INFO info;
info.bVisible=FALSE;//FAlse为光标隐藏
info.dwSize=1;//光标亮度为1-100
//设置光标隐藏
SetConsoleCursorInfo(Output