我们先来看一下上次的视频
<iframe allowfullscreen="true" data-mediaembed="csdn" id="Uafe3553-1643617116590" src="https://live.csdn.net/v/embed/184005"></iframe>俄罗斯方块 效果展示
移动函数
为了让程序的输出更加好看,需要用到一个gotoXY函数,其中需要一个输出的句柄:“HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);”。
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoXY(HANDLE hOut, int x, int y) { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(hOut, pos); }
方块的定义
在方块的定义方面,定义了8种类型的方块,其中新添加了一种由六个方块组成的新方块,方块的样子如下。
本次使用的储存方块的方式是二维数组存储,那么代码就在下方了
int block00[4][4] = { { 10, 0, 0, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; int block01[4][4] = { { 11, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 } }; int block02[4][4] = { { 12, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 1, 0, 0 } }; int block03[4][4] = { { 13, 0, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 } }; int block04[4][4] = { { 14, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 1, 0 } }; int block05[4][4] = { { 15, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 } }; int block06[4][4] = { { 16, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 1, 0, 0, 0 } }; int block07[4][4] = { { 17, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 } }; int block08[4][4] = { { 18, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 1, 0 }, { 1, 1, 1, 0 } }; int block09[4][4] = { { 19, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 } }; int block10[4][4] = { { 20, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 1, 0 } }; int block11[4][4] = { { 21, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 0, 0 } }; int block12[4][4] = { { 22, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 1, 1, 0 } }; int block13[4][4] = { { 23, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 } }; int block14[4][4] = { { 24, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 1, 1, 0, 0 } }; int block15[4][4] = { { 25, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 } }; int block16[4][4] = { { 26, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 1, 0 } }; int block17[4][4] = { { 27, 0, 0, 0 }, { 0, 0, 1, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 } }; int block18[4][4] = { { 28, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 0, 0 }, { 1, 1, 0, 0 } }; int block19[4][4] = { { 29, 0, 1, 1 }, { 0, 0, 1, 1 }, { 0, 0, 1, 1 }, { 0, 0, 1, 1 } }; int block20[4][4] = { { 30, 1, 0, 1 }, { 0, 1, 0, 1 }, { 0, 1, 0, 1 }, { 0, 1, 0, 1 } }; int block21[4][4] = { { 31, 0, 1, 1 }, { 0, 0, 1, 1 }, { 0, 0, 1, 1 }, { 0, 0, 1, 1 } }; int block22[4][4] = { { 32, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }; int block23[4][4] = { { 33, 0, 0, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 1, 1, 1, 1 } }; int block24[4][4] = { { 34, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } };
程序运行所需的函数
对于程序运行中所使用的函数,基本已经罗列到了上方了,基本都是比较重要的函数。
void write_It_namea(char a[]); void initialWindow(HANDLE hOut);//初始化窗口 void initialPrint(HANDLE hOut);//初始化界面 int c(); int wj(); void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置 int tz(HANDLE hOut, int &fraction, int &checkpoint,int &val); bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞 void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块 void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块 void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移 void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移 void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度 int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落 void myStop(HANDLE hOut, int block[4][4], int map[21][12]); //游戏暂停 int mymima(); void timee(); int mymin(); int cs(); void isnot_VIP(); int prin(); void print(HANDLE hOut); void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束 void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值
游戏公告
游戏的重要公告(好像自从去年开始写就没有更改过公告),可以自行更改。
void g(HANDLE hOut) { gotoXY(hOut, 62, 2); cout << " 公告"; gotoXY(hOut, 52, 3); cout << "更新须知:"; gotoXY(hOut, 52, 4); cout << " 1.目前已支持一键重玩,如需请按'r'"; gotoXY(hOut, 52, 5); cout << " 2.已开放挑战模式和无限模式,开启需"; gotoXY(hOut, 52, 6); cout << "要达到151关卡,分数需要达到150000分"; gotoXY(hOut, 52, 7); cout << " 3.达到21关、61关、101关都有精彩礼物"; gotoXY(hOut, 52, 8); cout << "助力您精彩上分!"; gotoXY(hOut, 52, 9); cout << " 4.新增时间看查功能"; gotoXY(hOut, 52, 10); cout << " 5.新增方块,将在游戏中测试,有bug请"; gotoXY(hOut, 52, 11); cout << "请立即反馈给官方QQ,QQ:1213565720"; gotoXY(hOut, 52, 12); cout << " 6.新增功能方块选择,可以根据自己的爱"; gotoXY(hOut, 52, 13); cout << "好来选择方块,选择方块按O后就可以选择了"; gotoXY(hOut, 58, 14); cout << "更多精彩内容,尽在游戏中"; }
用户名称内容备份
这里将用户名称默认写入到了D盘,所以从D盘进行的读取,时候可以进行更改。
void namesa() { FILE *fp; int file_size; //保存文件字符数 //将文件内容读到此指针位置 fp = fopen("d:\\elsfk\\name.txt", "r"); //打开文件 fseek(fp, 0, SEEK_END); //将文件指针指向该文件的最后 namea_size = ftell(fp); //根据指针位置,此时可以算出文件的字符数 if (namea_size == -1) { return; } file_size = namea_size; //rintf("文件字符数为 %d\n", file_size); namea = (char *)malloc(file_size * sizeof(char)); //根据文件大小为namea动态分配空间 memset(namea, '\0', file_size * sizeof(char)); //初始化此控件内容,否则可能会有乱码 fseek(fp, 0, SEEK_SET); //重新将指针指向文件首部 fread(namea, sizeof(char), file_size, fp); //开始读取整个文件 //printf("文件内容为\n%s", namea); }
方块颜色备份
颜色备份的函数本来是做调试使用的,但是既然写了,那我就先不进行删除了。
void backups_Block(int x, int y) { //方块颜色备份 gotoXY(hOut, 52, 6); cout << " "; gotoXY(hOut, 52, 6); cout << "X与Y的坐标为:" << x << "," << y; }
方块选择
在方块的选择这一方面,也是与传统的俄罗斯方块不同,对于整个的方块,可以有一些自己主观上的选择,那么为了兼容所有的系统,在此,选择的是一些比较传统的图形:■ ★ ▲ ● ◆
所以整个选择的代码如下:
void gg(HANDLE hOut) { SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); g(hOut); gotoXY(hOut, 52, 16); cout << "请选择您想用的方块:"; /*cout << "请选择您想用的方块:"; string a; cin >> a; cout << a; */while (1) { gotoXY(hOut, 52, 17); cout << "1.■ 2.★ 3.▲ 4.● 5.◆";//备份点2 gotoXY(hOut, 52, 18); string a; cin >> a; switch (a[0]) { case '1': fkxz = 1;//备份点3 break; case '2': fkxz = 2; break; case '3': fkxz = 3; break; case '4': fkxz = 4; break; case '5': fkxz = 5; break; default : gotoXY(hOut, 52, 19); cout << "输入有误,请重新输入~\n"; Sleep(1000); gotoXY(hOut, 52, 19); cout << " "; gotoXY(hOut, 52, 18); cout << " "; break; } if (fkxz >= 1) { break; } } }
时间提示
为了防止玩家过渡沉迷游戏,经过思考后,决定在程序中加入时间提示工具,只是做提醒作用,并没有别的用处
那么下边呢,就是我们的时间模块了,代码量不算太大
void printTime(time_t nowtime, int iFlag) { struct tm *timeinfo; timeinfo = localtime( &nowtime ); int year, month, day, hour, min, sec; year = timeinfo->tm_year + 1900; month = timeinfo->tm_mon + 1; day = timeinfo->tm_mday; hour = timeinfo->tm_hour; min = timeinfo->tm_min; sec = timeinfo->tm_sec; nian = year, yue = month, ri = day, shi = hour, fen = min, miao = sec; fflush(stdout); } void timee(HANDLE hOut) { SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); int iRunTime = GetTickCount(); time_t nowtime; time( &nowtime ); gotoXY(hOut, 52, 10); printTime(nowtime, PRINT_ALL); printf("\n"); } void timeout(HANDLE hOut, int x, int y) { timee(hOut); SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); gotoXY(hOut, x, y); cout << " "; gotoXY(hOut, x, y); cout << "现在时间是:" << nian << "年" << yue << "月" << ri << "日" << shi << "时" << fen << "分" << miao << "秒"; }
界面初始化
在整个界面的初始化过程中呢,也是分为两个模块,一个是程序一开始的,会有一段初始化动画,另外一个是在游戏内重玩的一个动画。先看两张图片,是游戏效果的一个图片展示
那么我们一起来看看代码吧
void print(HANDLE hOut) { SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); for (int i = 0; i < 20; ++i) { cout << "■ ■☆ ☆| |" << endl; } gotoXY(hOut, 26, 0); cout << "☆☆☆☆☆☆☆☆☆☆☆☆------------------------------------------"; gotoXY(hOut, 0, 20); cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆------------------------------------------"; gotoXY(hOut, 26, 1); cout << "分 数: "; gotoXY(hOut, 26, 2); cout << "关 卡: "; gotoXY(hOut, 26, 4); cout << "下一方块:"; gotoXY(hOut, 26, 10); cout << "O:操作方法"; gotoXY(hOut, 26, 11); cout << "V:更新公告"; gotoXY(hOut, 26, 12); cout << "Q:清空提示"; gotoXY(hOut, 26, 14); namea[namea_size - 1] = '\0'; cout << "欢迎玩家:" << namea; gotoXY(hOut, 26, 16); cout << "关 于:"; gotoXY(hOut, 30, 18); cout << "俄罗斯方块V1.0"; gotoXY(hOut, 35, 19); cout << "作者:李跞恒"; gotoXY(hOut, 50, 0); SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); cout << "------------------------------------------"; for (int i = 1; i < 20; i++) { gotoXY(hOut, 50, i); cout << "| |"; } gotoXY(hOut, 50, 20); cout << "------------------------------------------"; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); //gg(hOut); for (int i = 1; i < 20; i++) { gotoXY(hOut, 52, i); cout << " "; } timee(hOut); gotoXY(hOut, 65, 2); cout << "加油!"; } void initialPrint(HANDLE hOut) { SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); for (int i = 0; i < 20; ++i) { cout << "■ ■☆ ☆| |" << endl; Sleep(5); } gotoXY(hOut, 26, 0); cout << "☆☆☆☆☆☆☆☆☆☆☆☆------------------------------------------"; Sleep(5); gotoXY(hOut, 0, 20); cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆------------------------------------------"; Sleep(5); gotoXY(hOut, 26, 1); cout << "分 数: "; Sleep(5); gotoXY(hOut, 26, 2); cout << "关 卡: "; Sleep(5); gotoXY(hOut, 26, 4); cout << "下一方块:"; Sleep(5); gotoXY(hOut, 26, 10); cout << "O:操作方法"; Sleep(5); gotoXY(hOut, 26, 11); cout << "V:更新公告"; Sleep(5); gotoXY(hOut, 26, 12); cout << "Q:清空提示"; Sleep(5); gotoXY(hOut, 26, 14); namea[namea_size - 1] = '\0'; cout << "欢迎玩家:" << namea; Sleep(5); gotoXY(hOut, 26, 16); cout << "关 于:"; Sleep(5); gotoXY(hOut, 30, 18); cout << "俄罗斯方块V1.0"; Sleep(5); gotoXY(hOut, 35, 19); cout << "作者:李跞恒"; Sleep(5); gotoXY(hOut, 50, 0); SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); cout << "------------------------------------------"; Sleep(5); for (int i = 1; i < 20; i++) { gotoXY(hOut, 50, i); cout << "| |"; Sleep(5); } gotoXY(hOut, 50, 20); cout << "------------------------------------------"; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); gg(hOut); for (int i = 1; i < 20; i++) { gotoXY(hOut, 52, i); cout << " "; } timee(hOut); gotoXY(hOut, 65, 2); cout << "加油!"; } void qk(HANDLE hOut) { for (int i = 1; i <= 19; i++) { gotoXY(hOut, 52, i); cout << " "; } }
请按空格键继续
就是一个简简单单的while循环
int prin() { cout << "请按空格键继续"; char key; while (true) { key = _getch(); if (key == ' ') { system("cls"); break; } } }
挑战模式
这个也不知道是什么时候写的了,感觉没有什么实在的意义,所以一直没有动
int tz(HANDLE hOut, int &fraction, int &checkpoint,int &val) { if (f == 0) { score += 100; val = 50; } else if (f == 1) { score += 200; val = 40; } else if (f == 2) { score += 400; val = 35; } else if (f == 3) { score += 800; val = 30; } else if (f == 4) { score += 1000; val = 50; } else if (f == 5) { score += 1500; val = 50; } else { score += 2000; val = 50; } gk = score / 1000 + 1; system("cls"); if (f1 == 4) { gotoXY(hOut, 0, 0); SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); cout << "段位:"; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "倔强青铜 秩序白银 荣耀黄金 尊贵铂金 永恒钻石 至尊星耀 最强王者 荣耀王者"; gotoXY(hOut, 0, 3); cout << "段位:当前暂未进行挑战!\n\n"; cout << "提示:\n一、挑战模式中,按键‘r’重玩可以使用。\n二、挑战模式中,必须要比人机提前到达指定的分数,最后一关有奖励。\n三、挑战模式中没有任何奖励,必须要通过自己的实力。\n四、氪金和没氪金的分数不变,但是最后的分数加成会减少。\n五、在最后一关有隐藏奖励,达到相应分数即可,但是必须要比人机提前到达!\n六、如有bug,请联系官方QQ:1213565720,感谢您的使用。\n七、程序的最终解释权归作者所有\n"; cnt = 102534; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); cout << " 请先仔细阅读,完成阅读请按‘o’"; char key; while (true) { key = _getch(); if (key == 'o' || key == 'O') { cout << " "; system("cls"); break; } } } if (f1 == 4) { f1 = 3; fla = 11; return 0; } SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); cout << "当前段位:"; switch (f) { case 0: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "倔强青铜"; if (checkpoint >= 51 && fraction >= 50000) { //win(hOut,fraction,checkpoint); f = 1; f1 = 3; fraction = 0; checkpoint = 1; score = 0; gk = 1; fla = 11; } break; case 1: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "秩序白银"; if (checkpoint >= 71 && fraction >= 70000) { f = 2; f1 = 3; fraction = 0; checkpoint = 1; score = 0; gk = 1; fla = 11; } break; case 2: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "荣耀黄金"; if (checkpoint >= 91 && fraction >= 90000) { f = 3; f1 = 3; fraction = 0; checkpoint = 1; score = 0; gk = 1; fla = 11; } break; case 3: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "尊贵铂金"; if (checkpoint >= 111 && fraction >= 110000) { f = 4; f1 = 3; fraction = 0; checkpoint = 1; score = 0; gk = 1; fla = 11; } break; case 4: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "永恒钻石"; if (checkpoint >= 141 && fraction >= 140000) { f = 5; f1 = 3; fraction = 0; checkpoint = 1; score = 0; gk = 1; fla = 11; } break; case 5: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "至尊星耀"; if (checkpoint >= 151 && fraction >= 150000) { f = 6; f1 = 3; fraction = 0; checkpoint = 1; score = 0; gk = 1; fla = 11; } break; case 6: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "最强王者"; if (checkpoint >= 201 && fraction >= 200000) { f = 7; f1 = 3; fraction = 0; checkpoint = 1; score = 0; gk = 1; fla = 11; } break; case 7: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout << "荣耀王者"; if (checkpoint >= 251 && fraction >= 250000) { cout << "恭喜您到达荣耀王者\n"; //cout<<"恭喜您,达到了荣耀王者,请问您想要一下哪些东西呢?\n1.复活甲 能复活一次 2.分数增加 消除后增加分数提升200分(提升的分数上限是2000分) 3.开局跳至21关\n请选择:"; f1 = 3; f = 9; fraction = 0; checkpoint = 1; score = 0; gk = 1; fla = 11; } break; } prin(); }
写入函数
这里不做过多的介绍了,这些函数是为了写入某个特定的值的。
int wj() { if (c() == 0) { string path; path = "d:\\elsfk"; path = "md " + path; system(path.c_str()); } } int mymima() { ofstream ofile; ofile.open("d:\\elsfk\\mima.txt"); ofile << 9; ofile.close(); } int mymin() { char a; ifstream ifile; //定义输入文件 ifile.open("d:\\elsfk\\mima.txt"); //作为输入文件打开 ifile.get(a); ifile.close(); //关闭文件 return a; } int cs() { ofstream ofile; ofile.open("d:\\elsfk\\c.txt"); ofile << "^"; ofile.close(); } void isnot_VIP() { ofstream ofile; ofile.open("d:\\elsfk\\c.txt"); ofile << "D"; ofile.close(); } int c() { char a; ifstream ifile; //定义输入文件 ifile.open("d:\\elsfk\\c.txt"); //作为输入文件打开 ifile.get(a); ifile.close(); //关闭文件 return a; } void write_It_namea(char a[]) { ofstream ofile; ofile.open("d:\\elsfk\\name.txt"); ofile << a; ofile << " "; ofile.close(); }
初始窗口
主要是对名称的初始,和使用到的一些东西,不做过多介绍
void initialWindow(HANDLE hOut) { SetConsoleTitle("俄罗斯方块"); COORD size = { 80, 25 }; SetConsoleScreenBufferSize(hOut, size); SMALL_RECT rc = { 0, 0, 79, 24 }; SetConsoleWindowInfo(hOut, true, &rc); CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(hOut, &cursor_info); }
随机生成的方块
所有的方块一共有24种形态,所以进行了一次时间随机数的随机,函数的主要作用是将准备好的方块内容转换到当前的方块,代码逻辑比较单一
void roundBlock(HANDLE hOut, int block[4][4]) { clearBlock(hOut, block, 5, 15); int n = rand() % 24; switch (n) { case 0: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block00[i][j]; } } break; case 1: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block01[i][j]; } } break; case 2: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block02[i][j]; } } break; case 3: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block03[i][j]; } } break; case 4: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block04[i][j]; } } break; case 5: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block05[i][j]; } } break; case 6: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block06[i][j]; } } break; case 7: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block07[i][j]; } } break; case 8: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block08[i][j]; } } break; case 9: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block09[i][j]; } } break; case 10: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block10[i][j]; } } break; case 11: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block11[i][j]; } } break; case 12: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block12[i][j]; } } break; case 13: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block13[i][j]; } } break; case 14: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block14[i][j]; } } break; case 15: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block15[i][j]; } } break; case 16: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block16[i][j]; } } break; case 17: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block17[i][j]; } } break; case 18: for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block18[i][j]; } } break; case 19: for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block19[i][j]; } } break; case 20: for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block20[i][j]; } } break; case 22: for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block22[i][j]; } } break; case 23: for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block23[i][j]; } } break; case 24: for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block24[i][j]; } } break; default: break; } printBlock(hOut, block, 5, 15); }
输出方块
方块生成了,也要有一共输出啊,所以在生成方块的时候,有的人也已经注意到了,生成的时候是在前面有一串数字,这串数字是方块的编码,所以在这里就用到了,设置输出的颜色,和备份放到了一起
void printBlock(HANDLE hOut, int block[4][4], int x, int y) { switch (block[0][0]) { case 10: case 11: SetConsoleTextAttribute(hOut, FOREGROUND_GREEN); NOW_color_block = 10; break; case 12: case 13: case 14: case 15: NOW_color_block = 12; SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 16: case 17: case 18: case 19: NOW_color_block = 16; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 20: case 21: case 22: case 23: NOW_color_block = 20; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 24: case 25: NOW_color_block = 24; SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 26: case 27: NOW_color_block = 26; SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 28: NOW_color_block = 28; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); break; case 29: case 30: case 31: case 32: case 33: case 34: NOW_color_block = 29; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); break; default: break; } for (int i = 0; i < 4; ++i) { if (i + x >= 0) { for (int j = 0; j < 4; ++j) { if (block[i][j] == 1) { gotoXY(hOut, 2 * (y + j), x + i); if (fkxz == 1) { cout << "■"; } else if (fkxz == 2) { cout << "★"; } else if (fkxz == 3) { cout << "▲"; } else if (fkxz == 4) { cout << "●"; } else if (fkxz == 5) { cout << "◆"; } else { cout << "0"; } } } } } }
碰撞检测
这个东西没有什么可以说的,就是单纯的用算法写的
bool collisionDetection(int block[4][4], int map[21][12], int x, int y) { for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1) { return false; } } } return true; }
清除方块
对于方块的清空其实是与方块的输出类似的,但是为了方便,方块的颜色备份的内容的清空也是写在了这个地方,在这里输出了两个空格,因为每个方块占用的是2个字节,而在这种界面上的输出,刚好是每个空格一个字节。但是在Windows7上,这种方块的清空只需要输出一个空格就行,在这里我做过测试的。那么,为了兼容Windows10与Windows11,这里就使用输出两个空格(两个字节)来清空控制台。
void clearBlock(HANDLE hOut, int block[4][4], int x, int y) { for (int i = 0; i < 4; ++i) { if (i + x >= 0) { for (int j = 0; j < 4; ++j) { if (block[i][j] == 1) { gotoXY(hOut, 2 * (y + j), x + i); cout << " "; NOW_color_bloCK[x + i][y + j] = 0; } } } } }
游戏结束
当游戏结束的时候,是会有存档的没有删除的,那么在这里呢,对于当前存档要进行一个重新的写入,就可以实现了存档的删除的类似操作,那么在主函数内部,当判断到游戏结束了,会对游戏的数据进行清零处理,从而达到删除的效果。
void gameOver(HANDLE hOut, int block[4][4], int map[21][12]) { SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); gotoXY(hOut, 9, 8); cout << "GAME OVER"; gotoXY(hOut, 8, 9); cout << "空格键:重来"; gotoXY(hOut, 8, 10); cout << "ESC键:退出"; char key; while (true) { key = _getch(); if (key == 32) { gotoXY(hOut, 2, 11); cnt = 0; system("pause"); system("cls"); return; } if (key == 27) { system("cls"); freopen("D:\\elsfk\\color.txt", "w", stdout); for (int i = 0; i < 21; i++) { for (int j = 0; j < 12; j++) { cout << color_backups[i][j] << " "; } cout << endl; } fclose(stdout); freopen("D:\\elsfk\\last.txt", "w", stdout); for (int i = 0; i < 21; i++) { for (int j = 0; j < 12; j++) { cout << map[i][j] << " "; } cout << endl; } fclose(stdout); exit(0); fclose(stdout); break; exit(0); } } }
方块的变形
对于方块的一个变型操作,使用了逐个枚举的方法,将方块的一个变型的操作进行一个类似打标的操作
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) { switch (block[0][0]) { case 10: if (collisionDetection(block01, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block01[i][j]; } } } break; case 11: if (collisionDetection(block00, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block00[i][j]; } } } else if (collisionDetection(block00, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block00[i][j]; } } --y; } else if (collisionDetection(block00, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block00[i][j]; } } ++y; } else if (collisionDetection(block00, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block00[i][j]; } } y = y - 2; } else if (collisionDetection(block00, map, x, y + 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block00[i][j]; } } y = y + 2; } break; case 12: if (collisionDetection(block03, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block03[i][j]; } } } else if (collisionDetection(block03, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block03[i][j]; } } --y; } else if (collisionDetection(block03, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block03[i][j]; } } ++y; } break; case 13: if (collisionDetection(block04, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block04[i][j]; } } } else if (collisionDetection(block04, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block04[i][j]; } } --y; } else if (collisionDetection(block04, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block04[i][j]; } } ++y; } break; case 14: if (collisionDetection(block05, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block05[i][j]; } } } else if (collisionDetection(block05, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block05[i][j]; } } --y; } else if (collisionDetection(block05, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block05[i][j]; } } ++y; } break; case 15: if (collisionDetection(block02, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block02[i][j]; } } } else if (collisionDetection(block02, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block02[i][j]; } } --y; } else if (collisionDetection(block02, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block02[i][j]; } } ++y; } break; case 16: if (collisionDetection(block07, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block07[i][j]; } } } else if (collisionDetection(block07, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block07[i][j]; } } --y; } else if (collisionDetection(block07, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block07[i][j]; } } ++y; } break; case 17: if (collisionDetection(block08, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block08[i][j]; } } } else if (collisionDetection(block08, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block08[i][j]; } } --y; } else if (collisionDetection(block08, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block08[i][j]; } } ++y; } break; case 18: if (collisionDetection(block09, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block09[i][j]; } } } else if (collisionDetection(block09, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block09[i][j]; } } --y; } else if (collisionDetection(block09, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block09[i][j]; } } ++y; } break; case 19: if (collisionDetection(block06, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block06[i][j]; } } } else if (collisionDetection(block06, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block06[i][j]; } } --y; } else if (collisionDetection(block06, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block06[i][j]; } } ++y; } break; case 20: if (collisionDetection(block11, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block11[i][j]; } } } else if (collisionDetection(block11, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block11[i][j]; } } --y; } else if (collisionDetection(block11, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block11[i][j]; } } ++y; } break; case 21: if (collisionDetection(block12, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block12[i][j]; } } } else if (collisionDetection(block12, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block12[i][j]; } } --y; } else if (collisionDetection(block12, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block12[i][j]; } } ++y; } break; case 22: if (collisionDetection(block13, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block13[i][j]; } } } else if (collisionDetection(block13, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block13[i][j]; } } --y; } else if (collisionDetection(block13, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block13[i][j]; } } ++y; } break; case 23: if (collisionDetection(block10, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block10[i][j]; } } } else if (collisionDetection(block10, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block10[i][j]; } } --y; } else if (collisionDetection(block10, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block10[i][j]; } } ++y; } break; case 24: if (collisionDetection(block15, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block15[i][j]; } } } else if (collisionDetection(block15, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block15[i][j]; } } --y; } else if (collisionDetection(block15, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block15[i][j]; } } ++y; } break; case 25: if (collisionDetection(block14, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block14[i][j]; } } } else if (collisionDetection(block14, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block14[i][j]; } } --y; } else if (collisionDetection(block14, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block14[i][j]; } } ++y; } break; case 26: if (collisionDetection(block17, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block17[i][j]; } } } else if (collisionDetection(block17, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block17[i][j]; } } --y; } else if (collisionDetection(block17, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block17[i][j]; } } ++y; } break; case 27: if (collisionDetection(block16, map, x, y)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block16[i][j]; } } } else if (collisionDetection(block16, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block16[i][j]; } } --y; } else if (collisionDetection(block16, map, x, y + 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { block[i][j] = block16[i][j]; } } ++y; } break; case 29: if (collisionDetection(block19, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block20[i][j]; } } } else if (collisionDetection(block19, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block21[i][j]; } } } else if (collisionDetection(block19, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block22[i][j]; } } } else if (collisionDetection(block19, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block23[i][j]; } } } else if (collisionDetection(block19, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block24[i][j]; } } } break; case 30: if (collisionDetection(block20, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block21[i][j]; } } } else if (collisionDetection(block20, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block22[i][j]; } } } else if (collisionDetection(block20, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block23[i][j]; } } } else if (collisionDetection(block20, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block24[i][j]; } } } else if (collisionDetection(block20, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block19[i][j]; } } } break; case 31: if (collisionDetection(block21, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block22[i][j]; } } } else if (collisionDetection(block21, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block23[i][j]; } } } else if (collisionDetection(block21, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block24[i][j]; } } } else if (collisionDetection(block21, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block19[i][j]; } } } else if (collisionDetection(block21, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block20[i][j]; } } } break; case 32: if (collisionDetection(block22, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block23[i][j]; } } } else if (collisionDetection(block22, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block24[i][j]; } } } else if (collisionDetection(block22, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block19[i][j]; } } } else if (collisionDetection(block22, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block20[i][j]; } } } else if (collisionDetection(block22, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block21[i][j]; } } } break; case 33: if (collisionDetection(block23, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block24[i][j]; } } } else if (collisionDetection(block23, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block19[i][j]; } } } else if (collisionDetection(block23, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block20[i][j]; } } } else if (collisionDetection(block23, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block21[i][j]; } } } else if (collisionDetection(block23, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block22[i][j]; } } } break; case 34: if (collisionDetection(block24, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block19[i][j]; } } } else if (collisionDetection(block24, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block20[i][j]; } } } else if (collisionDetection(block24, map, x, y - 1)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block21[i][j]; } } } else if (collisionDetection(block24, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block22[i][j]; } } } else if (collisionDetection(block24, map, x, y - 2)) { clearBlock(hOut, block, x, y); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = block23[i][j]; } } } break; default: break; } }
下左右的3个函数
对于左右这两个函数来讲,基本是一致的,重点来说下降的函数,下降的函数是需要对地图进行一个写入的操作,为了是进行接下来的消除一行方块的一个判定,那么在写入map的同时,会进行color的写入,当前的颜色,以保证对于备份文件的使用。
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y) { if (collisionDetection(block, map, x + 1, y)) { clearBlock(hOut, block, x, y); ++x; return 0; } if (x < 0) { return 2; } for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { if (block[i][j] == 1) { map[x + i][y + j] = 1; //SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); //gotoXY(hOut, 2 * (y + j), x + i); color_backups[x + i][y + j] = NOW_color_block; //cout << "■"; //cout<<"■"; } } } return 1; } void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) { if (collisionDetection(block, map, x, y - 1)) { clearBlock(hOut, block, x, y); --y; } } void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) { if (collisionDetection(block, map, x, y + 1)) { clearBlock(hOut, block, x, y); ++y; } }
游戏暂停
游戏不可能让玩家一直玩下去,在中途也可能会需要有别的事情,那么对于这种情况,在这里,使用了一个暂停的方法,那即使是暂停了,那也不能忘记时间,在这里,也是贴心的进行了一个时间的输出。
输出时间显然不能与输入冲突,就会使用一个_kbhit()的函数,是检测键盘有没有按下按键,如果按下了,就输入,没有及继续输出时间。
void myStop(HANDLE hOut, int block[4][4], int map[21][12]) { clearBlock(hOut, block, 5, 15); SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); gotoXY(hOut, 30, 7); cout << "游戏暂停"; char key; gotoXY(hOut, 52, 10); //cout << "暂停时时间:" << nian << "年" << yue << "月" << ri << "日" << shi << "时" << fen << "分" << miao << "秒"; while (true) { if (_kbhit()) { key = getch(); if (key == 32) { gotoXY(hOut, 30, 7); cout << " "; printBlock(hOut, block, 5, 15); return; } if (key == 27) { system("cls"); freopen("D:\\elsfk\\color.txt", "w", stdout); for (int i = 0; i < 21; i++) { for (int j = 0; j < 12; j++) { cout << color_backups[i][j] << " "; } cout << endl; } fclose(stdout); freopen("D:\\elsfk\\last.txt", "w", stdout); for (int i = 0; i < 21; i++) { for (int j = 0; j < 12; j++) { cout << map[i][j] << " "; } cout << endl; } fclose(stdout); //system("start D:\\elsfk\\last.txt"); //system("start D:\\elsfk\\color.txt"); exit(0); fclose(stdout); freopen("D:\\elsfk\\Users.txt", "w", stdout); //cout << fraction << " " << checkpoint << " " << val << endl; fclose(stdout); break; exit(0); } } else { timee(hOut); gotoXY(hOut, 52, 12); cout << "现在时间是:" << nian << "年" << yue << "月" << ri << "日" << shi << "时" << fen << "分" << miao << "秒"; } } }
分数与关卡的计算
这是倒数第二个函数了,对于分数的计算,这个函数主要是在看的是当前这一行的数据总和加起来是10的,进行一个加分的处理。另外,对于关卡的计算是一句分数的总和除以1000在加上1,计算的。
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint) { SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); for (int i = 19; i >= 0; --i) { int x = 0; for (int j = 1; j < 11; ++j) { x += map[i][j]; } if (x == 10) { if (it_is_vis_VIP) { fraction += 200;//分数 if (val > 1 && fraction / 1000 + 1 != checkpoint) { checkpoint = fraction / 1000 + 1; val = 50; } } else { fraction += 100; //分数 if (val > 1 && fraction / 1000 + 1 != checkpoint) { checkpoint = fraction / 1000 + 1; val -= 5; } } for (int m = i; m > 0; --m) { for (int n = 1; n < 11; ++n) { map[m][n] = map[m - 1][n]; color_backups[m][n] = color_backups[m - 1][n]; gotoXY(hOut, 2 * n, m); if (map[m][n] == 1) { if (x == 1) { cout << "■"; } else if (x == 2) { cout << "●"; } else if (x == 3) { cout << "◆"; } else if (x == 4) { cout << "★"; } } else { cout << " "; } } } ++i; } } }
主函数
主函数的内容有点多,在这里不在进行详细解释了,一位内如果进行详细解释的话,一篇文章也写不完,可以先自己理解一下吧
int main() { wj(); namesa(); string a, b; a = "llh%*)^@(#%"; //char a[8] = {'\0'}, b = '0'; if ((c() != '^') && (c() != 'D')) { cout << "此电脑是否是您的常用电脑? (Y)是 (N)不是:"; char cha; cin >> cha; cout << endl; if (cha == 'Y') { cout << endl; cout << "请输入游戏密钥:(与游戏运行无关)"; cin >> b; if (a == b) { cs(); cout << "\n《VIP用户手册》\n尊敬的VIP用户您好,欢迎使用俄罗斯方块小游戏。\n 1.已为您准备好内置更换方块的特权。\n 2.您的分数值将会超越其他人,有更好的游戏体验。\n 3.会对您的游戏记录进行实时存档\n"; } else { isnot_VIP(); cout << "您是否考虑加入VIP呢,申请VIP只需要加客服QQ:1213565720 即可"; } } else { cout << "这不是你的电脑,游戏将不会记录!"; cout << endl; cout << "请输入游戏密钥:(与游戏运行无关)"; cin >> b; if (a == b) { cs(); cout << "\n《VIP用户手册》\n尊敬的VIP用户您好,欢迎使用俄罗斯方块小游戏。\n 1.已为您准备好内置更换方块的特权。\n 2.您的分数值将会超越其他人,有更好的游戏体验。\n 3.会对您的游戏记录进行实时存档\n"; } } cout << endl; } system("pause"); system("cls"); int map[21][12]; int blockA[4][4];//候选区的方块 int blockB[4][4];//下落中的方块 int positionX, positionY;//方块左上角的坐标 bool check;//检查方块还能不能下落 char key;//用来存储按键 int val;//用来控制下落速度 int fraction;//用来存储得分 int checkpoint;//用来存储关卡 int times; int tc; int cnnt = 0; /*上方变量声明需要备份*/ HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄 initialWindow(hOut); if (c() == 'D') { it_is_vis_VIP=0; cnnt = 0; } else { it_is_vis_VIP=1; cnnt = 1;/*该变量的值需要备份*/ } system("mode con cols=94 lines=26"); if (namea_size == -1) { while (1) { gotoXY(hOut, 30, 10); cout << "请输入用户名:\n"; gotoXY(hOut, 30, 11); char nameaa[200]; cin >> nameaa; write_It_namea(nameaa); exit(0); int lenn = 0; lenn = strlen(nameaa); nameaa[lenn] = ' '; if (a[0] == ' ' || a[0] == '\0') { system("cls"); cout << "用户姓名识别失败,请重新输入~\n"; } else if (lenn >= 12 && lenn <= 1) { system("cls"); cout << "用户姓名过长,请重新输入。例:测试员001\n"; } else { system("cls"); cout << nameaa << ",您好,游戏即将开始,请先做好游戏准备。\n"; Sleep(500); system("cls"); cout << "3\n"; Sleep(1000); system("cls"); cout << "2\n"; Sleep(1000); system("cls"); cout << "1\n"; Sleep(1000); system("cls"); cout << "游戏开始!!!"; Sleep(2000); system("cls"); cnnt = 1; break; } } } cout << "cnnt的值为" << cnnt; system("pause"); timee(hOut); int nian1, yue1, ri1, shi1, fen1, miao1; nian1 = nian, yue1 = yue, ri1 = ri, shi1 = shi, fen1 = fen, miao1 = miao; initial: gotoXY(hOut, 0, 0); initialPrint(hOut); int temp = fkxz; check = true; val = 50; fraction = 0 * 1000; checkpoint = 1; cnt = 0; times = val; /*上方变量不冲突的进行备份*/ /*for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { map[i][j] = 0; } } for (int i = 0; i < 20; ++i) { map[i][0] = map[i][11] = 1; } for (int i = 0; i < 12; ++i) { map[20][i] = 1; }*/ /*地图备份*/ ifstream infile; infile.open("d:\\elsfk\\last.txt"); if (!infile) cout << "error" << endl; string str; int t1; int*p = &map[0][0]; while (infile >> t1) { //遇到空白符结束 *p = t1; p++; } bool if_flag_map_check = false; gotoXY(hOut, 52, 3); cout << "正在校验存档文件"; for (int i = 0; i < 21; ++i) { for (int j = 1; j < 12; ++j) { //Sleep(5); if (map[i][j] < 0 || map[i][j] > 1) { if_flag_map_check = true; break; } } } gotoXY(hOut, 52, 4); cout << "备份文件校验完成"; Sleep(500); system("cls"); print(hOut); if (if_flag_map_check) { gotoXY(hOut, 52, 3); cout << "备份文件有误,正在重新创建地图…"; for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { map[i][j] = 0; // Sleep(10); } } for (int i = 0; i < 20; ++i) { map[i][0] = map[i][11] = 1; // Sleep(10); } for (int i = 0; i < 12; ++i) { map[20][i] = 1; // Sleep(10); } gotoXY(hOut, 52, 4); cout << "地图创建成功,正在备份地图…"; Sleep(500); system("cls"); print(hOut); system("cls"); freopen("D:\\elsfk\\last.txt", "w", stdout); MessageBox(NULL, "俄罗斯方块地图已开始备份,请不要关闭此程序,感谢您的配合!", "俄罗斯方块", MB_OK); for (int i = 0; i < 21; i++) { for (int j = 0; j < 12; j++) { cout << map[i][j] << " "; // Sleep(20); } cout << endl; // Sleep(20); } MessageBox(NULL, "地图存档创建完成,正在重新打开", "俄罗斯方块", MB_OK); system("start 俄罗斯方块.exe") ; exit(0); fclose(stdout); freopen("D:\\elsfk\\Users.txt", "w", stdout); cout << fraction << " " << checkpoint << " " << val << endl; fclose(stdout); } fkxz = temp; ifstream infile1; infile1.open("d:\\elsfk\\color.txt"); if (!infile1) cout << "error" << endl; string str1; int t11; int*p1 = &color_backups[0][0]; while (infile1 >> t11) { //遇到空白符结束 *p1 = t11; p1++; } for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { if (map[i][j] == 1) { switch (color_backups[i][j]) { case 10: case 11: SetConsoleTextAttribute(hOut, FOREGROUND_GREEN); NOW_color_block = 10; break; case 12: case 13: case 14: case 15: NOW_color_block = 12; SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 16: case 17: case 18: case 19: NOW_color_block = 16; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 20: case 21: case 22: case 23: NOW_color_block = 20; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 24: case 25: NOW_color_block = 24; SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 26: case 27: NOW_color_block = 26; SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 28: NOW_color_block = 28; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); break; case 29: case 30: case 31: case 32: case 33: case 34: NOW_color_block = 29; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); break; default: break; } gotoXY(hOut, 2 * ( j), i); if (fkxz == 1) { cout << "■"; } else if (fkxz == 2) { cout << "★"; } else if (fkxz == 3) { cout << "▲"; } else if (fkxz == 4) { cout << "●"; } else if (fkxz == 5) { cout << "◆"; } else { cout << "0"; } } } } srand((unsigned)time(NULL)); roundBlock(hOut, blockA); int x1 = 52, y1 = 12; while (true) { for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { if (map[i][j] == 1) { switch (color_backups[i][j]) { case 10: case 11: SetConsoleTextAttribute(hOut, FOREGROUND_GREEN); NOW_color_block = 10; break; case 12: case 13: case 14: case 15: NOW_color_block = 12; SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 16: case 17: case 18: case 19: NOW_color_block = 16; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 20: case 21: case 22: case 23: NOW_color_block = 20; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 24: case 25: NOW_color_block = 24; SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 26: case 27: NOW_color_block = 26; SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 28: NOW_color_block = 28; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); break; case 29: case 30: case 31: case 32: case 33: case 34: NOW_color_block = 29; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); break; default: break; } gotoXY(hOut, 2 * ( j), i); if (fkxz == 1) { cout << "■"; } else if (fkxz == 2) { cout << "★"; } else if (fkxz == 3) { cout << "▲"; } else if (fkxz == 4) { cout << "●"; } else if (fkxz == 5) { cout << "◆"; } else { cout << "0"; } } } } timeout(hOut, x1, y1); SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); gotoXY(hOut, 26, 14); cout << "欢迎玩家:" << namea; int a;/*备份是否到达附加关卡*/ if (a == 3) { fraction = 20 * 1000, checkpoint = 21; a = 50, cnt = 1000; } if (checkpoint >= 21 && cnt == 0) { for (int i = 2; i < 7; i++) { gotoXY(hOut, 52, i); cout << " " ; Sleep(100); } SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); gotoXY(hOut, 52, 2); cout << "准备达到21关的礼包,请稍等"; gotoXY(hOut, 52, 3); system("pause"); gotoXY(hOut, 52, 4); if (flag) { cout << "终于到达21关,好厉害啊,准备给你跳跃"; gotoXY(hOut, 52, 5); cout << "到41关,可以获得" << 20 * 1000 << "分!"; gotoXY(hOut, 52, 6); system("pause"); checkpoint = checkpoint + 20; fraction = (checkpoint - 1) * 1000; } else { cout << "目前已经达到了21关,已经很厉害了,"; gotoXY(hOut, 52, 5); cout << "决定赠送给你10000分,可以直接跳跃至"; gotoXY(hOut, 52, 6); cout << "31关,加油,后边还有礼包!"; gotoXY(hOut, 52, 7); system("pause"); checkpoint = checkpoint + 10; fraction = (checkpoint - 1) * 1000; } cnt++; for (int i = 2; i < 7; i++) { gotoXY(hOut, 52, i); cout << " " ; Sleep(100); } } else if (checkpoint >= 61 && (cnt == 1 || cnt == 0)) { SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); for (int i = 2; i < 7; i++) { gotoXY(hOut, 52, i); cout << " " ; Sleep(100); } gotoXY(hOut, 52, 2); Sleep(100); cout << "哇,厉害了,居然有如此之传奇!"; gotoXY(hOut, 52, 3); cout << "达到61关也不容易,真的太厉害了!"; gotoXY(hOut, 52, 4); if (flag) { cout << "准备给你可以直接给你提升至91关!"; gotoXY(hOut, 52, 5); cout << "30000分将送给你,加油!"; gotoXY(hOut, 52, 6); system("pause"); checkpoint = checkpoint + 30; fraction = (checkpoint - 1) * 1000; } else { cout << "我们决定给您提升至75关!"; gotoXY(hOut, 52, 5); cout << "15000分将送给你,加油!"; gotoXY(hOut, 52, 6); cout << "到达100关,将会有礼物给你!加油"; gotoXY(hOut, 52, 7); system("pause"); checkpoint = checkpoint + 15; fraction = (checkpoint - 1) * 1000; } cnt++; for (int i = 2; i < 7; i++) { gotoXY(hOut, 52, i); cout << " " ; Sleep(100); } } else if (checkpoint >= 101 && (cnt == 2 || cnt == 1 || cnt == 0)) { SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); gotoXY(hOut, 52, 8); cout << "厉害厉害,都到达101关了,速度给您减"; gotoXY(hOut, 52, 9); cout << "慢了,加油吧!游戏到达151关结束,关"; gotoXY(hOut, 52, 10); cout << "卡、得分将会重置分数,重新开始后,会"; gotoXY(hOut, 52, 11); cout << "赠送你20000分,直接到达21关,并且,"; gotoXY(hOut, 52, 12); cout << "开始挑战模式,真人挑战电脑,加油吧,"; gotoXY(hOut, 52, 13); cout << "到达以后将给您详细解释"; gotoXY(hOut, 52, 14); system("pause"); for (int i = 8; i < 15; i++) { gotoXY(hOut, 50, i); cout << "╠ ╣"; } val = 50; cnt++; } else if (checkpoint >= 151 && (cnt == 3 || cnt == 2 || cnt == 1 || cnt == 0)) { while (true) { f1 = 4; SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); for (int i = 1; i <= 14; i++) { gotoXY(hOut, 52, i); cout << " " ; } gotoXY(hOut, 2, 2); cout << " "; sk = 1; SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); gotoXY(hOut, 36, 1); cout << fraction; gotoXY(hOut, 36, 2); cout << checkpoint; for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { map[i][j] = 0; } } for (int i = 0; i < 20; ++i) { map[i][0] = map[i][11] = 1; } for (int i = 0; i < 12; ++i) { map[20][i] = 1; } srand((unsigned)time(NULL)); roundBlock(hOut, blockA); gotoXY(hOut, 52, 2); cout << "最后一关到达了,可以开启挑战模式了,"; gotoXY(hOut, 52, 3); cout << "现在你有三个模式选择:1.挑战模式 2."; gotoXY(hOut, 52, 4); cout << "无尽模式 3.开始新的游戏 请选择:\n"; while (1) { timee(hOut); gotoXY(hOut, 52, 5); cin >> a; if (a == 1 || a == 2 || a == 3) { break; } else { gotoXY(hOut, 52, 6); cout << "此模块正在开发,请重新选择!"; Sleep(500); gotoXY(hOut, 52, 5); cout << " "; gotoXY(hOut, 52, 6); cout << " "; } } if (a == 1) { tz(hOut, fraction, checkpoint, val); print(hOut); fraction = 0; checkpoint = 1; score = 0; break; } else if (a == 2) { fraction = 0; checkpoint = 1; gotoXY(hOut, 52, 6); cout << "请选择下降速度:1.正常游戏下降速度"; gotoXY(hOut, 52, 7); cout << "(30-50) 2.特快下降速度(10-29) "; gotoXY(hOut, 52, 8); cout << "3.魔鬼级下降速度(0-9) 4.特慢下降速"; gotoXY(hOut, 52, 9); cout << "度(100-200)5.无下降速度\n"; while (1) { long long b; gotoXY(hOut, 52, 10); cin >> b; if (b == 1) { times = 50; val = 50; break; } else if (b == 2) { times = 29; val = 29; break; } else if (b == 3) { times = 9; val = 9; break; } else if (b == 4) { times = 200; val = 200; break; } else if (b == 5) { times = 2100000000; val = 2100000000; break; } else { gotoXY(hOut, 52, 11); cout << "无法定义下降速度,请重新选择!\n"; Sleep(1500); gotoXY(hOut, 52, 11); cout << " "; gotoXY(hOut, 52, 10); cout << " "; } } cout << "是否需要增加服务:1.需要 2.不需要\n"; system("cls"); print(hOut); break; } else if (a == 3) { for (int i = 1; i <= 19; i++) { gotoXY(hOut, 52, i); cout << " "; } gotoXY(hOut, 52, 4); cout << "游戏即将重置分数与关卡,回到初始将会给"; gotoXY(hOut, 52, 5); cout << "您20000分作为补偿,重新开始请按1 重新"; gotoXY(hOut, 52, 6); cout << "选择请按2"; gotoXY(hOut, 52, 7); int num; while (1) { cin >> num; if (num == 1) { fraction = 20 * 1000, checkpoint = 21; goto initial; break; } else if (num == 2) { num = 3; break; } else { gotoXY(hOut, 52, 7); cout << " "; } } } } } if (a == 1) { if (f1 != 1) { if (f == 0 || f == 1 || f == 2 || f == 3 || f == 4 || f == 5 || f == 6 || f == 7) { if ((f == 0 && checkpoint >= 51) || (f == 1 && checkpoint >= 71) || (f == 2 && checkpoint >= 91) || (f == 3 && checkpoint >= 111) || (f == 4 && checkpoint >= 141) || (f == 5 && checkpoint >= 151) || (f == 6 && checkpoint >= 201) || (f == 7 && checkpoint >= 251)) { tz(hOut, fraction, checkpoint, val); print(hOut); for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { map[i][j] = 0; } } for (int i = 0; i < 20; ++i) { map[i][0] = map[i][11] = 1; } for (int i = 0; i < 12; ++i) { map[20][i] = 1; } srand((unsigned)time(NULL)); roundBlock(hOut, blockA); printBlock(hOut, blockA, 5, 15); score = 0; } SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); gotoXY(hOut, 52, 1) ; cout << " 挑战模式 "; gotoXY(hOut, 52, 2); cout << "人机分数:" << score << " "; gotoXY(hOut, 52, 3); cout << "你的分数:" << fraction; gotoXY(hOut, 52, 4); cout << "人机关卡:" << gk; gotoXY(hOut, 52, 5); cout << "你的关卡:" << checkpoint; gotoXY(hOut, 52, 6); cout << "目前状态:"; if (fraction - score > 0) { cout << "暂时领先" << fraction - score << "分"; } else if (fraction - score < 0) { cout << "人机领先" << score - fraction << "分"; } else if (score == fraction) { cout << "分数接近,加油"; } printBlock(hOut, blockA, 5, 15); } } } SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); gotoXY(hOut, 36, 1); cout << fraction; gotoXY(hOut, 36, 2); cout << checkpoint; //******最重要的方块碰撞,对于碰撞的方块的检测****** if (check) { /*system("pause"); system("pause"); while(1){ //TODO }*/ eliminateRow(hOut, map, val, fraction, checkpoint); check = false; positionX = -3; positionY = 4; if (collisionDetection(blockA, map, positionX, positionY)) {/*对于有事是否结束的一个检测*/ for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { blockB[i][j] = blockA[i][j];//方块的更换,对于当前方块的进行更换到需要更新的方块 } } roundBlock(hOut, blockA);/*当前的方块的颜色进行打印,设置为当前的颜色*/ } else { for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { map[i][j] = 0; } } for (int i = 0; i < 20; ++i) { map[i][0] = map[i][11] = 1; } for (int i = 0; i < 12; ++i) { map[20][i] = 1; } for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { color_backups[i][j] = 0; } } for (int i = 0; i < 20; ++i) { color_backups[i][0] = color_backups[i][11] = 1; } for (int i = 0; i < 12; ++i) { color_backups[20][i] = 1; } gameOver(hOut, blockA, map);/*游戏结束的*/ goto initial;/*回到循环的地方*/ } } printBlock(hOut, blockB, positionX, positionY); if (_kbhit()) { /*未检测到输入却能继续的关键*/ /*用于非阻塞地响应键盘输入事件*/ key = _getch(); switch (key) { case '1'://内挂换方块 if (cnnt == 1) { check = true; //myRight(hOut, blockB, map, positionX, positionY); clearBlock(hOut, blockB, positionX, positionY); } break; case 72://上 myUp(hOut, blockB, map, positionX, positionY); break; case 75://左 myLeft(hOut, blockB, map, positionX, positionY); break; case 77://下 myRight(hOut, blockB, map, positionX, positionY); break; case 80://右 switch (myDown(hOut, blockB, map, positionX, positionY)) { case 0: check = false; break; case 1: backups_Block(positionX, positionY); check = true; break; case 2: for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { map[i][j] = 0; } } for (int i = 0; i < 20; ++i) { map[i][0] = map[i][11] = 1; } for (int i = 0; i < 12; ++i) { map[20][i] = 1; } for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { color_backups[i][j] = 0; } } for (int i = 0; i < 20; ++i) { color_backups[i][0] = color_backups[i][11] = 1; } for (int i = 0; i < 12; ++i) { color_backups[20][i] = 1; } gameOver(hOut, blockB, map); goto initial; default: break; } break; case 32://" " myStop(hOut, blockA, map); break; case 'R': case 'r': system("cls"); print(hOut); //print(hOut); for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { map[i][j] = 0; } } for (int i = 0; i < 20; ++i) { map[i][0] = map[i][11] = 1; } for (int i = 0; i < 12; ++i) { map[20][i] = 1; } for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { color_backups[i][j] = 0; } } for (int i = 0; i < 20; ++i) { color_backups[i][0] = color_backups[i][11] = 29; } for (int i = 0; i < 12; ++i) { color_backups[20][i] = 29; } srand((unsigned)time(NULL)); roundBlock(hOut, blockA); printBlock(hOut, blockA, 5, 15); cnt = 0; fraction = 0; checkpoint = 1; if (f >= 1 && f <= 7) { score = 0; gk = 1; cnt = 15648; break; } cnt = 0; break; case 'O': case 'o': SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); for (int i = 2; i <= 19; i++) { gotoXY(hOut, 52, i); cout << " "; } gotoXY(hOut, 52, 2); cout << " 操作方法:"; gotoXY(hOut, 56, 3); cout << " ↑:旋转 ↓:速降"; gotoXY(hOut, 56, 4); cout << " →:右移 ←:左移"; gotoXY(hOut, 56, 5); cout << " 空格键:开始/暂停"; gotoXY(hOut, 56, 6); cout << " r:重玩"; gotoXY(hOut, 56, 7); cout << " Esc 键:退出"; gotoXY(hOut, 52, 8); cout << " 祝您游戏愉快!"; y1 = 12; break; case 'V': case 'v': SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); for (int i = 1; i <= 19; i++) { gotoXY(hOut, 52, i); cout << " "; } g(hOut); y1 = 18; break; case 'q': case 'Q': y1 = 12; qk(hOut); break; case 27://"Esc" system("cls"); freopen("D:\\elsfk\\color.txt", "w", stdout); for (int i = 0; i < 21; i++) { for (int j = 0; j < 12; j++) { cout << color_backups[i][j] << " "; } cout << endl; } fclose(stdout); freopen("D:\\elsfk\\last.txt", "w", stdout); for (int i = 0; i < 21; i++) { for (int j = 0; j < 12; j++) { cout << map[i][j] << " "; } cout << endl; } fclose(stdout); //system("start D:\\elsfk\\last.txt"); //system("start D:\\elsfk\\color.txt"); exit(0); fclose(stdout); freopen("D:\\elsfk\\Users.txt", "w", stdout); cout << fraction << " " << checkpoint << " " << val << endl; fclose(stdout); break; default: break; } } Sleep(20); if (0 == --times) { switch (myDown(hOut, blockB, map, positionX, positionY)) { case 0: check = false; break; case 1: backups_Block(positionX, positionY); check = true; break; case 2: for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { map[i][j] = 0; } } for (int i = 0; i < 20; ++i) { map[i][0] = map[i][11] = 1; } for (int i = 0; i < 12; ++i) { map[20][i] = 1; } for (int i = 0; i < 20; ++i) { for (int j = 1; j < 11; ++j) { color_backups[i][j] = 0; } } for (int i = 0; i < 20; ++i) { color_backups[i][0] = color_backups[i][11] = 1; } for (int i = 0; i < 12; ++i) { color_backups[20][i] = 1; } gameOver(hOut, blockB, map); goto initial; default: break; } times = val; } if (f1 == 4) { score = 0; f1 = 2; } } cin.get(); return 0; }
到这里,本篇文章也就要结束了,在最后,给大家附上俄罗斯方块的代码链接。
俄罗斯方块的代码