static void _TetrisManager_HighlightLinesToDelete(TetrisManager* tetrisManager, int* indexes, int count){ int i; int j; int k; for (i = 0; i < LINES_TO_DELETE_HIGHTING_COUNT; i++){ FontUtil_ChangeFontColor(JADE); Sleep(LINES_TO_DELETE_HIGHTING_MILLISECOND); for (j = 0; j < count; j++){ WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex,INFINITE); // LOCK °É±â CursorUtil_GotoXY(2, indexes[j]); for (k = 0; k < BOARD_COL_SIZE - 2; k++){ printf("¢Ê"); } ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ } FontUtil_ChangeFontColor(DEFAULT_FONT_COLOR); Sleep(LINES_TO_DELETE_HIGHTING_MILLISECOND); for (j = 0; j < count; j++){ WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex,INFINITE); // LOCK °É±â CursorUtil_GotoXY(2, indexes[j]); for (k = 0; k < BOARD_COL_SIZE - 2; k++){ printf(" "); } ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ } } }
void CheckBox_Print(CheckBox* checkBox, int color){ int i; int j; Point startPositionToPrint = checkBox->startPositionToPrint; checkBox->width = checkBox->width % 2 == 1 ? checkBox->width + 1 : checkBox->width; CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); FontUtil_ChangeFontColor(WHITE); printf("¦®¦¬¦¯"); CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); printf("¦%s¦", checkBox->isChecked ? "¡î" : " "); CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); printf("¦±¦¬¦°"); startPositionToPrint.x += 7; startPositionToPrint.y -= 3; CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); for (i = 0; i < checkBox->height; i++){ CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); FontUtil_ChangeFontColor(WHITE); FontUtil_ChangeFontColor(color); printf("%s", TextItem_GetText(&checkBox->text)); for (j = 0; j < checkBox->width - TextItem_GetTotalByte(checkBox->text); j++){ printf(" "); } FontUtil_ChangeFontColor(WHITE); } }
void TextButton_Print(TextButton* textButton, int color){ int i; int j; Point startPositionToPrint = textButton->startPositionToPrint; textButton->width = textButton->width % 2 == 1 ? textButton->width + 1 : textButton->width; CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); FontUtil_ChangeFontColor(WHITE); printf("¦®"); for (i = 0; i < textButton->width / 2; i++){ printf("¦¬"); } printf("¦¯"); for (i = 0; i < textButton->height; i++){ CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); FontUtil_ChangeFontColor(WHITE); printf("¦"); FontUtil_ChangeFontColor(color); printf("%s", TextItem_GetText(&textButton->text)); for (j = 0; j < textButton->width - TextItem_GetTotalByte(textButton->text); j++){ printf(" "); } FontUtil_ChangeFontColor(WHITE); printf("¦"); } CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); printf("¦±"); for (i = 0; i < textButton->width / 2; i++){ printf("¦¬"); } printf("¦°"); }
static void _TetrisManager_PrintKeys(TetrisManager* tetrisManager, int x, int y){ WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex,INFINITE); // LOCK °É±â ScreenUtil_ClearRectangle(x, y, 26, 9); // use temp size (magic number) CursorUtil_GotoXY(x, y++); printf("¦®¦¬¦¬¦¬¦¬ Keys ¦¬¦¬¦¬¦¬¦¯"); CursorUtil_GotoXY(x, y++); printf("¦¡ç ¦move left ¦"); CursorUtil_GotoXY(x, y++); printf("¦¡æ ¦move right ¦"); CursorUtil_GotoXY(x, y++); printf("¦¡é ¦move down ¦"); CursorUtil_GotoXY(x, y++); printf("¦¡è ¦rotate ¦"); CursorUtil_GotoXY(x, y++); printf("¦SpaceBar ¦direct down¦"); CursorUtil_GotoXY(x, y++); printf("¦ESC ¦pause ¦"); CursorUtil_GotoXY(x, y++); printf("¦L (l) ¦hold ¦"); CursorUtil_GotoXY(x, y++); printf("¦±¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦°"); ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ }
//// ¾È°³ ¾ÆÀÌÅÛ ÇÔ¼ö Á¤ÀÇ void splash(TetrisManager* tetrisManager, int blockType, int isSplash) { int i, j; ////ÇöÀç splash(¾È°³ ¾ÆÀÌÅÛ) ÀÛµ¿ ½Ã '¢Æ'(¾È°³) Ç¥½Ã if (isSplash == 1) { if (tetrisManager->isSplashMode == 1) { WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex, INFINITE); // LOCK °É±â for (i = 1; i < BOARD_ROW_SIZE - 1; i++) { for (j = 1; j < BOARD_COL_SIZE - 1; j++) { if (tetrisManager->board[i][j] == FIXED_BLOCK) //// fixed blockÀ» ±âÁØÀ¸·Î °¡·Î,¼¼·Î ±æÀÌ Å½»ö { for (j = 1; j < BOARD_COL_SIZE - 1; j++) { CursorUtil_GotoXY(2 * j, i);; printf("¢Æ"); //// Ž»öÇÑ ±æÀÌ ¸¸Å Ãâ·Â } } } } ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ } } ////splash°¡ ³¡³µÀ» ¶§ ¿ø»óº¹±¸ else { if (tetrisManager->isSplashMode == 0) { for (i = 1; i < BOARD_ROW_SIZE - 1; i++) { for (j = 1; j < BOARD_COL_SIZE - 1; j++) { if (tetrisManager->board[i][j] == FIXED_BLOCK) //// fixed blockÀ» ±âÁØÀ¸·Î °¡·Î,¼¼·Î ±æÀÌ Å½»ö { WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex, INFINITE); // LOCK °É±â CursorUtil_GotoXY(2 * j, i);; printf("¢Ì"); //// Ž»öÇÑ ±æÀÌ ¸¸Å Ãâ·Â ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ } else if (tetrisManager->board[i][j] == EMPTY) //// ºó °ø°£À» ±âÁØÀ¸·Î °¡·Î,¼¼·Î ±æÀÌ Å½»ö { WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex, INFINITE); // LOCK °É±â CursorUtil_GotoXY(2 * j, i);; printf(" "); //// Ž»öÇÑ ±æÀÌ ¸¸Å Ãâ·Â ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ } } } tetrisManager->isSplashMode = 1; } } }
static void _TetrisManager_PrintItemInventory(TetrisManager* tetrisManager, int list, int index, int x, int y){ //ÇϳªÀÇ ±âº» Àκ¥Å丮 WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex, INFINITE); // LOCK °É±â ScreenUtil_ClearRectangle(x, y, 9, 9); //¾ÆÀÌÅÛ Àκ¥Å丮 »ý¼º CursorUtil_GotoXY(x, y++); printf("¦® 0%d ¦¯", list); CursorUtil_GotoXY(x, y++); printf("¦ %c%c%c¦", itemList[index][0], itemList[index][1], itemList[index][2]); CursorUtil_GotoXY(x, y++); printf("¦±¦¬¦¬¦°"); ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ }
static void _TetrisManager_PrintStatus(TetrisManager* tetrisManager, int x, int y){ WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex,INFINITE); // LOCK °É±â ScreenUtil_ClearRectangle(x + 2, y + 1, 4, 1); // use temp size (magic number) ScreenUtil_ClearRectangle(x + 13, y + 1, 6, 1); // use temp size (magic number) ScreenUtil_ClearRectangle(x + 26, y + 1, 12, 1); // use temp size (magic number) CursorUtil_GotoXY(x, y++); printf("¦® Lv ¦¯ ¦® Line ¦¯ ¦® TotalScore ¦¯"); CursorUtil_GotoXY(x, y++); printf("¦%3d ¦ ¦%4d ¦ ¦%7d ¦", tetrisManager->speedLevel, tetrisManager->deletedLineCount, tetrisManager->score); CursorUtil_GotoXY(x, y++); printf("¦±¦¬¦¬¦° ¦±¦¬¦¬¦¬¦° ¦±¦¬¦¬¦¬¦¬¦¬¦¬¦°"); ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ }
void TetrisManager_PrintChangeNextCount(TetrisManager tetrisManager){ // use temp size (magic number) int x = 38; int y = 20; WaitForSingleObject(tetrisManager.mutex,INFINITE); // LOCK °É±â CursorUtil_GotoXY(x, y++); printf("¦® Change ¦¯"); CursorUtil_GotoXY(x, y++); printf("¦ %02d ¦", tetrisManager.changeNextCount); CursorUtil_GotoXY(x, y++); printf("¦±¦¬¦¬¦¬¦¬¦°"); ReleaseMutex(tetrisManager.mutex); // LOCK ÇØÁ¦ }
static void _TetrisManager_PrintBlock(TetrisManager* tetrisManager, int blockType, int status){ int i; Block block = _TetrisManager_GetBlockByType(tetrisManager, blockType); WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex,INFINITE); // LOCK °É±â switch (blockType){ case MOVING_BLOCK: FontUtil_ChangeFontColor(tetrisManager->block.color); break; case FIXED_BLOCK: FontUtil_ChangeFontColor(WHITE); break; case SHADOW_BLOCK: changeShadowColor(tetrisManager->speedLevel); // ·¹º§º°·Î ±×¸²ÀÚ »öÀ» ´Ù¸£°Ô Ãâ·ÂÇÏ´Â ÇÔ¼ö break; } for (i = 0; i < POSITIONS_SIZE; i++){ int x = Block_GetPositions(block)[i].x; int y = Block_GetPositions(block)[i].y; CursorUtil_GotoXY(2 * y, x); printf("%s", boardTypesToPrint[status]); } FontUtil_ChangeFontColor(DEFAULT_FONT_COLOR); ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ _TetrisManager_PrintTotalTime(*tetrisManager); // because of multi thread problem, this function covers total time }
void TetrisManager_PrintBoard(TetrisManager* tetrisManager){ int i; int j; int x = 0; int y = 0; for (i = 0; i < BOARD_ROW_SIZE; i++){ WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex,INFINITE); //LOCK °É±â(´Ù¸¥ ºÎºÐ¿¡¼ Ä¿¼ÀÇ »ö»óÀ» º¯°æÇÏ´Â °ÍÀ» ¸·±âÀ§ÇØ ÀӰ豸¿ªÀ¸·Î º¸È£) CursorUtil_GotoXY(x, y++); for (j = 0; j < BOARD_COL_SIZE; j++){ switch (tetrisManager->board[i][j]){ case LEFT_TOP_EDGE: case RIGHT_TOP_EDGE: case LEFT_BOTTOM_EDGE: case RIGHT_BOTTOM_EDGE: case LEFT_WALL: case RIGHT_WALL: case TOP_WALL: case BOTTOM_WALL: case EMPTY: FontUtil_ChangeFontColor(DEFAULT_FONT_COLOR); break; case MOVING_BLOCK: FontUtil_ChangeFontColor(tetrisManager->block.color); break; case FIXED_BLOCK: FontUtil_ChangeFontColor(WHITE); break; case SHADOW_BLOCK: changeShadowColor(tetrisManager->speedLevel); // ·¹º§º°·Î ±×¸²ÀÚ »öÀ» ´Ù¸£°Ô Ãâ·ÂÇÏ´Â ÇÔ¼ö break; } printf("%s", boardTypesToPrint[tetrisManager->board[i][j]]); FontUtil_ChangeFontColor(DEFAULT_FONT_COLOR); //¸Å°³º¯¼ö·Î color ¸¦ ¹Þ¾Æ¼ ÇØ´ç color ·Î Ãâ·Â Ä¿¼ÀÇ »ö»óÀ» º¯°æÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. //SetConsoleTextAttribute ÇÔ¼ö¸¦ È£ÃâÇÏ¸é¼ ¸Å°³º¯¼ö·Î º¯°æÇÒ »ö»ó Á¤¼ö°ªÀ» ³Ñ°Ü Ãâ·Â Ä¿¼ÀÇ »ö»óÀ» º¯°æÇÕ´Ï´Ù. } ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ } }
static void _TetrisManager_PrintTotalTime(TetrisManager tetrisManager){ int hour = tetrisManager.totalTime / (60 * 60); int minute = tetrisManager.totalTime % (60 * 60) / 60; int second = tetrisManager.totalTime % 60; // use temp size (magic number) int x = 50; int y = 20; WaitForSingleObject(tetrisManager.mutex,INFINITE); // LOCK °É±â CursorUtil_GotoXY(x, y++); printf("¦® time ¦¯"); CursorUtil_GotoXY(x, y++); printf("¦%02d:%02d:%02d¦", hour, minute, second); CursorUtil_GotoXY(x, y++); printf("¦±¦¬¦¬¦¬¦¬¦°"); ReleaseMutex(tetrisManager.mutex); // LOCK ÇØÁ¦ }
void VerticalMenu_Print(VerticalMenu* verticalMenu){ int i; Point startPositionToPrint = verticalMenu->startPositionToPrint; CursorUtil_Hide(); for (i = 0; i < verticalMenu->count; i++){ CursorUtil_GotoXY(startPositionToPrint.x, startPositionToPrint.y++); if (i == verticalMenu->selectedIndex){ FontUtil_ChangeFontColor(WHITE_INVERSION); } else{ FontUtil_ChangeFontColor(WHITE); } printf("%s", verticalMenu->items[i]); } FontUtil_ChangeFontColor(WHITE); }
static void TetrisManager_Item_ProcessBLOCK(TetrisManager* tetrisManager, int blockType, int number){ //¾ÆÀÌÅÛÀ» ÅëÇØ ºí·Ï Á¦°Å ÈÄ shadowºí·ÏÀ̳ª movingºí·ÏÀÇ À§Ä¡¸¦ Àç¼³Á¤ÇØÁØ´Ù. int i; Block block = _TetrisManager_GetBlockByType(tetrisManager, blockType); for (i = 0; i < POSITIONS_SIZE; i++){ int x = Block_GetPositions(block)[i].x; int y = Block_GetPositions(block)[i].y; WaitForSingleObject(((TetrisManager*)tetrisManager)->mutex,INFINITE); // LOCK °É±â CursorUtil_GotoXY(2*y, (x+number)); if((x+number)!=BOARD_ROW_SIZE - 1){ printf("%s", boardTypesToPrint[(int)EMPTY]); } ReleaseMutex(((TetrisManager*)tetrisManager)->mutex); // LOCK ÇØÁ¦ } FontUtil_ChangeFontColor(DEFAULT_FONT_COLOR); _TetrisManager_PrintTotalTime(*tetrisManager); // because of multi thread problem, this function covers total time }