0415 --- Doing only one thing at a time, and do well

前言

看了卡耐基的《人性的优点》

人生就像沙漏,一次只能漏一粒沙子。

我们每个人能做的事情有限,每次只能做一件事,把它做好,就是胜利。

我把这样的哲学应用到编程里

下午的时候,SetConsolePosition 一直不能正常工作,让我心烦意乱。

这里光标并没有正常回到左上角,而是出现在不该出现的地方,强迫症犯了,难受的一比。

void update_screen() {
	//每次光标回到左上角
	//SetConsoleCursorPosition(hdl, zero);
	for (size_t i = 0; i < HEIGHT; i++)
	{
		printf("<|");
		for (size_t j = 0; j < WIDTH; j++) {
			if (AIR == map[i][j]) {
				printf(". ");
			}
			else {
				printf("■ ");
			}
		}
		printf("|>\n");
	}
	printf("<---------------------->\n");
	
}

我想了想, 不再追求完美,放弃重新渲染,我就以bug的形式存在吧,把问题变得简单一点。一次只做一件事,把它做好!

于是就有了下面的:

虽然画面渲染出了点问题,我戏称“写了一堆bug”

但是我仍然为自己写出来的小代码,而骄傲不已。

#include <stdio.h>

#include <Windows.h>
#include <conio.h>
#include <time.h>

#define WIDTH 10
#define HEIGHT 25
#define TICK 1000

typedef enum ELEMENT {
	AIR,
	BLOCK,
	MOVING
}ELEMENT;

typedef enum SHAPE_TYPE {
	O_SHAPE=0, J_SHAPE, L_SHAPE, T_SHAPE, I_SHAPE, S_SHAPE, Z_SHAPE, MAX_SHAPE
}SHAPE_TYPE;

char map[HEIGHT][WIDTH];

HANDLE hdl;
char key;
ULONG last, now;
COORD faller[4];
COORD zero = { 0,0 };
SHAPE_TYPE now_shape;
short shapes[MAX_SHAPE][8] = {
	{4,3,5,3,4,4,5,4},
	{4,4,5,4,6,4,4,3},
	{5,4,4,4,3,4,5,3},
	{5,4,4,4,6,4,5,3},
	{4,4,5,4,3,4,6,4},
	{4,3,5,3,4,2,5,4},
	{4,3,5,3,4,2,4,4}
};

void generate();
void update_screen();
int try_move_down();
void clear_row();

int main() {
	//初始化
	hdl = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cci = { 1,0 };
	SetConsoleCursorInfo(hdl, &cci);
	SetConsoleTitle(L"TETRIS!!!");

	//随机数
	srand((unsigned)time(NULL));

	//地图
	memset(map, 0, WIDTH * HEIGHT * sizeof(char));

	//计时开始
	last = GetTickCount64();

	//生成第一个方块
	generate();
	update_screen();
	while (1) {
		
		//自然下落
		now = GetTickCount64();
		if (now > last) {
			last += TICK;
			if (0 == try_move_down()) {
				for (size_t i = 0; i < 4; i++)
				{
					map[faller[i].Y][faller[i].X] = BLOCK;
				}
				clear_row();
				generate();
			}
			update_screen();
		}
		
		
		//按键检测
		while (_kbhit()) {
			key = _getch();
			switch (key)
			{
			default:
				break;
			}
		}
	}

	return 0;
}


void generate() {
	now_shape = (SHAPE_TYPE)(rand() % MAX_SHAPE);
	memcpy(faller, shapes+ now_shape,8*sizeof(faller));
	for (size_t i = 0; i < 4; i++)
	{
		map[faller[i].Y][faller[i].X] = MOVING;
	}
}
void update_screen() {
	//每次光标回到左上角
	//SetConsoleCursorPosition(hdl, zero);
	for (size_t i = 0; i < HEIGHT; i++)
	{
		printf("<|");
		for (size_t j = 0; j < WIDTH; j++) {
			if (AIR == map[i][j]) {
				printf(". ");
			}
			else {
				printf("■ ");
			}
		}
		printf("|>\n");
	}
	printf("<---------------------->\n");
	
}
int try_move_down() {
	for (size_t i = 0; i < 4; i++)
	{
		if (faller[i].Y >= HEIGHT || BLOCK == map[faller[i].Y + 1][faller[i].X]) {
			return 0;
		}
	}
	for (size_t i = 0; i < 4; i++)
	{
		map[faller[i].Y][faller[i].X] = AIR;
		faller[i].Y++;
		map[faller[i].Y][faller[i].X] = MOVING;
	}
	return 1;
}
void clear_row() {

}
posted @ 2025-04-15 23:03  lucky_doog  阅读(27)  评论(0)    收藏  举报