2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!
我的投票地址:点击为我投票


写在前面:
大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书。
很感谢能有这样一个平台让我能够在这里分享所学所感。
我喜欢编程,喜欢代码,喜欢去做一个程序员。
努力学习,争取多年后,给亲人更好的生活。
QQ/WX:2506897252 欢迎交流。

文章目录

  • 一.游戏效果
  • 二.代码实现
    • 1.绘制地图
    • 2.随机主方块生成
    • 3.按键响应
    • 4.方块坐标全部确定
    • 5.显示完整方块
    • 6.判断左右界限
    • 7.移动光标
    • 8.颜色设定
    • 9.判断落地
    • 10.判断整行是否填满
    • 11.若填满,则清楚该行,并刷新地图
    • 12.显示信息
    • 13.坐标更新1
    • 14.坐标更新2
    • 15.显示信息更新
    • 16.主函数内容
  • 三.完整代码奉上,也可自行下载

一.游戏效果


旧版800行代码,这个只有500行,并且不闪屏,看着舒服。废话不多说,上图,上代码。

二.代码实现

1.绘制地图

void DeawMap()
{for (int i = 0; i < WIDTH; i++)PRINTF LINE  //上边框for (int i = 1; i < HEIGHT - 1; i++)          //打印左右边框{for (int j = 0; j < WIDTH; j++){if (j == 0 || j == WIDTH - 1){PRINTFif (j == WIDTH - 1)LINE}else EMPTY}}for (int i = 0; i < WIDTH; i++)PRINTF LINE  //下边框system("color 03");
}

2.随机主方块生成

Tetris * BlockRand(int code_y)
{srand((int)time(0));Tetris * Block = (Tetris*)malloc(sizeof(Tetris));Block->x_1 = 8;Block->y_1 = 4;//规定初始中心方块的坐标为(8,4)Block->code = code_y;if (Phead == NULL)Phead = Block;else Pend->next = Block;Block->next = NULL;Pend = Block;return Block;
}

3.按键响应

