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() {
}

浙公网安备 33010602011771号