/*******定义全局变量********/
int i,j,Temp,Temp1,Temp2;//temp,temp1,temp2用于记住和转换方块变量的值
//标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案
int a[80][80]={0};
int b[4];//标记4个“口 ”方块,1表示有方块,0表示无方块
struct Tetris //声明俄罗斯方块的结构体
{
int x;//中心方块的 x轴坐标
int y;//中心方块的 y轴坐标
int flag;//标记方块类型的序号
int next;//下一个俄罗斯方块类型的序号
int speed;//方块的移动速度
int number;//产生俄罗斯方块的个数
int score;//游戏的分数
int level;//游戏的等级
};
HANDLE hOut;//控制台句柄
#ifndef _MAIN_H
#define _MAIN_H
/******宏定义********/
#define FrameX 13//游戏窗口左上角的X轴坐标为 13
#define FrameY 3//游戏窗口左上角的Y轴坐标为 3
#define Frame_height 20 //游戏窗口的高度为20
#define Frame_width 18//游戏窗口的宽度为18
int color(int c);
void gotoxy(int x, int y);//光标移动到指定位置
void DrwaGameFrame();//绘制游戏边框
void Flag(struct Tetris * tetris);//随机产生方块类型的序号
void MakeTetris(struct Tetris * tetris);//制作俄罗斯方块
void PrintTetris(struct Tetris * tetris);//打印俄罗斯方块
void CleanTetris(struct Tetris *tetris);//清除俄罗斯方块的痕迹
int ifMove(struct Tetris * tetris);//判断是否可以移动,返回值为 1 时可以移动,否则不能移动
void Del_Fullline(struct Tetris * tetris);//判断是否满行,并删除满行的俄罗斯方块
void Gameplay();//开始游戏
void regulation();//游戏规则
void explation();//按键说明
void welcome();//欢迎界面
void Replay();//重新开始游戏
void title();//欢迎界面上方的标题
void flower();//欢迎界面上的字符画装饰
void close();//关闭游戏
#endif
//主函数
int main(void)
{
title();
flower();
welcome();
return 0;
}
#include<stdio.h> //标准输入输出函数库
#include<windows.h> //控制DOS界面(获取控制台的坐标位置、设置字体颜色)
#include<conio.h>//接受键盘的输入输出(kbhit(),getch())
#include<time.h> //用于获得随机数
#include"hong.h"
#include"quan.h"
#include"main.h"
void gotoxy(int x, int y)
{
COORD pos={0.0};
pos.X = x;//横坐标
pos.Y= y;//纵坐标
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);//更改文字颜色
return 0;
}
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("朱小磊");
}
void welcome()
{
int n;
int i,j;
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-7,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(13);
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;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;//标记右竖框为游戏边框,防止方块出界
}
}
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-1]=b[2];
a[tetris->x+2][tetris->y]=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-2]=b[2];
a[tetris->x][tetris->y+1]=b[3];
break;
}
case 4://梯字方块
{
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][tetris->y+1]=b[2];
a[tetris->x-2][tetris->y]=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][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 字方块
{
color(14);
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 字方块
{
color(14);
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 字方块
{
color(14);
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 字方块
{
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 13://顺时针 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 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-2][tetris->y+1]=b[2];
a[tetris->x+2][tetris->y]=b[3];
break;
}
case 16://反 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 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-2][tetris->y]=b[1];
a[tetris->x-2][tetris->y-1]=b[2];
a[tetris->x+2][tetris->y]=b[3];
}
}
}
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-2; j<=tetris->y+1; j++){
if(a[i][j] == 1 && j>FrameY){
gotoxy(i,j);
printf("■");
}
}
}
//打印菜单信息
gotoxy(FrameX+2*Frame_width+3,FrameY+1);
color(4);
printf("level : ");
color(12);
printf("%d",tetris->level);
gotoxy(FrameX+2*Frame_width+3,FrameY+3);
color(4);
printf("score : ");
color(12);
printf("%d",tetris->score);
gotoxy(FrameX+2*Frame_width+3,FrameY+5);
color(4);
printf("speed : ");
color(12);
printf("%dms",tetris->speed);
}
int ifMove(struct Tetris *tetris)
{
if(a[tetris->x][tetris->y] != 0)//当中心方块位置上有图案时,返回值为 0,不可移动
{
return 0;
}else
{
if(
(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)) ||
(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][tetris->y-1]==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==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==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==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==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==19 && ( 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==17 && ( 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 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)//当每行有Frame_width-2个方块时,则满行消除
{
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++;//记录删除方块的行数
}
}
<span style="whit