void JudgeDirection(Tetris ** Block)
{if (GetAsyncKeyState(VK_UP) && 0x8000){form += 1;if (form == 4){form = 0;}Form(&Return);}if (GetAsyncKeyState(VK_DOWN) && 0x8000){//加速向下  时间加速UP = 1;}if (GetAsyncKeyState(VK_LEFT) && 0x8000){//向左移动if (JudgeWall(&Return) != -1) Location_y(&Return, -1, 0, -1, 0, -1, 0, -1, 0);}if (GetAsyncKeyState(VK_RIGHT) && 0x8000){//向右移动if (JudgeWall(&Return) != -2) Location_y(&Return, 1, 0, 1, 0, 1, 0, 1, 0);}if (GetAsyncKeyState(VK_ESCAPE) && 0x0D){MoveCursor(27, 15);printf("游戏暂停");//判断Escwhile (1){if (GetAsyncKeyState(VK_ESCAPE) && 0x0D){MoveCursor(27, 15);printf("       ");break;}}}
}

4.方块坐标全部确定

void Form(Tetris ** Block)
{//先确实哪一类,再细分switch ((*Block)->code){case 1:if (form == 0)Location(&Return, 0, 0, -1, 0, 0, -1, 1, 0);if (form == 1)Location(&Return, 0, 0, 0, 1, 0, -1, 1, 0);if (form == 2)Location(&Return, 0, 0, 0, 1, -1, 0, 1, 0);if (form == 3)Location(&Return, 0, 0, 0, 1, -1, 0, 0, -1);break;case 2:Location(&Return, 0, 0, 1, 0, 0, 1, 1, 1);break;case 3:if (form == 0 || form == 2)Location(&Return, 0, 0, 0, -1, 0, 1, 0, 2);if (form == 1 || form == 3)Location(&Return, 0, 0, -1, 0, 1, 0, 2, 0);break;case 4:if (form == 0)Location(&Return, 0, 0, -1, 0, 1, 0, 1, -1);if (form == 1)Location(&Return, 0, 0, 0, -1, 1, 0, 0, -2);if (form == 2)Location(&Return, 0, 0, 0, -1, 1, -1, 2, -1);if (form == 3)Location(&Return, 0, 0, 0, -1, 0, -2, -1, -2);break;case 5:if (form == 0)Location(&Return, 0, 0, 1, 0, 2, 0, 0, -1);if (form == 1)Location(&Return, 0, 0, 1, 0, 1, -1, 1, -2);if (form == 2)Location(&Return, 0, 0, 1, 0, 2, 0, 2, 1);if (form == 3)Location(&Return, 0, 0, 1, 0, 0, 1, 0, 2);break;case 6:if (form == 0 || form == 2)Location(&Return, 0, 0, 0, -1, 1, 0, 1, 1);if (form == 1 || form == 3)Location(&Return, 0, 0, 0, -1, 1, -1, -1, 0);break;case 7:if (form == 0 || form == 2)Location(&Return, 0, 0, 0, 1, 1, 0, 1, -1);if (form == 1 || form == 3)Location(&Return, 0, 0, 0, 1, -1, 0, 1, 1);}
}

5.显示完整方块

void ShowBlock(Tetris ** Block)
{while (1){Form(&Return);if ((*Block)->code == 1)SetColour(13);if ((*Block)->code == 2)SetColour(15);if ((*Block)->code == 3)SetColour(12);if ((*Block)->code == 4)SetColour(10);if ((*Block)->code == 5)SetColour(6);if ((*Block)->code == 6)SetColour(4);if ((*Block)->code == 7)SetColour(8);MoveCursor((*Block)->x_1, (*Block)->y_1); PRINTFMoveCursor((*Block)->x_2, (*Block)->y_2); PRINTFMoveCursor((*Block)->x_3, (*Block)->y_3); PRINTFMoveCursor((*Block)->x_4, (*Block)->y_4); PRINTFif (JudgeGroud(Phead, &Return) == 0){system("color 03");break;}if (UP == 0){for (int i = 0; i <= 400000000; i++) {}}if (UP == 1){for (int i = 0; i <= 40000000; i++) {}UP = 0;}MoveCursor((*Block)->x_1, (*Block)->y_1); EMPTYMoveCursor((*Block)->x_2, (*Block)->y_2); EMPTYMoveCursor((*Block)->x_3, (*Block)->y_3); EMPTYMoveCursor((*Block)->x_4, (*Block)->y_4); EMPTYLocation_y(&Return, 0, 1, 0, 1, 0, 1, 0, 1);JudgeDirection(&Return);JudgeEntire(Phead);}
}

6.判断左右界限

int JudgeWall(Tetris ** Block)
{if ((*Block)->x_1 == ZERO || (*Block)->x_2 == ZERO || (*Block)->x_3 == ZERO || (*Block)->x_4 == ZERO)return -1;if ((*Block)->x_1 == HEIGHT_1 || (*Block)->x_2 == HEIGHT_1 || (*Block)->x_3 == HEIGHT_1 || (*Block)->x_4 == HEIGHT_1)return -2;return 0;
}

7.移动光标

void MoveCursor(int x, int y)//设置光标位置(就是输出显示的开始位置)
{COORD pos = { x * 2,y };HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);//获得 标准输出的句柄   SetConsoleCursorPosition(output, pos); //设置控制台光标位置
}

8.颜色设定

void SetColour(int c)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);//API函数可以改变控制台颜色
}

9.判断落地

int JudgeGroud(Tetris * Phead, Tetris ** Block)
{Tetris * P = Phead;//如果到达最低层。直接经行下一循环if ((*Block)->y_1 == 26 || (*Block)->y_2 == 26 || (*Block)->y_3 == 26 || (*Block)->y_4 == 26)return 0;while (P->next != NULL){if (P->y_1 == (*Block)->y_1 + 1){if (P->x_1 == (*Block)->x_1)return 0;}if (P->y_2 == (*Block)->y_1 + 1){if (P->x_2 == (*Block)->x_1)return 0;}if (P->y_3 == (*Block)->y_1 + 1){if (P->x_3 == (*Block)->x_1)return 0;}if (P->y_4 == (*Block)->y_1 + 1){if (P->x_4 == (*Block)->x_1)return 0;}if (P->y_1 == (*Block)->y_2 + 1){if (P->x_1 == (*Block)->x_2)return 0;}if (P->y_2 == (*Block)->y_2 + 1){if (P->x_2 == (*Block)->x_2)return 0;}if (P->y_3 == (*Block)->y_2 + 1){if (P->x_3 == (*Block)->x_2)return 0;}if (P->y_4 == (*Block)->y_2 + 1){if (P->x_4 == (*Block)->x_2)return 0;}if (P->y_1 == (*Block)->y_3 + 1){if (P->x_1 == (*Block)->x_3)return 0;}if (P->y_2 == (*Block)->y_3 + 1){if (P->x_2 == (*Block)->x_3)return 0;}if (P->y_3 == (*Block)->y_3 + 1){if (P->x_3 == (*Block)->x_3)return 0;}if (P->y_4 == (*Block)->y_3 + 1){if (P->x_4 == (*Block)->x_3)return 0;}if (P->y_1 == (*Block)->y_4 + 1){if (P->x_1 == (*Block)->x_4)return 0;}if (P->y_2 == (*Block)->y_4 + 1){if (P->x_2 == (*Block)->x_4)return 0;}if (P->y_3 == (*Block)->y_4 + 1){if (P->x_3 == (*Block)->x_4)return 0;}if (P->y_4 == (*Block)->y_4 + 1){if (P->x_4 == (*Block)->x_4)return 0;}P = P->next;}return 1;
}

10.判断整行是否填满

void JudgeEntire(Tetris * Head)
{Tetris * PHead = Head;//从1到26for (int y = 26; y >= 1; y--){int sum = 0;while (PHead->next != NULL){if (PHead->y_1 == y)sum++;if (PHead->y_2 == y)sum++;if (PHead->y_3 == y)sum++;if (PHead->y_4 == y)sum++;MoveCursor(20, 28);PHead = PHead->next;}PHead = Head;if (sum == 18){//如果成行则,执行NewEntire()  清空该行,并将所有y下降一个单位。NewEntire(Phead, y);fengs += 10;Show(code_y);}sum = 0;}
}

11.若填满,则清楚该行,并刷新地图

void NewEntire(Tetris * head, int y)
{Tetris * PHead = head;while (PHead->next != NULL){if (PHead->y_1 == y){MoveCursor(PHead->x_1, PHead->y_1); EMPTYPHead->x_1 = 99;PHead->y_1 = 99;}if (PHead->y_2 == y){MoveCursor(PHead->x_2, PHead->y_2); EMPTYPHead->x_2 = 99;PHead->y_2 = 99;}if (PHead->y_3 == y){MoveCursor(PHead->x_3, PHead->y_3); EMPTYPHead->x_3 = 99;PHead->y_3 = 99;}if (PHead->y_4 == y){MoveCursor(PHead->x_4, PHead->y_4); EMPTYPHead->x_4 = 99;PHead->y_4 = 99;}PHead = PHead->next;}PHead = head;while (PHead->next != NULL){if (PHead->y_1 < y){MoveCursor(PHead->x_1, PHead->y_1); EMPTYPHead->y_1 += 1;MoveCursor(PHead->x_1, PHead->y_1); PRINTF}if (PHead->y_2 < y){MoveCursor(PHead->x_2, PHead->y_2); EMPTYPHead->y_2 += 1;MoveCursor(PHead->x_2, PHead->y_2); PRINTF}if (PHead->y_3 < y){MoveCursor(PHead->x_3, PHead->y_3); EMPTYPHead->y_3 += 1;MoveCursor(PHead->x_3, PHead->y_3); PRINTF}if (PHead->y_4 < y){MoveCursor(PHead->x_4, PHead->y_4); EMPTYPHead->y_4 += 1;MoveCursor(PHead->x_4, PHead->y_4); PRINTF}PHead = PHead->next;}
}

12.显示信息

void Show(int n)
{//显示下一个方块//先清空该区域for (int j = 4; j <= 8; j++){for (int i = 23; i <= 28; i++){MoveCursor(i, j);  EMPTY}}MoveCursor(24, 3);printf("下一个方块种类:");MoveCursor(24, 10);printf("游戏得分:%d", fengs);MoveCursor(24, 12);printf("花狗Fdog出品,必属精品。");if (n == 1){SetColour(13);Location_x(-1, 0, 0, 0, 1, 0, -1, -1);}if (n == 2){SetColour(15);Location_x(0, 0, 1, 0, -1, 1, 1, 1);}if (n == 3){SetColour(12);Location_x(0, 0, 1, 0, 2, 0, 3, 0);}if (n == 4){SetColour(10);Location_x(0, 0, 1, 0, 2, 0, 2, -1);}if (n == 5){SetColour(6);Location_x(0, -1, 0, 0, 1, 0, 2, 0);}if (n == 6){SetColour(4);Location_x(-1, -1, -1, 0, 0, 0, 0, 1);}if (n == 7){SetColour(8);Location_x(0, -1, 0, 0, -1, 0, -1, 1);}
}

13.坐标更新1

void Location(Tetris ** Block, int x, int y, int a, int b, int c, int d, int e, int f)
{(*Block)->x_1 = (*Block)->x_1 + x;(*Block)->y_1 = (*Block)->y_1 + y;(*Block)->x_2 = (*Block)->x_1 + a;(*Block)->y_2 = (*Block)->y_1 + b;(*Block)->x_3 = (*Block)->x_1 + c;(*Block)->y_3 = (*Block)->y_1 + d;(*Block)->x_4 = (*Block)->x_1 + e;(*Block)->y_4 = (*Block)->y_1 + f;
}

14.坐标更新2

void Location_y(Tetris ** Block, int x, int y, int a, int b, int c, int d, int e, int f)
{(*Block)->x_1 = (*Block)->x_1 + x;(*Block)->y_1 = (*Block)->y_1 + y;(*Block)->x_2 = (*Block)->x_2 + a;(*Block)->y_2 = (*Block)->y_2 + b;(*Block)->x_3 = (*Block)->x_3 + c;(*Block)->y_3 = (*Block)->y_3 + d;(*Block)->x_4 = (*Block)->x_4 + e;(*Block)->y_4 = (*Block)->y_4 + f;
}

15.显示信息更新

void Location_x(int x, int y, int a, int b, int c, int d, int e, int f)
{MoveCursor(Loca_x + x, Loca_y + y); PRINTFMoveCursor(Loca_x + a, Loca_y + b); PRINTFMoveCursor(Loca_x + c, Loca_y + d); PRINTFMoveCursor(Loca_x + e, Loca_y + f); PRINTF
}

16.主函数内容

int main()
{DeawMap();code_y = rand() % 7 + 1;while (1){Return = BlockRand(code_y);code_y = rand() % 7 + 1;Show(code_y);ShowBlock(&Return);}system("pause>nul");return 0;
}

三.完整代码奉上,也可自行下载

//vs2015编译运行
#include<stdio.h>
#include<time.h>
#include<Windows.h>
#define HEIGHT  28  //设置地图高度
#define WIDTH   20  //设置地图宽度
#define ZERO    1
#define HEIGHT_1 18
#define Loca_y    6
#define Loca_x    25
#define PRINTF  printf("■");
#define LINE    printf("\n");
#define EMPTY   printf("  ");
typedef struct Tetris
{int x_1, y_1;   //主x坐标,主y坐标,下面三个为附属,通过主坐标确定三个附属int x_2, y_2;int x_3, y_3;int x_4, y_4;int code;//7种方块形态代号Tetris * next;
}Tetris;
void DeawMap();                         //绘制地图
Tetris * BlockRand(int code);           //随机主方块生成
void JudgeDirection(Tetris ** Block); //按键响应
void Form(Tetris ** Block);             //方块坐标全部确定
void ShowBlock(Tetris ** Block);        //显示完整方块
int JudgeWall(Tetris ** Block);         //判断左右界限
void MoveCursor(int x, int y);          //移动光标  不闪屏是因为每次不会刷新全部地图,只会刷新某一特定区域
void SetColour(int c);                  //颜色设定
int JudgeGroud(Tetris * Phead, Tetris ** Block);//判断落地
void JudgeEntire(Tetris * Head);        //判断整行是否填满
void NewEntire(Tetris * head, int y);  //若上面函数成立,若清除该行,并刷新地图
void Show(int n);                   //显示信息,下一个方块得分情况,如果想加入一些信息可以在该函数内修改
void Location(Tetris ** Block, int x, int y, int a, int b, int c, int d, int e, int f);   //坐标更新1
void Location_y(Tetris ** Block, int x, int y, int a, int b, int c, int d, int e, int f); //坐标更新2
void Location_x(int x, int y, int a, int b, int c, int d, int e, int f);                  //信息更新
Tetris *Phead = NULL;   //链表头指针
Tetris *Pend = NULL;    //跟随指针 (尾插法需要)
Tetris * Return = NULL; //节点地址返回
int form = 0; //判断形态
int UP = 0;   //下降速度判断
int code_y = 0;//随机形态
int fengs = 0; //得分int main()
{DeawMap();code_y = rand() % 7 + 1;while (1){Return = BlockRand(code_y);code_y = rand() % 7 + 1;Show(code_y);ShowBlock(&Return);}system("pause>nul");return 0;
}void DeawMap()
{for (int i = 0; i < WIDTH; i++)PRINTF LINE  //上边框for (int i = 1; i < HEIGHT - 1; i++)          //打印左右边框{for (int j = 0; j < WIDTH; j++){if (j == 0 || j == WIDTH - 1){PRINTFif (j == WIDTH - 1)LINE}else EMPTY}}for (int i = 0; i < WIDTH; i++)PRINTF LINE  //下边框system("color 03");
}void Location(Tetris ** Block, int x, int y, int a, int b, int c, int d, int e, int f)
{(*Block)->x_1 = (*Block)->x_1 + x;(*Block)->y_1 = (*Block)->y_1 + y;(*Block)->x_2 = (*Block)->x_1 + a;(*Block)->y_2 = (*Block)->y_1 + b;(*Block)->x_3 = (*Block)->x_1 + c;(*Block)->y_3 = (*Block)->y_1 + d;(*Block)->x_4 = (*Block)->x_1 + e;(*Block)->y_4 = (*Block)->y_1 + f;
}void Location_y(Tetris ** Block, int x, int y, int a, int b, int c, int d, int e, int f)
{(*Block)->x_1 = (*Block)->x_1 + x;(*Block)->y_1 = (*Block)->y_1 + y;(*Block)->x_2 = (*Block)->x_2 + a;(*Block)->y_2 = (*Block)->y_2 + b;(*Block)->x_3 = (*Block)->x_3 + c;(*Block)->y_3 = (*Block)->y_3 + d;(*Block)->x_4 = (*Block)->x_4 + e;(*Block)->y_4 = (*Block)->y_4 + f;
}Tetris * BlockRand(int code_y)
{srand((int)time(0));Tetris * Block = (Tetris*)malloc(sizeof(Tetris));Block->x_1 = 8;Block->y_1 = 4;//规定初始中心方块的坐标为(8,4)Block->code = code_y;if (Phead == NULL)Phead = Block;else Pend->next = Block;Block->next = NULL;Pend = Block;return Block;
}void ShowBlock(Tetris ** Block)
{while (1){Form(&Return); if ((*Block)->code == 1)SetColour(13);if ((*Block)->code == 2)SetColour(15);if ((*Block)->code == 3)SetColour(12);if ((*Block)->code == 4)SetColour(10);if ((*Block)->code == 5)SetColour(6);if ((*Block)->code == 6)SetColour(4);if ((*Block)->code == 7)SetColour(8);MoveCursor((*Block)->x_1, (*Block)->y_1); PRINTFMoveCursor((*Block)->x_2, (*Block)->y_2); PRINTFMoveCursor((*Block)->x_3, (*Block)->y_3); PRINTFMoveCursor((*Block)->x_4, (*Block)->y_4); PRINTFif (JudgeGroud(Phead, &Return) == 0){system("color 03");break;}if (UP == 0){for (int i = 0; i <= 400000000; i++) {}}if (UP == 1){for (int i = 0; i <= 40000000; i++) {}UP = 0;}MoveCursor((*Block)->x_1, (*Block)->y_1); EMPTYMoveCursor((*Block)->x_2, (*Block)->y_2); EMPTYMoveCursor((*Block)->x_3, (*Block)->y_3); EMPTYMoveCursor((*Block)->x_4, (*Block)->y_4); EMPTYLocation_y(&Return, 0, 1, 0, 1, 0, 1, 0, 1);JudgeDirection(&Return);JudgeEntire(Phead);}
}void JudgeDirection(Tetris ** Block)
{if (GetAsyncKeyState(VK_UP) && 0x8000){form += 1;if (form == 4){form = 0;}Form(&Return);}if (GetAsyncKeyState(VK_DOWN) && 0x8000){//加速向下  时间加速UP = 1;}if (GetAsyncKeyState(VK_LEFT) && 0x8000){//向左移动if (JudgeWall(&Return) != -1) Location_y(&Return, -1, 0, -1, 0, -1, 0, -1, 0);}if (GetAsyncKeyState(VK_RIGHT) && 0x8000){//向右移动if (JudgeWall(&Return) != -2) Location_y(&Return, 1, 0, 1, 0, 1, 0, 1, 0);}if (GetAsyncKeyState(VK_ESCAPE) && 0x0D){MoveCursor(27, 15);printf("游戏暂停");//判断Escwhile (1){if (GetAsyncKeyState(VK_ESCAPE) && 0x0D){MoveCursor(27, 15);printf("       ");break;}}}
}void Form(Tetris ** Block)
{//先确实哪一类,再细分switch ((*Block)->code){case 1:if (form == 0)Location(&Return, 0, 0, -1, 0, 0, -1, 1, 0);if (form == 1)Location(&Return, 0, 0, 0, 1, 0, -1, 1, 0);if (form == 2)Location(&Return, 0, 0, 0, 1, -1, 0, 1, 0);if (form == 3)Location(&Return, 0, 0, 0, 1, -1, 0, 0, -1);break;case 2:Location(&Return, 0, 0, 1, 0, 0, 1, 1, 1);break;case 3:if (form == 0 || form == 2)Location(&Return, 0, 0, 0, -1, 0, 1, 0, 2);if (form == 1 || form == 3)Location(&Return, 0, 0, -1, 0, 1, 0, 2, 0);break;case 4:if (form == 0)Location(&Return, 0, 0, -1, 0, 1, 0, 1, -1);if (form == 1)Location(&Return, 0, 0, 0, -1, 1, 0, 0, -2);if (form == 2)Location(&Return, 0, 0, 0, -1, 1, -1, 2, -1);if (form == 3)Location(&Return, 0, 0, 0, -1, 0, -2, -1, -2);break;case 5:if (form == 0)Location(&Return, 0, 0, 1, 0, 2, 0, 0, -1);if (form == 1)Location(&Return, 0, 0, 1, 0, 1, -1, 1, -2);if (form == 2)Location(&Return, 0, 0, 1, 0, 2, 0, 2, 1);if (form == 3)Location(&Return, 0, 0, 1, 0, 0, 1, 0, 2);break;case 6:if (form == 0 || form == 2)Location(&Return, 0, 0, 0, -1, 1, 0, 1, 1);if (form == 1 || form == 3)Location(&Return, 0, 0, 0, -1, 1, -1, -1, 0);break;case 7:if (form == 0 || form == 2)Location(&Return, 0, 0, 0, 1, 1, 0, 1, -1);if (form == 1 || form == 3)Location(&Return, 0, 0, 0, 1, -1, 0, 1, 1);}
}void MoveCursor(int x, int y)//设置光标位置(就是输出显示的开始位置)
{COORD pos = { x * 2,y };HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);//获得 标准输出的句柄   SetConsoleCursorPosition(output, pos); //设置控制台光标位置
}void SetColour(int c)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);//API函数可以改变控制台颜色
}
int JudgeWall(Tetris ** Block)
{if ((*Block)->x_1 == ZERO || (*Block)->x_2 == ZERO || (*Block)->x_3 == ZERO || (*Block)->x_4 == ZERO)return -1;if ((*Block)->x_1 == HEIGHT_1 || (*Block)->x_2 == HEIGHT_1 || (*Block)->x_3 == HEIGHT_1 || (*Block)->x_4 == HEIGHT_1)return -2;return 0;
}int JudgeGroud(Tetris * Phead, Tetris ** Block)
{Tetris * P = Phead;//如果到达最低层。直接经行下一循环if ((*Block)->y_1 == 26 || (*Block)->y_2 == 26 || (*Block)->y_3 == 26 || (*Block)->y_4 == 26)return 0;while (P->next != NULL){if (P->y_1 == (*Block)->y_1 + 1){if (P->x_1 == (*Block)->x_1)return 0;}if (P->y_2 == (*Block)->y_1 + 1){if (P->x_2 == (*Block)->x_1)return 0;}if (P->y_3 == (*Block)->y_1 + 1){if (P->x_3 == (*Block)->x_1)return 0;}if (P->y_4 == (*Block)->y_1 + 1){if (P->x_4 == (*Block)->x_1)return 0;}if (P->y_1 == (*Block)->y_2 + 1){if (P->x_1 == (*Block)->x_2)return 0;}if (P->y_2 == (*Block)->y_2 + 1){if (P->x_2 == (*Block)->x_2)return 0;}if (P->y_3 == (*Block)->y_2 + 1){if (P->x_3 == (*Block)->x_2)return 0;}if (P->y_4 == (*Block)->y_2 + 1){if (P->x_4 == (*Block)->x_2)return 0;}if (P->y_1 == (*Block)->y_3 + 1){if (P->x_1 == (*Block)->x_3)return 0;}if (P->y_2 == (*Block)->y_3 + 1){if (P->x_2 == (*Block)->x_3)return 0;}if (P->y_3 == (*Block)->y_3 + 1){if (P->x_3 == (*Block)->x_3)return 0;}if (P->y_4 == (*Block)->y_3 + 1){if (P->x_4 == (*Block)->x_3)return 0;}if (P->y_1 == (*Block)->y_4 + 1){if (P->x_1 == (*Block)->x_4)return 0;}if (P->y_2 == (*Block)->y_4 + 1){if (P->x_2 == (*Block)->x_4)return 0;}if (P->y_3 == (*Block)->y_4 + 1){if (P->x_3 == (*Block)->x_4)return 0;}if (P->y_4 == (*Block)->y_4 + 1){if (P->x_4 == (*Block)->x_4)return 0;}P = P->next;}return 1;
}void JudgeEntire(Tetris * Head)
{Tetris * PHead = Head;//从1到26for (int y = 26; y >= 1; y--){int sum = 0;while (PHead->next != NULL){if (PHead->y_1 == y)sum++;if (PHead->y_2 == y)sum++;if (PHead->y_3 == y)sum++;if (PHead->y_4 == y)sum++;MoveCursor(20, 28);PHead = PHead->next;}PHead = Head;if (sum == 18){//如果成行则,执行NewEntire()  清空该行,并将所有y下降一个单位。NewEntire(Phead, y);fengs += 10;Show(code_y);}sum = 0;}
}void NewEntire(Tetris * head,int y)
{Tetris * PHead = head;while (PHead->next != NULL){if (PHead->y_1 == y){MoveCursor(PHead->x_1, PHead->y_1); EMPTYPHead->x_1 = 99;PHead->y_1 = 99;}if (PHead->y_2 == y){MoveCursor(PHead->x_2, PHead->y_2); EMPTYPHead->x_2 = 99;PHead->y_2 = 99;}if (PHead->y_3 == y){MoveCursor(PHead->x_3, PHead->y_3); EMPTYPHead->x_3 = 99;PHead->y_3 = 99;}if (PHead->y_4 == y){MoveCursor(PHead->x_4, PHead->y_4); EMPTYPHead->x_4 = 99;PHead->y_4 = 99;}PHead = PHead->next;}PHead = head;while (PHead->next != NULL){if (PHead->y_1 < y){MoveCursor(PHead->x_1, PHead->y_1); EMPTYPHead->y_1 += 1;MoveCursor(PHead->x_1, PHead->y_1); PRINTF}if (PHead->y_2 < y){MoveCursor(PHead->x_2, PHead->y_2); EMPTYPHead->y_2 += 1;MoveCursor(PHead->x_2, PHead->y_2); PRINTF}if (PHead->y_3 < y){MoveCursor(PHead->x_3, PHead->y_3); EMPTYPHead->y_3 += 1;MoveCursor(PHead->x_3, PHead->y_3); PRINTF}if (PHead->y_4 < y){MoveCursor(PHead->x_4, PHead->y_4); EMPTYPHead->y_4 += 1;MoveCursor(PHead->x_4, PHead->y_4); PRINTF}PHead = PHead->next;}
}void Show(int n)
{//显示下一个方块//先清空该区域for (int j = 4; j <= 8; j++){for (int i = 23; i <= 28; i++){MoveCursor(i, j);  EMPTY}}MoveCursor(24, 3); printf("下一个方块种类:");MoveCursor(24, 10);printf("游戏得分:%d", fengs);MoveCursor(24, 12);printf("花狗Fdog出品,必属精品。");if (n == 1){SetColour(13);Location_x(-1, 0, 0, 0, 1, 0, -1, -1);}if (n == 2){SetColour(15);Location_x(0, 0, 1, 0, -1, 1, 1, 1);}if (n == 3){SetColour(12);Location_x(0, 0, 1, 0, 2, 0, 3, 0);}if (n == 4){SetColour(10);Location_x(0, 0, 1, 0, 2, 0, 2, -1);}if (n == 5){SetColour(6);Location_x(0, -1, 0, 0, 1, 0, 2, 0);}if (n == 6){SetColour(4);Location_x(-1, -1, -1, 0, 0, 0, 0, 1);}if (n == 7){SetColour(8);Location_x(0, -1, 0, 0, -1, 0, -1, 1);}
}void Location_x(int x, int y, int a, int b, int c, int d, int e, int f)
{MoveCursor(Loca_x+x, Loca_y+y); PRINTFMoveCursor(Loca_x+a, Loca_y+b); PRINTFMoveCursor(Loca_x+c, Loca_y+d); PRINTFMoveCursor(Loca_x+e, Loca_y+f); PRINTF
}

若有错误,欢迎指正批评,欢迎讨论。
每文一句:生活,就是面对现实微笑,就是越过障碍注视未来;生活,就是用心灵之剪,在人生之路上裁出叶绿的枝头;生活,就是面对困惑或黑暗时,灵魂深处燃起豆大却明亮且微笑的灯展。

C语言俄罗斯方块(新版本完整代码)相关推荐

  1. C语言的链表—完整代码

    链表完整代码.经测试,应该没什么毛病 #include<stdio.h> #include<malloc.h> #include<string.h>typedef ...

  2. 人工智能基础——贝叶斯分类器例程(c语言实现,完整代码)

    选修课老师布置了一道非常简单的作业,作为一学期没上课的学渣,靠百度搜索写完了作业,现把代码贴出,关于贝叶斯分类器的知识,网上一大堆,我就不费时间重复了. 听说MATLAB可以实现,但我MATLAB学的 ...

  3. C语言实现扫雷完整代码讲解

    扫雷是一款初学者能用C语言实现的益智小游戏,只需要用二维数组操作雷区即可. 算法详讲 : 游戏思路如下:点击雷区中的任一格子,如果该格子有雷,则游戏结束:如果该格子周围9个格子都不是雷,那么直接展开其 ...

  4. C语言归并排序(完整代码版)

    归并排序的代码如下: #include<stdio.h> #include<stdlib.h>void Merge(int arr[], int tmp[], int star ...

  5. c语言贪吃蛇_C语言贪吃蛇完整代码

    #include #include #include //windows编程头文件 #include #include //控制台输入输出头文件 #ifndef __cplusplus typedef ...

  6. 链表c语言代码题库排坐标,C语言讲义——链表完整代码

    #include #include #include struct Node { int _id; char s[50]; struct Node* pre;// 指向前一个节点的地址 struct ...

  7. python写双色球的开发语言_Python双色球完整代码

    # 双色球是由两种颜色的球(号码)组成 # 红色球:从1-33号球中,先择6个不重复的号码 # 蓝色球:从1-16号球中,选择1个号码 # 从而组成的一个七位数的号码组合 # 在显示的时候,红色球按照 ...

  8. c语言 饭店管理系统 完整代码

  9. 混凝土的强度预测(R语言 超详细完整代码介绍)神经网络+线性回归

    任务背景 在工程领域中,对建筑材料的性能有精确的估计至关重要.这些估计是必需的,以便制定安全准则来管理用于楼宇.桥梁和道路建设中的材料. 估计混泥土的强度是一个特别有趣的挑战.尽管混泥土几乎要用于每一 ...

