#include <windows.h> //1、这行是用用来干嘛的?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、有什么意思在里面?、
#include <stdio.h> //1、这行是用用来干嘛的?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、有什么意思在里面?、
#include <time.h> //1、这行是用用来干嘛的?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、有什么意思在里面?、
#include <conio.h> //1、这行是用用来干嘛的?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、有什么意思在里面?、
#include <stdlib.h> //1、这行是用用来干嘛的?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、有什么意思在里面?、
/**
* 俄罗斯方块结构体
*/
//1、这段是用用来干嘛的?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、具体是如何运行的?、
struct Tetris {
int _pool[16][32]; //
int(*pool)[32]; // 指向_pool的指针数组
int tmap[8][4][16]; //
int x; // X坐标
int y; // Y坐标
int s; //
int st; //
int t; //
};
// 定义输出字符串 1、运用到了什么算法(或类型)?、
char gcText[] = " #######";
// 定义俄罗斯方块程序对象 1、运用到了什么算法(或类型)?、
struct Tetris tetris;
// 声明所有方法 1、有没有关联(和其他代码)?2、运用到了什么算法(或类型)?、3、具体是如何运行的?、
void runInit();
int process(int box[], int x, int y, int c);
int runScene();
int main() {
// 初始化随机数生成器 1、有没有关联(和其他代码)?2、运用到了什么算法(或类型)?、
srand((unsigned)time(NULL));
// 初始化界面、并运行俄罗斯方块场景 1、有没有关联(和其他代码)?2、运用到了什么算法(或类型)?、
for (runInit(); runScene(); );
return 0;
}
/**
* 初始化方法
*/
void runInit() {
// 初始化俄罗斯方块的七个标准方块 1、这一段有没有关联(和其他代码)?2、运用到了什么算法(或类型)?、3、具体是如何运行的?、
int box[8][4] = {
{ 15,4369,15,4369 },
{ 23,785,116,547 },
{ 71,275,113,802 },
{ 39,305,114,562 },
{ 54,561,54,561 },
{ 99,306,99,306 },
{ 51,51,51,51 },
{ -1 }
};
int i; //1、这一大段表示什么意思?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、具体是如何运行的?、
int j;
int k;
tetris.pool = &tetris._pool[4];
for (j = 0; j < 7; ++j) {
for (i = 0; i < 4; ++i) {
for (k = 0; k < 16; ++k) {
tetris.tmap[j + 1][i][k] = (box[j][i] & 1) * (j + 1);
box[j][i] >>= 1;
}
}
}
// 将_pool数组里的元素全部置为-1 1、有没有关联(和其他代码)?2、运用到了什么算法(或类型)?、3、具体是如何运行的?、
memset(tetris._pool, -1, sizeof(tetris._pool));
for (i = 0; i < 10; ++i) {
memset(&tetris.pool[i], 0, sizeof(int[21]));
}
return;
}
/**
* 方块处理方法:c为0,判断左移、右移、变换形态等操作是否可执行;c为1,方块位置确定,添入已堆积方块中;
*/
int process(int box[], int x, int y, int c) { //1、这一大段1、这一大段表示什么意思?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、具体是如何运行的?、
int i;
int cx;
int cy;
for (i = 0; i < 16; ++i) {
if (box[i]) {
cx = x + (i & 3);
cy = y + (i >> 2);
if (tetris.pool[cx][cy]) {
if (c == 2) {
tetris.pool[cx][cy] = 0;
}
else {
return 0;
}
}
// 方块位置固定,将方块添入已堆积方块
if (c == 1) {
tetris.pool[cx][cy] = box[i];
}
}
}
return 1;
}
/**
* 场景运行 //1、这一段表示什么意思?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、具体是如何运行的?、
*/
int runScene() {
int x = 0;
int y = 0;
COORD pos = { 0 };
tetris.s = rand() % 7 + 1;
tetris.t = 0;
tetris.st = tetris.t;
tetris.x = 3;
tetris.y = 0;
// 方块定时下降,,每下降一次休眠1毫米 1、运用到了什么算法(或类型)
for (--tetris.t; ; Sleep(1), --tetris.t) {
int k = 0;
// 监听键盘按键 1、运用到了什么算法(或类型)
while (_kbhit()) {
// 获取按键值 1、运用到了什么算法(或类型)
k = _getch();
if (k == 27) return 0;
if (k == 'A' || k == 'a') {
// 左移,X坐标值减1,如果方块已到最左边,则不执行左移 1、运用到了什么算法(或类型)
if (process(tetris.tmap[tetris.s][tetris.st], tetris.x - 1, tetris.y, 0)) {
--tetris.x;
}
}
else if (k == 'D' || k == 'd') {
// 右移,X坐标值加1,如果方块已到最右边,则不执行右移 1、运用到了什么算法(或类型)
if (process(tetris.tmap[tetris.s][tetris.st], tetris.x + 1, tetris.y, 0)) {
++tetris.x;
}
}
else if (k == 'W' || k == 'w') {
// 变换形态,如果方块变形后超出左右边边界,或与已堆积方块重叠,则不执行变形操作 1、运用到了什么算法(或类型)
if (process(tetris.tmap[tetris.s][(tetris.st + 1) % 4], tetris.x, tetris.y, 0)) {
tetris.st = (tetris.st + 1) % 4;
}
}
}
// 方块下降或者加速下降 1、运用到了什么算法(或类型)
if (k == 'S' || k == 's' || tetris.t < 0) {
// 下降,如果方块下降后不与已堆积方块重叠,则下降;否则,执行消行逻辑判断 1、运用到了什么算法(或类型)
if (process(tetris.tmap[tetris.s][tetris.st], tetris.x, tetris.y + 1, 0)) {
++tetris.y;
tetris.t = 50;
}
else {
// 方块位置确定,添入已堆积方块中 1、运用到了什么算法(或类型)
process(tetris.tmap[tetris.s][tetris.st], tetris.x, tetris.y, 1);
// 消行判断 1、运用到了什么算法(或类型)、2、具体是怎么运行的?、
for (--y; y > 0; --y) {
for (x = 0; tetris.pool[x][y] > 0; ++x);
if (tetris.pool[x][y] < 0) {
for (k = y++; k > 0; --k) {
for (x = 0; tetris.pool[x][0] >= 0; ++x) {
tetris.pool[x][k] = tetris.pool[x][k - 1];
}
}
}
}
return 1;
}
}
// 方块位置确定,添入已堆积方块中 1、运用到了什么算法(或类型)、
process(tetris.tmap[tetris.s][tetris.st], tetris.x, tetris.y, 1);
// 重新设置光标的位置 1、运用到了什么算法(或类型)、
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
// 地图打印 1、运用到了什么算法(或类型)、2、具体是怎么运行的?、
for (y = 1; tetris.pool[0][y] >= 0; ++y, putchar(10)) {
for (x = 0; tetris.pool[x][0] >= 0; ++x) {
putchar(gcText[tetris.pool[x][y]]);
}
}
process(tetris.tmap[tetris.s][tetris.st], tetris.x, tetris.y, 2);//1、这行是用用来干嘛的?、2、有没有关联(和其他代码)?3、运用到了什么算法(或类型)?、4、有什么意思在里面?、
}
}
rookie2maven
相关分类