Untitled
unknown
plain_text
2 years ago
17 kB
10
Indexable
- Car.h
#pragma once
#include "Map.h"
class Car {
public:
Car();
void MoveLeft(Map* pmap);
void MoveRight(Map* pmap);
void DisplayCar(Map* pmap);
bool Collision(Map* pmap);
int _carPosition; /*= SCREEN_WIDTH / 2;*/
char _car[4][4];
};
- Common.h
#pragma once
#include <iostream>
#include <conio.h>
#include <dos.h>
#include <Windows.h>
#include <time.h>
void GoToXY(SHORT posX, SHORT posY);
void SetWindowSize(SHORT width, SHORT height); // Thay đổi màn hình cửa sổ window
void SetScreenBufferSize(SHORT width, SHORT height); // Thay đổi kích thước màn hình buffer
void DisableResizeWindow(); // Vô hiệu hóa nút thay đổi kích thước màn hình
void DisableCtrButton(bool Close, bool Min, bool Max); // Vô hiệu hóa các nút Minimize, Maximize và Close
void ShowScrollbar(BOOL Show); // Ẩn hiện thanh cuộn
void VietNamText(); // Hiện tiếng việt
void SetColor(int backgound_color, int text_color); // Chỉnh màu chữ + nền nơi có chữ (= highlight) trên console
void SetTitle(); // Cài Title của console = "Racing Game 2D"
void ShowCur(bool CursorVisibility); // Ẩn hiện con trỏ trên console
COORD GetLargestConsoleWindowSize(); // Lấy kích thước tối đa của màn hình console
void MaximizeConsoleWindow(); // Tự động phóng to màn hình console
void DefaultMap(); // Giao diện bắt đầu game
void Mode1();
void Mode2();
void Guide1();
void Guide2();
-Enemy.h
#pragma once
#include "Map.h"
class Enemy {
public:
Enemy();
void DisplayEnemy(Map* pmap, int index);
void EnemyGoDown(Map* pmap, int index);
void EnemyGeneretion(int index);
void EraseEnemy(Map* pmap, int index);
int _enemyAlive[3];
int _enemyPosition[3][2]; // (x, y)
char _enemy[4][4];
};
- Game.h
#pragma once
#include "Map.h"
#include "Car.h"
#include "Enemy.h"
#include "Common.h"
class Game {
public:
Game();
void GameOver(Map* pmap);
void Mode1();
void Mode2();
int _gameOver;
};
- Map.h
#pragma once
//#include "Enemy.h"
#include "Common.h"
using namespace std;
//COORD maxSize = GetLargestConsoleWindowSize();
#define SCREEN_WIDTH 174
#define SCREEN_HEIGHT 43
class Map {
public:
Map();
~Map();
void DisplayMap();
void DisplayScore();
int _speed;
int _score;
char** _map;
};
- Car.cpp
#pragma once
#include "Car.h"
Car::Car() {
for (int i = 0; i < 4; i++){
for (int j = 0; j < 4; j++){
if ((i == 0 || i == 2) && (j == 0 || j == 3)){
_car[i][j] = ' ';
}
else {
_car[i][j] = '�';
}
}
}
_carPosition = SCREEN_WIDTH / 2;
}
void Car::DisplayCar(Map* pmap) {
SetColor(0, 4);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
GoToXY(j + _carPosition, i + SCREEN_HEIGHT - 4);
cout << _car[i][j];
pmap->_map[i + SCREEN_HEIGHT - 4][j + _carPosition] = _car[i][j];
}
}
SetColor(0, 7);
}
void Car::MoveLeft(Map* pmap) {
if (_carPosition >= 59) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
GoToXY(j + _carPosition, i + SCREEN_HEIGHT - 4);
pmap->_map[i + SCREEN_HEIGHT - 4][j + _carPosition] = ' ';
cout << ' ';
}
}
_carPosition = _carPosition - 4;
DisplayCar(pmap);
}
}
void Car::MoveRight(Map* pmap) {
if (_carPosition < SCREEN_WIDTH - 61) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
GoToXY(j + _carPosition, i + SCREEN_HEIGHT - 4);
pmap->_map[i + SCREEN_HEIGHT - 4][j + _carPosition] = ' ';
cout << ' ';
}
}
_carPosition = _carPosition + 4;
DisplayCar(pmap);
}
}
bool Car::Collision(Map* pmap) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (pmap->_map[SCREEN_HEIGHT - 4 + j][_carPosition + i] == '*') {
return 1;
}
}
}
return 0;
}
- Common.cpp
#include "Common.h"
using namespace std;
void SetWindowSize(SHORT width, SHORT height){
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT WindowSize;
WindowSize.Top = 0;
WindowSize.Left = 0;
WindowSize.Right = width;
WindowSize.Bottom = height;
SetConsoleWindowInfo(hStdout, 1, &WindowSize);
}
void SetScreenBufferSize(SHORT width, SHORT height){
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD NewSize;
NewSize.X = width;
NewSize.Y = height;
SetConsoleScreenBufferSize(hStdout, NewSize);
}
void DisableResizeWindow(){
HWND hWnd = GetConsoleWindow();
SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_SIZEBOX);
}
void DisableCtrButton(bool Close, bool Min, bool Max){
HWND hWnd = GetConsoleWindow();
HMENU hMenu = GetSystemMenu(hWnd, false);
if (Close == 1)
{
DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
}
if (Min == 1)
{
DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND);
}
if (Max == 1)
{
DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND);
}
}
void ShowScrollbar(BOOL Show){
HWND hWnd = GetConsoleWindow();
ShowScrollBar(hWnd, SB_BOTH, Show);
}
COORD GetLargestConsoleWindowSize() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD maxSize = GetLargestConsoleWindowSize(hConsole);
return maxSize;
}
void MaximizeConsoleWindow() {
HWND console = GetConsoleWindow();
ShowWindow(console, SW_MAXIMIZE);
}
void ShowCur(bool CursorVisibility){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO ConCurInf;
ConCurInf.dwSize = 1;
ConCurInf.bVisible = CursorVisibility;
SetConsoleCursorInfo(handle, &ConCurInf);
}
void VietNamText(){
SetConsoleOutputCP(65001);
}
void SetColor(int backgound_color, int text_color) {
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
int color_code = backgound_color * 16 + text_color;
SetConsoleTextAttribute(hStdout, color_code);
}
void SetTitle() {
SetConsoleTitle("Racing Game 2D");
}
void GoToXY(SHORT posX, SHORT posY) {
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD Position;
Position.X = posX;
Position.Y = posY;
SetConsoleCursorPosition(hStdout, Position);
}
void DefaultMap() {
system("cls");
GoToXY(70, 15 + 1);
std::cout << "Racing Game 2D";
GoToXY(70, 15 + 2);
std::cout << "----------------";
GoToXY(70, 15 + 3);
std::cout << "Chose the mode game";
GoToXY(70, 15 + 4);
std::cout << "1. 1 Player";
GoToXY(70, 15 + 5);
std::cout << "2. 2 Player";
GoToXY(70, 15 + 6);
std::cout << "----------------";
GoToXY(70, 15 + 7);
std::cout << "Press 1-key or 2-key to chose the mode game: ";
}
void Guide1() {
system("cls");
GoToXY(70, 15);
cout << "Guide for 1 Player";
GoToXY(70, 15 + 1);
cout << "----------------";
GoToXY(70, 15 + 2);
cout << "Avoid Enemies by moving left or right. ";
GoToXY(70, 15 + 3);
cout << "Press 'a' or 'A' to move left";
GoToXY(70, 15 + 4);
cout << "Press 'd' or 'D' to move right";
GoToXY(70, 15 + 5);
cout << "Press 'w' or 'W' to speed up";
GoToXY(70, 15 + 6);
cout << "Press 's' or 'S' to speed down";
GoToXY(70, 15 + 7);
cout << "Press 'escape' to exit";
GoToXY(70, 15 + 8);
cout << "Press any key to play game";
_getch();
system("cls");
}
void Guide2() {
system("cls");
GoToXY(70, 15);
cout << "Guide for 2 Players";
GoToXY(30, 15 + 1);
cout << "----------------";
GoToXY(30, 15 + 2);
cout << "Avoid Enemies by moving left or right. ";
GoToXY(30, 15 + 3);
cout << "----------------";
GoToXY(30, 15 + 4);
cout << "Player 1 \t\t\t\t\t\t\t Player 2";
GoToXY(30, 15 + 5);
cout << "Press 'a' or 'A' to move left \t Press Left arrow key to move left";
GoToXY(30, 15 + 6);
cout << "Press 'd' or 'D' to move right \t Press Right arrow key to move right";
GoToXY(30, 15 + 7);
cout << "Press 'w' or 'W' to speed up \t Press Up arrow key to speed up";
GoToXY(30, 15 + 8);
cout << "Press 's' or 'S' to speed down \t Press Down arrow key to speed down";
GoToXY(30, 15 + 9);
cout << "Press 'escape' to exit";
GoToXY(30, 15 + 10);
cout << "Press any key to go back to menu";
_getch();
DefaultMap();
}
- Enemy.cpp
#pragma once
#include <ctime>
#include <cstdlib>
#include "Enemy.h"
Enemy::Enemy(){
//_enemyAlive = new int[3];
for (int i = 0; i < 3; i++){
_enemyAlive[i] = 0;
}
for (int i = 0; i < 3; i++){
//_enemyPosition = new int*[2];
for (int j = 0; j < 2; j++){
//_enemyPosition[j] = new int;
_enemyPosition[i][j] = 0;
}
}
//_enemyPosition[3][2] = { {0, 0}, {0, 0}, {0, 0} }; // (x, y)
for (int i = 0; i < 4; i++){
//_enemyPosition = new int*[4];
for (int j = 0; j < 4; j++){
//_enemyPosition[j] = new int;
if ((i == 0 || i == 2) && (j == 0 || j == 3)){
_enemy[i][j] = ' ';
}
else {
_enemy[i][j] = '*';
}
}
}
//_enemy[4][4] = { ' ','*','*',' ',
// '*','*','*','*',
// ' ','*','*',' ',
// '*','*','*','*' };
}
void Enemy::EnemyGeneretion(int index) {
if (_enemyAlive[index] == 0) {
//srand((int)time(nullptr));
_enemyPosition[index][0] = 55 + rand() % (SCREEN_WIDTH - 1 - 55 - 59);
_enemyPosition[index][1] = 0;
_enemyAlive[index] = 1;
}
}
void Enemy::EraseEnemy(Map* pmap, int index) {
if (_enemyAlive[index] == 1) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
GoToXY(j + _enemyPosition[index][0], i + _enemyPosition[index][1]);
cout << ' ';
pmap->_map[i + _enemyPosition[index][1]][j + _enemyPosition[index][0]] = ' ';
}
}
}
}
void Enemy::DisplayEnemy(Map* pmap, int index) {
SetColor(0, 13);
if (_enemyAlive[index] == 1) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
GoToXY(j + _enemyPosition[index][0], i + _enemyPosition[index][1]);
cout << _enemy[i][j];
pmap->_map[i + _enemyPosition[index][1]][j + _enemyPosition[index][0]] = _enemy[i][j];
}
}
}
SetColor(0, 7);
}
void Enemy::EnemyGoDown(Map* pmap, int index) {
if (_enemyAlive[index] == 1) {
EraseEnemy(pmap, index);
_enemyPosition[index][1]++;
DisplayEnemy(pmap, index);
}
}
- Game.cpp
#include "Game.h"
Game::Game(){
_gameOver = 0;
}
void Game::GameOver(Map* pmap) {
GoToXY(SCREEN_WIDTH / 2 - 16, SCREEN_HEIGHT / 2 - 1);
cout << " Game Over ";
GoToXY(SCREEN_WIDTH / 2 - 16, SCREEN_HEIGHT / 2 - 0);
cout << " Your score is " << pmap->_score << " ";
GoToXY(SCREEN_WIDTH / 2 - 16, SCREEN_HEIGHT / 2 + 2);
cout << "Press any key to go back to menu";
for (int i = SCREEN_WIDTH / 2 - 16; i <= SCREEN_WIDTH / 2 + 16; i++) {
for (int j = SCREEN_HEIGHT / 2 - 2; j <= SCREEN_HEIGHT / 2 + 1; j++) {
if (i == SCREEN_WIDTH / 2 - 16 || i == SCREEN_WIDTH / 2 + 16) {
GoToXY(i, j);
cout << '|';
}
if (j == SCREEN_HEIGHT / 2 - 2 || j == SCREEN_HEIGHT / 2 + 1) {
GoToXY(i, j);
cout << '-';
}
}
}
while (!_kbhit()) {
SetColor(0, 7);
GoToXY(SCREEN_WIDTH / 2 - 16, SCREEN_HEIGHT / 2 + 2);
cout << "Press any key to go back to menu";
Sleep(500);
SetColor(0, 6);
GoToXY(SCREEN_WIDTH / 2 - 16, SCREEN_HEIGHT / 2 + 2);
cout << "Press any key to go back to menu";
Sleep(500);
SetColor(0, 7);
}
}
void Game::Mode1() {
Guide1();
Map* pmap = new Map();
pmap->DisplayMap();
pmap->DisplayScore();
Car* car = new Car;
car->DisplayCar(pmap);
Enemy* enemy = new Enemy();
enemy->EnemyGeneretion(0);
enemy->DisplayEnemy(pmap, 0);
clock_t startTime = clock();
clock_t currentTime;
double duration;
while (1) {
// Mỗi 5 giây thì tăng tốc thêm 10 đơn vị vận tốc
currentTime = clock();
duration = (currentTime - startTime) / CLOCKS_PER_SEC;
if (duration >= 5 && duration < 6) {
if (pmap->_speed > 10) {
pmap->_speed = pmap->_speed - 10;
}
startTime = currentTime;
duration = 0;
}
// Di chuyển car và kiểm tra xem có va chạm không
if (_kbhit()) {
char ch = _getch();
if (ch == 'a' || ch == 'A') {
car->MoveLeft(pmap);
}
if (ch == 'd' || ch == 'D') {
car->MoveRight(pmap);
}
if (ch == 'w' || ch == 'W') {
if (pmap->_speed > 100) {
pmap->_speed = pmap->_speed - 100;
}
}
if (ch == 's' || ch == 'S') {
pmap->_speed = pmap->_speed + 100;
}
if (ch == 27) {
_gameOver = 1;
}
}
for (int i = 0; i < 3; i++) {
if (car->Collision(pmap) == 1) {
_gameOver = 1;
//return;
}
}
// Sinh thêm kẻ địch mới
if (enemy->_enemyPosition[2][1] == 15 && enemy->_enemyAlive[0] == 0) {
enemy->EnemyGeneretion(0);
enemy->DisplayEnemy(pmap, 0);
}
if (enemy->_enemyPosition[0][1] == 15 && enemy->_enemyAlive[1] == 0) {
enemy->EnemyGeneretion(1);
enemy->DisplayEnemy(pmap, 1);
}
if (enemy->_enemyPosition[1][1] == 15 && enemy->_enemyAlive[2] == 0) {
enemy->EnemyGeneretion(2);
enemy->DisplayEnemy(pmap, 2);
}
Sleep(pmap->_speed);
// Xử lý vấn đề tăng điểm
for (int i = 0; i < 3; i++) {
if (enemy->_enemyPosition[i][1] == SCREEN_HEIGHT - 4) {
enemy->EraseEnemy(pmap, i);
if (enemy->_enemyAlive[i] == 1) {
pmap->_score++;
}
pmap->DisplayScore();
enemy->_enemyAlive[i] = 0;
}
enemy->EnemyGoDown(pmap, i);
}
if (_gameOver == 1) {
GameOver(pmap);
return;
}
}
}
void Game::Mode2() {
}
- Main.cpp
#pragma once
#include "Game.h"
//#include "Map.h"
//#include "Car.h"
//#include "Enemy.h"
//#include "Common.h"
//#include <iostream>
//#include <conio.h>
//#include <dos.h>
//#include <Windows.h>
//#include <ctime>
using namespace std;
//COORD maxSize = GetLargestConsoleWindowSize();
int main() {
MaximizeConsoleWindow(); //Tự động phóng to màn hình console
//SetWindowSize(maxSize.X, maxSize.Y); // Thay đổi màn hình cửa sổ window
//SetScreenBufferSize(maxSize.X, maxSize.Y); // Thay đổi kích thước màn hình buffer
DisableResizeWindow(); // Vô hiệu hóa nút thay đổi kích thước màn hình
DisableCtrButton(0, 1, 1); // Vô hiệu hóa các nút Minimize, Maximize và Close
ShowScrollbar(0); // Ẩn hiện thanh cuộn
//VietNamText(); // Hiện tiếng việt
//SetColor(int backgound_color, int text_color); // Chỉnh màu chữ + nền nơi có chữ (= highlight) trên console
SetTitle(); // Cài Title của console = "Racing Game 2D"
ShowCur(0); // Ẩn hiện con trỏ trên console
char ch;
do {
DefaultMap();
ch = _getch();
if (ch == '1') {
cout << 1;
Sleep(100);
system("cls");
Game* game = new Game;
game->Mode1();
}
else if (ch == '2') {
cout << 2;
Sleep(100);
system("cls");
Game* game = new Game;
game->Mode2();
}
} while (ch != '1' || ch != '2');
return 0;
}
- Map.cpp
#pragma once
#include "Map.h"
Map::Map() {
_speed = 50;
_score = 0;
_map = new char* [SCREEN_HEIGHT];
for (int i = 0; i < SCREEN_HEIGHT; i++) {
_map[i] = new char[SCREEN_WIDTH];
}
}
//Map::~Map() {
// for (int i = 0; i < SCREEN_HEIGHT; i++) {
// delete[] _map[i];
// }
// delete[] _map;
//}
void Map::DisplayMap() {
SetColor(0, 10);
for (int x = 50; x < SCREEN_WIDTH - 50; x++) {
for (int y = 0; y < SCREEN_HEIGHT ; y++) {
if (x < 55 || x >= SCREEN_WIDTH - 55) {
_map[y][x] = '$';
GoToXY(x, y);
cout << '$';
}
}
}
SetColor(0, 7);
}
void Map::DisplayScore() {
GoToXY(SCREEN_WIDTH - 30, 15);
cout << "Score: " << _score;
}
Editor is loading...