最新文章

  1. FPGA之道(总)推荐下这本书以及传递下作者的原话
  2. detime php_php试题及答案
  3. 信息系统项目管理师优秀论文:沟通与干系人管理
  4. linux 字符驱动阻塞型 等待队列
  5. 设置mysql整形_mysql 整型字段设计
  6. python中的单下划线和双下划线_python中的单下划线和双下划线
  7. SQL server 复习一
  8. linux下软件的基本安装和卸载
  9. 大数据学习笔记50:Flume Channels(Flume通道)
  10. 安卓Service完全解析(中)
  11. python2多线程_python_并发编程——多线程2
  12. mysql关于数据是datetime类型
  13. dell服务器怎么用u盘系统安装win7系统教程,戴尔DellU盘重装系统操作教程
  14. matlab 机械振动,MATLAB使用教程之用MATLAB仿真机械振动.doc
  15. RS-485 通讯协议简介
  16. window7磁盘分区
  17. 物联网网络层安全需求
  18. Kubernetes系列之五:使用yaml文件创建service向外暴露服务
  19. 我的世界基岩JAVA附魔_我的世界1.2.5版本,基岩版的可以100级附魔吗,就是
  20. 盗取手机验证码诈骗的克星来了:号码认证服务为你保驾护航

热门文章

  1. python计算器小数点功能_Python 简单计算器实现
  2. 力学笃行系列之JAVA后台知识体系整理
  3. WordPress插件互相冲突的解决方法
  4. xp系统无法连接到指定计算机名,winxp系统提示windows无法访问指定设备路径或文件如何解决...
  5. 打印万年历java程序,算法,java代码实现打印万年历
  6. Altium designer22 原理图库绘制知识点总结-1 altiumdesigner
  7. VS2019通过ADO连接access数据库(详细)
  8. lisp 河道水面线计算_天然河道水面线推求自动计算1.2
  9. fortran教程8:模块和包管理
  10. Python数据结构之树形结构——数组存储