需求分析

首先对做俄罗斯方块的几个模块做分析

  1. 界面搭建
     游戏欢迎界面
     游戏主窗口
     游戏规则界面
     键盘说明界面
     游戏结束界面
  2. 方块设置
     7种基本方块
     随机产生下落方块
     方块的形状变化
     下落速度
     方块颜色随方向改变而变化
  3. 积分规则
     每消除一行,积分增加100
     每积累1000分,提升一个等级
  4. 排行榜
     查看排行榜
     游戏结束后输入昵称,查看排名
  5. 更改主页面背景颜色
  6. 添加背景音乐
#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <conio.h>#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")/*******宏定义*******/
//游戏窗口左上角的X轴坐标
#define FrameX 13
//游戏窗口左上角的Y轴坐标
#define FrameY 3
//游戏窗口的高度
#define Frame_height  20
//游戏窗口的宽度
#define Frame_width 18
//文件
#define N 100/*******全局变量 *******/
//temp,temp1,temp2用于记住和转换方块变量的值
int i,j,Temp,Temp1,Temp2;
//标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案
int a[80][80]={0};
//标记4个"口"方块:1表示有方块,0表示无方块
int b[4];
//文件位置
char * file_place="C:\\Users\\12399\\Desktop\\charts.txt";
//声明俄罗斯方块的结构体
struct Tetris
{int x;             //中心方块的x轴坐标int y;           //中心方块的y轴坐标int flag;        //标记方块类型的序号int next;        //下一个俄罗斯方块类型的序号int speed;       //俄罗斯方块移动的速度int number;     //产生俄罗斯方块的个数int score;      //游戏的分数int level;       //游戏的等级
};
//控制台句柄
HANDLE hOut;/*******函数声明*******/
//设置目标位置
void gotoXY(int x, int y);
//游戏界面
void DrawGameFrame();
//随机产生方块类型的序号
void Flag(struct Tetris *);
//制作俄罗斯方块
void MakeTetris(struct Tetris *);
//打印俄罗斯方块
void PrintTetris(struct Tetris *);
//清除方块轨迹
void CleanTetris(struct Tetris *);
//判断是否能移动,返回值为1->能移动
int ifMove(struct Tetris *);
//判断是否满行,并删除满行的俄罗斯方块
void Del_FullLine(struct Tetris *);
//开始游戏
void Gameplay();
//游戏规则
void regulation();
//按键说明
void explain();
//欢迎界面
void welcome();
//重新开始游戏
void Replay(struct Tetris *);
//关闭游戏
void close();
//设置文字颜色
int color(int c);
//更改主界面背景颜色
void change();
//写入排名
void intoFile();
//显示排名
void outFile();//背景音乐
void music();
//设置目标位置
void gotoXY(int x,int y){COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}
//设置文字颜色
int color(int c){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);return 0;
}
//主界面
void welcome() {int n;//Tcolor(15);gotoXY(20, 5);printf("■■■■");color(9);gotoXY(20, 6);printf("■■");color(11);gotoXY(24, 6);printf("■■");color(9);gotoXY(22, 7);printf("■");color(11);gotoXY(24, 7);printf("■");color(9);gotoXY(22, 8);printf("■");color(11);gotoXY(24, 8);printf("■");color(15);gotoXY(22, 9);printf("■■");color(15);gotoXY(22, 10);printf("■■");//Ecolor(14);gotoXY(31, 5);printf("■■■");color(14);gotoXY(31, 6);printf("■");color(15);gotoXY(33, 6);printf("■");color(15);gotoXY(31, 7);printf("■■■");color(15);gotoXY(31, 8);printf("■■");color(15);gotoXY(31, 9);printf("■");color(10);gotoXY(33, 9);printf("■");color(15);gotoXY(31, 10);printf("■");color(10);gotoXY(33, 10);printf("■■■");//Tcolor(15);gotoXY(40, 5);printf("■■■■");color(5);gotoXY(40, 6);printf("■■");color(13);gotoXY(44, 6);printf("■■");color(5);gotoXY(42, 7);printf("■");color(13);gotoXY(44, 7);printf("■");color(5);gotoXY(42, 8);printf("■");color(13);gotoXY(44, 8);printf("■");color(15);gotoXY(42, 9);printf("■■");color(15);gotoXY(42, 10);printf("■■");//Rcolor(2);gotoXY(52, 5);printf("■");color(1);gotoXY(54, 5);printf("■■■");color(2);gotoXY(52, 6);printf("■");color(1);gotoXY(58, 6);printf("■");color(1);gotoXY(52, 7);printf("■■");color(2);gotoXY(56, 7);printf("■■");color(1);gotoXY(52, 8);printf("■");color(2);gotoXY(54, 8);printf("■");color(1);gotoXY(52, 9);printf("■");color(2);gotoXY(56, 9);printf("■");color(1);gotoXY(52, 10);printf("■");color(2);gotoXY(58, 10);printf("■");//icolor(15);gotoXY(64, 5);printf("■■");color(15);gotoXY(64, 6);printf("■■");color(13);gotoXY(64, 8);printf("■");color(11);gotoXY(66, 8);printf("■");color(13);gotoXY(64, 9);printf("■");color(11);gotoXY(66, 9);printf("■");color(13);gotoXY(64, 10);printf("■");color(11);gotoXY(66, 10);printf("■");//Scolor(5);gotoXY(74, 5);printf("■■■");color(15);gotoXY(72, 6);printf("■");color(5);gotoXY(74, 6);printf("■");color(15);gotoXY(72, 7);printf("■■■");color(15);gotoXY(72, 8);printf("■■■");color(5);gotoXY(74, 9);printf("■");color(15);gotoXY(76, 9);printf("■");color(5);gotoXY(70, 10);printf("■■■");color(12);gotoXY(45, 12);printf("WELCOME");//花gotoXY(84,21);color(12);printf("(_)");    //红花上边花瓣gotoXY(82,22);printf("(_)");      //红花左边花瓣gotoXY(86,22);printf("(_)");      //红花右边花瓣gotoXY(84,23);printf("(_)");      //红花下边花瓣gotoXY(85,22);      //红花花蕊color(6);printf("@");gotoXY(90,20);color(13);printf("(_)");      //粉花左边花瓣gotoXY(94,20);printf("(_)");      //粉花右边花瓣gotoXY(92,19);printf("(_)");      //粉花上边花瓣gotoXY(92,21);printf("(_)");      //粉花下边花瓣gotoXY(93,20);color(6);printf("@");gotoXY(89,22);printf("|");gotoXY(90,21);printf("/");gotoXY(88,23);printf("\\|");gotoXY(88,24);printf("`|/");gotoXY(88,25);printf("\\|");gotoXY(89,26);printf("| /");gotoXY(89,27);printf("|");gotoXY(85,27);color(10);printf("\\\\\\\\");      //草地gotoXY(91,27);printf("//");gotoXY(85,28);//18color(2);printf("^^^^^^^^");gotoXY(84,14);color(9);printf("西南大学");gotoXY(84,16);color(11);printf("陈铷、陈旺旺");int i,j = 1;color(14);                   //黄色边框for (i = 13; i <=28 ; i++)     //输出上下边框==={for (j = 21; j <= 79; j++)  //输出左右边框||{gotoXY(j, i);if (i == 13 || i == 28) printf("—");else if (j == 21 || j == 79) printf("|");}}color(11);gotoXY(30, 16);printf("1.开始游戏");gotoXY(56, 16);printf("2.键盘说明");gotoXY(30, 20);printf("3.规则说明");gotoXY(56, 20);printf("4.查看排名\n");gotoXY(30, 24);printf("5.更改主界面背景颜色\n");gotoXY(56, 24);printf("6.退出游戏\n");color(236);gotoXY(42,26);printf("请选择 1 2 3 4 5 6:");music();color(15);scanf("%d", &n);switch (n) {case 1:system("cls");DrawGameFrame();Gameplay();break;case 2:explain();break;case 3:regulation();break;case 4:outFile();getch();system("cls");welcome();break;case 5:change();break;case 6:close();break;}
}
//方块
void MakeTetris(struct Tetris *tetris) {a[tetris->x][tetris->y] = b[0];switch (tetris->flag){case 1:         /*田字方块 ■ ■■ ■  */{color(9);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(10);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(11);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:         /*T字方块  ■ ■ ■■  */{color(12);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(13);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(14);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(1);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(2);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(3);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(4);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(5);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(6);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(9);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(11);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(10);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(14);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(5);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;}}
}
//游戏界面
void DrawGameFrame() {gotoXY(FrameX + Frame_width - 7, FrameY - 2);color(11);printf("俄 罗 斯 方 块");gotoXY(FrameX + 2 * Frame_width + 13, FrameY + 7);color(3);printf("下一个方块:");gotoXY(FrameX + 2 * Frame_width + 3, FrameY + 7);color(2);printf("**********");gotoXY(FrameX + 2 * Frame_width + 3, FrameY + 13);color(2);printf("**********");gotoXY(FrameX + 2 * Frame_width + 3, FrameY + 14);color(14);printf("↑:旋转方块");gotoXY(FrameX + 2 * Frame_width + 3, FrameY + 16);printf("space:暂停/继续");gotoXY(FrameX + 2 * Frame_width + 3, FrameY + 18);printf("↓:加速下落");gotoXY(FrameX + 2 * Frame_width + 3, FrameY + 20);printf("Esc :退出");gotoXY(FrameX, FrameY);color(12);printf("╔");gotoXY(FrameX + 2 * Frame_width - 2, FrameY);printf("╔");gotoXY(FrameX, FrameY + Frame_height);printf("╚");gotoXY(FrameX + 2 * Frame_width - 2, FrameY + Frame_height);printf("╝");a[FrameX][FrameY + Frame_height] = 2;a[FrameX + 2 * Frame_width - 2][FrameY + Frame_height] = 2;for (i = 2; i < 2 * Frame_width - 2; i += 2) {gotoXY(FrameX + i, FrameY);printf("—");}for (i = 2; i < 2 * Frame_width - 2; i += 2) {gotoXY(FrameX + i, FrameY + Frame_height);printf("—");a[FrameX + i][FrameY + Frame_height] = 2;}for (i = 1; i < Frame_height; i++) {gotoXY(FrameX, FrameY + i);printf("|");a[FrameX][FrameY + i] = 2;}for (i = 1; i < Frame_height; i++) {gotoXY(FrameX + 2 * Frame_width - 2, FrameY + i);printf("|");a[FrameX + 2 * Frame_width - 2][FrameY + i] = 2;}
}
//游戏内容
void Gameplay() {int n;struct Tetris t, *tetris = &t;char ch;tetris->number = 0;tetris->speed = 300;tetris->score = 0;tetris->level = 1;while (1){Flag(tetris);Temp = tetris->flag;tetris->x = FrameX + 2 * Frame_width + 6;tetris->y = FrameY + 10;tetris->flag = tetris->next;PrintTetris(tetris);tetris->x = FrameX + Frame_width;tetris->y = FrameY - 1;tetris->flag = Temp;while (1){label:PrintTetris(tetris);Sleep(tetris->speed);CleanTetris(tetris);Temp1 = tetris->x;Temp2 = tetris->flag;if (kbhit()){ch = getch();if (ch == 75)                                //按 ←键则向左动,中心横坐标减2{tetris->x -= 2;}if (ch == 77)                                //按 →键则向右动,中心横坐标加2{tetris->x += 2;}if (ch == 80)                                //按 ↓键则加速下落{if (ifMove(tetris) != 0) {tetris->y += 2;}if (ifMove(tetris) == 0) {tetris->y = FrameY + Frame_height - 2;}}if (ch == 72)                            //按 ↑键则变体,即当前方块顺时针转90度{if (tetris->flag >= 2 && tetris->flag <= 3) {tetris->flag++;tetris->flag %= 2;tetris->flag += 2;}if (tetris->flag >= 4 && tetris->flag <= 7) {tetris->flag++;tetris->flag %= 4;tetris->flag += 4;}if (tetris->flag >= 8 && tetris->flag <= 11) {tetris->flag++;tetris->flag %= 4;tetris->flag += 8;}if (tetris->flag >= 12 && tetris->flag <= 15) {tetris->flag++;tetris->flag %= 4;tetris->flag += 12;}if (tetris->flag >= 16 && tetris->flag <= 19) {tetris->flag++;tetris->flag %= 4;tetris->flag += 16;}}if (ch == 32){PrintTetris(tetris);while (1) {if (kbhit())            //再按空格键,继续游戏{ch = getch();if (ch == 32) {goto label;}}}}if (ch == 27) {system("cls");memset(a, 0, 6400 * sizeof(int));       //初始化BOX数组welcome();}if (ifMove(tetris) == 0)            //如果不可动,上面操作无效{tetris->x = Temp1;tetris->flag = Temp2;} else                            //如果可动,执行操作{goto label;}}tetris->y++;                        //如果没有操作指令,方块向下移动if (ifMove(tetris) == 0)                //如果向下移动且不可动,方块放在此处{tetris->y--;PrintTetris(tetris);Del_FullLine(tetris);break;}}for (i = tetris->y - 2; i < tetris->y + 2; i++)    //游戏结束条件:方块触到框顶位置{if (i == FrameY) {system("cls");gotoXY(29, 7);printf("   \n");color(12);printf("\t\t\t■■■■   ■     ■   ■■     \n");printf("\t\t\t■         ■■   ■   ■  ■   \n");printf("\t\t\t■■■     ■  ■ ■   ■   ■  \n");printf("\t\t\t■         ■   ■■   ■  ■   \n");printf("\t\t\t■■■■   ■     ■   ■■     \n");gotoXY(30, 16);color(11);printf("1.再玩一次");gotoXY(30, 18);printf("2.查看排名并退出游戏\n");int n;color(236);gotoXY(32, 20);printf("请选择1 2:");color(11);scanf("%d", &n);switch (n) {case 1:system("cls");Replay(tetris);break;case 2:system("cls");FILE *fp;char name[20];char soc[20];if( (fp=fopen(file_place, "at+")) == NULL ){puts("Fail to open file!");exit(0);} else{printf("请输入昵称:");scanf("%s",name);fputs(name,fp);fputs("\t",fp);printf("请输入分数:");scanf("%s",soc);fputs(soc,fp);fputs("\n",fp);}fclose(fp);outFile();getch();close();exit(0);break;}}}tetris->flag = tetris->next;            //清除下一个俄罗斯方块的图形(右边窗口)tetris->x = FrameX + 2 * Frame_width + 6;tetris->y = FrameY + 10;CleanTetris(tetris);}
}
//退出
void close() {exit(0);
}
//键盘说明
void explain() {int i, j = 1;system("cls");color(13);gotoXY(32, 3);printf("键盘说明");color(2);for (i = 6; i <= 16; i++)   //输出上下边框{for (j = 15; j <= 60; j++)  //输出左右边框{gotoXY(j, i);if (i == 6 || i == 16) printf("—");else if (j == 15 || j == 59) printf("|");}}color(3);gotoXY(18, 7);printf("← →:左右移动方块");color(10);gotoXY(18, 9);printf("↑:旋转方块");color(14);gotoXY(18, 11);printf("↓:加速方块下落");color(11);gotoXY(18, 13);printf("space: 暂停游戏/继续游戏");color(4);gotoXY(18, 15);printf("ESC:退出游戏");getch();system("cls");welcome();
}
//规则说明
void regulation(){int i, j = 1;system("cls");color(13);gotoXY(34, 3);printf("游戏规则");color(2);for (i = 6; i <= 18; i++)   //输出上下边框==={for (j = 12; j <= 70; j++)  //输出左右边框||{gotoXY(j, i);if (i == 6 || i == 18) printf("—");else if (j == 12 || j == 69) printf("|");}}color(12);gotoXY(16, 7);printf("tip1: 不同形状的小方块从屏幕上方落下,玩家通过调整");gotoXY(22, 9);printf("方块的位置和方向,使它们在屏幕底部拼出完整的");gotoXY(22, 11);printf("一行或几行");color(14);gotoXY(16, 13);printf("tip2: 每消除一行,积分增加100");color(11);gotoXY(16, 15);printf("tip3: 每累计1000分,会提升一个等级");color(10);gotoXY(16, 17);printf("tip4: 提升等级会使方块下落速度加快,游戏难度加大");getch();system("cls");welcome();
}
//更改主界面背景颜色
void change(){system("cls");color(206);gotoXY(34, 3);printf("更改成功");getch();                //按任意键返回主界面system("cls");welcome();
}
//再玩一次
void Replay(struct Tetris *) {system("cls");                    //清屏memset(a, 0, 6400 * sizeof(int));       //初始化BOX数组,否则不会正常显示方块,导致游戏直接结束DrawGameFrame();        //制作游戏窗口Gameplay();            //开始游戏
}
//显示方块
void PrintTetris(struct Tetris *tetris) {for (i = 0; i < 4; i++) {b[i] = 1;                        //数组b[4]的每个元素的值都为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("等级: ");color(12);printf(" %d", tetris->level);gotoXY(FrameX + 2 * Frame_width + 3, FrameY + 3);color(4);printf("分数: ");color(12);printf(" %d", tetris->score);gotoXY(FrameX + 2 * Frame_width + 3, FrameY + 5);color(4);printf("速度: ");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)) ||//或为直线方块且除中心方块位置外,其他"■"字方块位置上无图案时,返回值为1,即可移动(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 + 2][tetris->y] == 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 Flag(struct Tetris *tetris) {tetris->number++;                    //记住产生方块的个数srand(time(NULL));        //初始化随机数if (tetris->number == 1) {tetris->flag = rand() % 19 + 1;    //记住第一个方块的序号}tetris->next = rand() % 19 + 1;        //记住下一个方块的序号
}
//清除方块的轨迹
void CleanTetris(struct Tetris *tetris) {for (i = 0; i < 4; i++) {b[i] = 0;         //数组b[4]的每个元素的值都为0}MakeTetris(tetris);      //制作俄罗斯方块for (i = tetris->x - 2; i <= tetris->x + 4; i += 2)       //■ X ■ ■  X为中心方块{for (j = tetris->y - 2; j <= tetris->y + 1; j++)        /* ■■X■ */{if (a[i][j] == 0 && j > FrameY) {gotoXY(i, j);printf("  ");    //清除方块}}}
}
//满行消除并积分
void Del_FullLine(struct Tetris *tetris){int sor;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("  ");
//                          Sleep(1);}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++; //记录删除方块的行数}}}}tetris->score += 100 * del_rows; //每删除一行,得100分if (del_rows > 0 && (tetris->score % 1000 == 0 ||tetris->score / 1000 > tetris->level - 1)) {        //如果得1000分即累计删除10行,速度加快20ms并升一级tetris->speed -= 20;tetris->level++;sor = tetris->level;}
}
//输出
void outFile(){system("cls");gotoXY(0,5);color(78);printf("排 行 榜\n");color(14);FILE *fp;char str[N+1];if( (fp=fopen(file_place,"rt")) == NULL){puts("Fail to open file!");exit(0);}while(fgets(str, N, fp) != NULL){printf("%s", str);}fclose(fp);
}
//背景音乐
void music(){//这里的music.mp3需要放在文件debug中mciSendString("open music.mp3 alias bkmusic", NULL, 0, NULL);mciSendString("play bkmusic repeat", NULL, 0, NULL);
}int main() {welcome();}

c语言用控制台写——俄罗斯方块相关推荐

  1. 从零开始---控制台用c写俄罗斯方块游戏(1)

    从零开始---控制台用c写俄罗斯方块游戏(1) 很少写博文,一来自身知识有限,二来自己知道,已经有很多这样的博文了,三就是因为懒,文笔也一般,四来刚出来工作,时间也不多 之所以写这篇博文,是因为应群里 ...

  2. c语言俄罗斯方块视频,c语言自己写俄罗斯方块(完整版)

    还记得大笨兔以前在博客发的几篇关于如何使用C语言写俄罗斯方块游戏的文章吗? 当时大笨兔已经将基本的逻辑写完了,但还有两个功能没有加进去:游戏结束和游戏暂停. 所以这次大笨兔抽空就将这两个功能加进去了. ...

  3. c语言大作业俄罗斯方块,C语言自己写俄罗斯方块(完整版)

    还记得大笨兔以前在博客发的几篇关于如何使用C语言写俄罗斯方块游戏的文章吗? 当时大笨兔已经将基本的逻辑写完了,但还有两个功能没有加进去:游戏结束和游戏暂停. 所以这次大笨兔抽空就将这两个功能加进去了. ...

  4. 用C语言写俄罗斯方块

    用C语言写俄罗斯方块 目录(需求): 1.  屏幕作图与窗口实现: 2.  方块的构造与产生: 3.  方块的移动与翻转: 4.  中断计时与方块自由下落: 5.  判断方块碰撞与消行: 6.  按键 ...

  5. C语言获取左键鼠标点击的次数,c语言在控制台判定鼠标左键的小例子

    c语言在控制台判定鼠标左键的小例子 复制代码 代码如下: // temp1.cpp : Defines the entry point for the console application. // ...

  6. C语言变换控制台颜色

    C语言变换控制台颜色 我们都知道用C语言写的程序打开的控制台颜色默认为黑底白字,看的多了确实感觉乏味,那么可以改变颜色么?其实是可以的,有两种方法可以改变控制台颜色,一种是用 system() 调用 ...

  7. 2016年,C语言该怎样写

    C语言的首要原则是--能不写C语言就不写.如果一定要写,请遵守现代规则. C语言诞生于20世纪70年代初.人们在其发展的各个阶段都在"学习C语言",但在学习C语言之后,知识往往停滞 ...

  8. c语言每次堆的变化是1k,DSPXC语言+程序烧写讲述.ppt

    DSPXC语言程序烧写讲述 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ...

  9. Java基础:如何向控制台写输出

    控制台输出由前面描述过的print( ) 和 println( )来完成最为简单,它们被用在本书的大多数例题中. 这两种方法由PrintStream(System.out引用的对象类型)定义.尽管Sy ...

  10. 易语言如何调用c dll文件,易语言调用C++写的DLL

    直接调用会弹出堆栈错误的信息,原因是VS默认是__cdcel方式,而易语言是__stdcall,所以调用约定不一致导致堆栈错误. 解决方案很简单,易语言声明DLL函数时"在库中对应命令名&q ...

最新文章

  1. html实现旅游网站代码_[资源推荐] 必须收藏的两个查找论文和代码实现的网站!...
  2. 没有上下文的java类_java – 这个上下文中没有任何一个超级类
  3. vim学习手册-10后序
  4. Gmuplolader1.0正式上线,欢迎试用!!!
  5. 重磅干货免费下载!阿里云RDS团队论文被数据库顶会SIGMOD 2018收录
  6. 杀鸡儆猴!苹果撤销Facebook的iOS企业证书
  7. Https下字体文件无法加载的解决方案
  8. 图论算法——无向图的深度优先搜索和广度优先搜索
  9. OpenCore引导配置说明0.6.9版-基于OpenCore-0.6.9-05-04正式版
  10. 计算机网络与基础第五章答案,第五章 计算机网络基础
  11. 幸福三月丨盐城北大青鸟女神节快乐!
  12. 哪些食物能保护眼睛?
  13. 宜搭产品生态伙伴政策——宜搭:高效的低代码应用构建平台
  14. 学习笔记25马氏链模型
  15. 使用virt-install创建虚拟机
  16. Linux中使用grep -v grep 查找不含有 grep 字段的行
  17. 基于单片机交通灯控制的c语言程序设计,基于单片机控制的交通灯毕业设计
  18. python利用pyinstaller打包文件
  19. 从Internet时间服务器获取标准时间
  20. MessageBox ShowNumber 之类的迷案

热门文章

  1. fractional max pooling 和 multi-sample dropout
  2. 罗格斯大学电子与计算机工程,罗格斯大学电子和计算机工程理学硕士研究生申请要求及申请材料要求清单...
  3. 学习笔记-God-Linux
  4. 百度搜索下拉框及百度相关搜索中刷关键字方法
  5. TCP合法RST报文
  6. 技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-1.工具和本地环境
  7. 多合一音乐搜索器项目源码分享,支持播放,下载
  8. Puppet erb模板介绍(三十二)
  9. windows 磁盘被写保护怎么办
  10. 工业大数据特征有哪些 大数据工程师来告诉你