一、运行截图
选2
选3
选1
二、相关代码
//宏定义
#define FrameX 13
#define FrameY 3//定义游戏窗口的X和Y轴坐标
#define Frame_height 20
#define Frame_width 18//定义游戏窗口的长和宽
//定义全局变量
int i, j, Temp, Temp1, Temp2;//Temp, Temp1, Temp2是用于记住和转换方块变量的值
int a[80][80] = {0};
int b[4];//标记4个“口 ”方块:1表示有方块 ,0表示无方块
//结构体
struct Tetris//声明俄罗斯方块的结构体
{
int x;
int y; //中心方块的x和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 DrwaGameframe(); //绘制游戏边框
void Flag(struct Tetris *); //随机产生方块类型的序号
void MakeTeris(struct Tetris *); //制作俄罗斯方块
void PrintTeteris(struct Tetris *); //打印俄罗斯方块
void CleanTeteris(struct Tetris *); //清除俄罗斯方块的痕迹
int ifMove(struct Tetris *); //判断是否能移动,返回值为1时能移动,否则不能移动
void Del_Fullline(struct Tetris *); //判断是否满行,并删除满行的俄罗斯方块
void Gameplay(); //开始游戏
void regulation(); //游戏规则
void explation(); //按键说明
void welcome(); //欢迎界面
void Replay(struct Tetris * tetris); //重新开始游戏
void title(); //欢迎界面上方的标题
void flower(); //欢迎界面上的字符装饰花
void close(); //关闭游戏
/*
*设置文字颜色
*/
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
//SetConsoleTextAttribute是设置控制台窗口字体颜色和背景颜色的函数
return 0;
}
/*
*设置文字显示位置
*/
void gotoxy(int x,int y)
{
COORD pos;//是一个结构体变量,x和y是它的成员 ,是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标
pos.X = x;//横坐标
pos.Y = y;//纵坐标
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
//SetConsoleCursorPosition函数用来定位光标位置
}
/*
*欢迎界面上的标题
*/
void title()
{
color(15);
gotoxy(24, 3);
printf("趣 味 俄 罗 斯 方 块\n");
color(11);
gotoxy(18, 5);
printf("■");
gotoxy(18, 6);
printf("■■");
gotoxy(18, 7);
printf("■");
color(14);
gotoxy(26, 6);
printf("■■");
gotoxy(28, 7);
printf("■■");
color(10);
gotoxy(36, 6);
printf("■■");
gotoxy(36, 7);
printf("■■");
color(13);
gotoxy(45, 5);
printf("■");
gotoxy(45, 6);
printf("■");
gotoxy(45, 7);
printf("■");
gotoxy(45, 8);
printf("■");
color(12);
gotoxy(56, 6);
printf("■");
gotoxy(52, 7);
printf("■■■");
}
/*
*绘制字符花
*/
void flower()
{
gotoxy(66, 11);
color(12);
printf("(_)");
gotoxy(64, 12);
printf("(_)");
gotoxy(68, 12);
printf("(_)");
gotoxy(66, 13);
printf("(_)");
gotoxy(67, 12);
color(6);
printf("@");
gotoxy(72, 10);
color(13);
printf("(_)");
gotoxy(76, 10);
printf("(_)");
gotoxy(74, 9);
printf("(_)");
gotoxy(74, 11);
printf("(_)");
gotoxy(75, 10);
color(6);
printf("@");
gotoxy(71, 12);
printf("|");
gotoxy(72, 11);
printf("/");
gotoxy(70, 13);
printf("\\|");
gotoxy(70, 14);
printf("'|/");
gotoxy(70, 15);
printf("\\|");
gotoxy(71, 16);
printf("| /");
gotoxy(71, 17);
printf("|");
gotoxy(67, 17);
color(10);
printf("\\\\\\\\");
gotoxy(73, 17);
printf("//");
gotoxy(67, 18);
color(2);
printf("^^^^^^^^");
gotoxy(65, 19);
color(5);
printf("鱼 蛋 科 技");
gotoxy(68, 20);
printf("钟荣钊");
printf("\n");
}
/*
*菜单项边框
*/
void welcome()
{
int n;
int i, j = 1;
color(14);
for (i = 9; i <= 20; i++)
{
for(j = 15; j <= 60; j++)
{
gotoxy(j, i);
if (i == 9 || i == 20) printf("=");
else if (j == 15 || j == 59) printf("||");
}
}
/*
*菜单选项的文字
*/
color(12);
gotoxy(25, 12);
printf("1.开始游戏");
gotoxy(40, 12);
printf("2.案件说明");
gotoxy(25, 17);
printf("3.游戏规则");
gotoxy(40, 17);
printf("4.退出");
gotoxy(21, 22);
color(3);
printf("请选择【1 2 3 4】:【 】\b\b");
color(14);
scanf("%d", &n);
switch (n)
{
case 1:
system("cls");
DrwaGameframe();
Gameplay();
break;
case 2:
explation();
break;
case 3:
regulation();
break;
case 4:
close();
break;
}
}
/**
* 制作游戏窗口
*/
void DrwaGameframe()
{
gotoxy(FrameX+Frame_width-5,FrameY-2); //设置游戏名称的显示位置
color(11); //将字体颜色设置为亮蓝色
printf("趣味俄罗斯方块"); //打印游戏名称
gotoxy(FrameX+2*Frame_width+3,FrameY+7); //设置上边框的显示位置
color(2); //将字体颜色设置为深绿色
printf("**********"); //打印下一个出现方块的上边框
gotoxy(FrameX+2*Frame_width+13,FrameY+7);
color(3); //将字体颜色设置为深蓝绿色
printf("下一出现方块:");
gotoxy(FrameX+2*Frame_width+3,FrameY+13);
color(2);
printf("**********"); //打印下一个出现方块的下边框
gotoxy(FrameX+2*Frame_width+3,FrameY+17);
color(14); //将字体颜色设置为黄色
printf("↑键:旋转");
gotoxy(FrameX+2*Frame_width+3,FrameY+19);
printf("空格:暂停游戏");
gotoxy(FrameX+2*Frame_width+3,FrameY+15);
printf("Esc :退出游戏");
gotoxy(FrameX,FrameY);
color(12);
printf("╔"); //打印框角
gotoxy(FrameX+2*Frame_width-2,FrameY);
printf("╗");
gotoxy(FrameX,FrameY+Frame_height);
printf("╚");
gotoxy(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(FrameX+i,FrameY);
printf("═"); //打印上横框
}
for(i=2;i<2*Frame_width-2;i+=2)
{
gotoxy(FrameX+i,FrameY+Frame_height);
printf("═"); //打印下横框
a[FrameX+i][FrameY+Frame_height]=2; //标记下横框为游戏边框,防止方块出界
}
for(i=1;i<Frame_height;i++)
{
gotoxy(FrameX,FrameY+i);
printf("║"); //打印左竖框
a[FrameX][FrameY+i]=2; //标记左竖框为游戏边框,防止方块出界
}
for(i=1;i<Frame_height;i++)
{
gotoxy(FrameX+2*Frame_width-2,FrameY+i);
printf("║"); //打印右竖框
a[FrameX+2*Frame_width-2][FrameY+i]=2; //标记右竖框为游戏边框,防止方块出界
}
}