📄 cube.cpp
字号:
#include "allHeader.h"
//---------------------------------------------------------------------------------
void cube::initCube(bool status[HIGHT + 2][WIDTH + 2])
{
srand(time(NULL));
creatCube(status);
creatCube(status);
}
//---------------------------------------------------------------------------------
void cube ::moveToLeft(bool status[HIGHT + 2][WIDTH + 2])
{
point *pointPt;
for (pointPt = head;pointPt != NULL;pointPt = pointPt->next)
{
if (status[pointPt->y][pointPt->x - 1] != 0 )
{
return;
}
}
for (pointPt = head;pointPt != NULL;pointPt = pointPt->next)
{
pointPt->x--;
}
}
//---------------------------------------------------------------------------------
void cube:: moveToRight(bool status[HIGHT + 2][WIDTH + 2])
{
point *pointPt;
for (pointPt = head;pointPt != NULL;pointPt = pointPt->next)
{
if (status[pointPt->y][pointPt->x + 1] != 0 )
{
return;
}
}
for (pointPt = head;pointPt != NULL;pointPt = pointPt->next)
{
pointPt->x++;
}
}
//---------------------------------------------------------------------------------
bool cube:: drop(bool status[HIGHT + 2][WIDTH + 2], int &score)
{
bool bottom = false;
point *pointPt;
while (bottom == false){
for (pointPt = head;pointPt != NULL;pointPt = pointPt->next){
if (status[pointPt->y + 1][pointPt->x] != 0 ){
bottom = true;
}
}
if (bottom == false){
for (pointPt = head;pointPt != NULL;pointPt = pointPt->next){
pointPt->y++;
}
}
}
return fixup(status, score);
}
//---------------------------------------------------------------------------------
bool cube::down(bool status[HIGHT + 2][WIDTH + 2], int &score)
{
bool bottom = false;
point *pointPt;
for (pointPt = head;pointPt != NULL;){
if (status[pointPt->y + 1][pointPt->x] != false ){
bottom = true;
}
pointPt = pointPt->next;
}
if (bottom == false){
for (pointPt = head;pointPt != NULL;pointPt = pointPt->next){
pointPt->y++;
}
}
else{
return fixup(status, score);
}
return true;
}
//---------------------------------------------------------------------------------
bool cube::fixup(bool status[HIGHT + 2][WIDTH + 2], int &score)
{
count i,j,m;
point *pointPt, *pointPt2;
bool full;
int number = 0;
for (pointPt = head; pointPt != NULL; ){
status[pointPt->y][pointPt->x] = 1;
pointPt2 = pointPt;
pointPt = pointPt->next;
free(pointPt2);
}
for (i = 1; i <= HIGHT; i++){
full = true;
for (j = 1 ; j <= WIDTH; j++){
if (status[i][j] == 0){
full = false;
}
}
if (full == true){
number++;
score+=100 * number;
for (m = i; m > 1; --m ){
for (j = 1; j <= WIDTH; j++){
status[m][j] = status[m-1][j];
}
}
for (j = 1; j <= WIDTH; j++){
status[1][j] = 0;
}
}
}
head = NULL;
if (!loss(status))
{
creatCube(status);
return true;
}
return false;
}
//---------------------------------------------------------------------------------
void cube::creatCube(bool status[HIGHT + 2][WIDTH + 2])
{
point *pointPt1, *pointPt2;
shape = nextshape;
head = nextHead;
nextshape = rand() % 7;
direction = 0;
switch (nextshape)
{
case 0:
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 -1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2 = pointPt1;
nextHead = pointPt2;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 2;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
break;
case 1:
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2 = pointPt1;
nextHead = pointPt2;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
break;
case 2:
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 - 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2 = pointPt1;
nextHead = pointPt2;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
break;
case 3:
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2 = pointPt1;
nextHead = pointPt2;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 - 1;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
break;
case 4:
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 - 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2 = pointPt1;
nextHead = pointPt2;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
break;
case 5:
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2 = pointPt1;
nextHead = pointPt2;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 - 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 - 1;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
break;
case 6:
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 - 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2 = pointPt1;
nextHead = pointPt2;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*)malloc(sizeof(point));
pointPt1->x = WIDTH / 2 + 1;
pointPt1->y = 1;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
pointPt1 = (point*) malloc(sizeof(point));
pointPt1->x = WIDTH / 2;
pointPt1->y = 2;
pointPt1->next = NULL;
pointPt2->next = pointPt1;
pointPt2 = pointPt1;
break;
}
}
//---------------------------------------------------------------------------------
bool cube::loss(bool status[HIGHT + 2][WIDTH + 2])
{
bool lost = false;
point *pointPt = nextHead;
while (pointPt){
if (status[pointPt->y][pointPt->x] == 1){
lost = true;
}
pointPt = pointPt->next;
}
return lost;
}
//---------------------------------------------------------------------------------
void cube::change(bool status[HIGHT + 2][WIDTH + 2])
{
count i;
bool test;
point *pointPt;
switch (shape){
case 0:
if (direction == 0){
pointPt = head->next;
if (pointPt->y == HIGHT){
break;
}
for (test = true, i = -1; i <= 2 ; ++i){
if (status[pointPt->y + i][pointPt->x] == 1){
test = false;
}
}
if (test == true){
pointPt = head;
pointPt->x++;
pointPt->y--;
pointPt = pointPt->next;
pointPt = pointPt->next;
pointPt->x--;
pointPt->y++;
pointPt = pointPt->next;
pointPt->x -= 2;
pointPt->y += 2;
direction = 1;
}
}
else{
pointPt = head->next;
if (pointPt->x == WIDTH){
break;
}
for (test = true, i = -1; i <= 2 ; ++i){
if (status[pointPt->y][pointPt->x + i] == 1){
test = false;
}
}
if (test == true){
pointPt = head;
pointPt->x--;
pointPt->y++;
pointPt = pointPt->next;
pointPt = pointPt->next;
pointPt->x++;
pointPt->y--;
pointPt = pointPt->next;
pointPt->x += 2;
pointPt->y -= 2;
direction = 0;
}
}
break;
case 2:
if (direction == 0){
test = true;
pointPt = head;
if (status[pointPt->y][pointPt->x + 2] == true ){
test = false;
}
else if (status[pointPt->y + 2][pointPt->x + 1] == true){
test = false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -