void Game::draw() const { drawEnvironment(this); drawGameField(false); sgoBall.drawGameBall(); switch (mGameState) { case STATE_MENU: break; case STATE_COUNTDOWN: glPushMatrix(); { const Vector3 x = rotateVector(Vector3(1.0f, 0.0f, 0.0f)); const Vector3 y = rotateVector(Vector3(0.0f, 1.0f, 0.0f)); const Vector3 z = rotateVector(Vector3(0.0f, 0.0f, 1.0f)); const Vector3& pos = sgoBall.pos(); Matrix m; m[0][0] = x.x; m[0][1] = x.y; m[0][2] = x.z; m[0][3] = 0.0f; m[1][0] = y.x; m[1][1] = y.y; m[1][2] = y.z; m[1][3] = 0.0f; m[2][0] = z.x; m[2][1] = z.y; m[2][2] = z.z; m[2][3] = 0.0f; m[3][0] = pos.x; m[3][1] = pos.y; m[3][2] = pos.z; m[3][3] = 1.0f; glMultMatrixf((GLfloat*) m); drawRingStrip(100, mCounter / COUNTDOWN_TIME, mTextureRing); } glPopMatrix(); break; default: break; } }
void try_to_make_move_ai(int player) { lock_gameField(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (gameField[i][j] == EMPTY && previous_player_move != player) { previous_player_move = player; gameField[i][j] = player; // ставим в массиве нолик drawGameField(i, j); // отрисовываем интерфейс заново unlock_gameField(); return; } } } is_finished_game = winGame(gamePlay(gameField)); unlock_gameField(); }
int try_to_make_move(int rowField, int colField, int player) { lock_gameField(); if (gameField[rowField][colField] == EMPTY && previous_player_move != player) { previous_player_move = player; gameField[rowField][colField] = player; // ставим в массиве нолик drawGameField(rowField, colField); // отрисовываем интерфейс заново // проверяем на выигрышную ситуацию (другой клиент проерит в своей потоке) is_finished_game = winGame(gamePlay(gameField)); } else if (gameField[rowField][colField] != EMPTY){ mi_writeMessage("This place is taken!"); } else if (previous_player_move == player) { mi_writeMessage("CROSS move!"); } unlock_gameField(); return 0; }
// main single player game routine int single_game_session() { int key; int chPlayer = ZERO; pthread_t ai_player; int rowField = 0; int colField = 0; char msgChat[250] = ""; int len; // Draw main part of interface mi_drawMainInterface(); drawGameField(0, 0); // Save terminal settings, change mode, hide cursor rk_mytermsave(); rk_mytermregime(0, 0, 1, 0, 1); mt_setcursor(0); // Setup color palete mt_setbgcolor(clBlack); mt_setfgcolor(clGreen); int unused; pthread_create(&ai_player, 0, ctlAiInteraction, (void*)&unused); int whoWin; char msgSign[250]; if (chPlayer == 1) { mi_writeMessage("You are playing ZEROS"); } else if (chPlayer == 2) { mi_writeMessage("You are playing CROSSES"); } while (is_finished_game == 0 && rk_readkey(&key) == 0 && key != K_ESC) { switch (key) { case K_R: // not supproted break; case K_T: // not supproted break; case K_UP: if (rowField != 0) { rowField--; drawGameField(rowField, colField); } break; case K_DOWN: if (rowField < 2) { rowField++; drawGameField(rowField, colField); } break; case K_LEFT: if (colField != 0) { colField--; drawGameField(rowField, colField); } break; case K_RIGHT: if (colField < 2) { colField++; drawGameField(rowField, colField); } break; case K_ENTER: break; case K_F5: // place ZERO try_to_make_move(rowField, colField, chPlayer); break; case K_F6: // place CROSS try_to_make_move(rowField, colField, chPlayer); break; } } pthread_cancel(ai_player); rk_mytermrestore(); mt_setcursor(1); mt_setstdcolor(); mt_gotoXY(39, 1); return 0; }
void Game::drawBallReflection() const { drawEnvironment(this); drawGameField(true); }
void Game::drawWaterReflection() const { drawGameField(false); sgoBall.drawGameBall(); }