⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cube.cpp

📁 简单的windows api编程实现的俄罗斯方块 希望对初学visual c的您有帮助 高手就不用看了
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -