Code:
#define NOGDI
#include <my_consoleopps.h>
#include <iostream>
class PLAYERS {
public :
PLAYERS() { Create(); };
~PLAYERS() {};
WORD Movement();
private :
COORD current_position;
HANDLE hIn,
hOut;
SMALL_RECT screen_size;
DWORD NumRead,
NumWritten;
INPUT_RECORD InRec;
bool invalid_move;
void MovePlayer(COORD&);
void Message();
WORD GetCode();
void Create();
};
WORD PLAYERS::Movement() {
char ch;
COORD new_position = current_position;
WORD direction = GetCode();
if (InRec.Event.KeyEvent.bKeyDown) {
if (invalid_move) {
invalid_move = false;
Message();
}
switch (direction) {
case VK_NUMPAD8 : // Move north
new_position.Y--;
ReadConsoleOutputCharacter(hOut,&ch, 1, new_position, &NumRead);
if (current_position.Y > screen_size.Top && ch != '#') {
MovePlayer(new_position);
} else {
invalid_move = true;
Message();
}
break;
case VK_NUMPAD7 : // Move northwest
new_position.X--; new_position.Y--;
ReadConsoleOutputCharacter(hOut,&ch, 1, new_position, &NumRead);
if (current_position.Y > screen_size.Top &&
current_position.X > screen_size.Left &&
ch != '#') {
MovePlayer(new_position);
} else {
invalid_move = true;
Message();
}
break;
case VK_NUMPAD4 : // Move west
new_position.X--;
ReadConsoleOutputCharacter(hOut,&ch, 1, new_position, &NumRead);
if (current_position.X > screen_size.Left && ch != '#') {
MovePlayer(new_position);
} else {
invalid_move = true;
Message();
}
break;
case VK_NUMPAD1 : // Move southwest
new_position.X--; new_position.Y++;
ReadConsoleOutputCharacter(hOut,&ch, 1, new_position, &NumRead);
if (current_position.Y < (screen_size.Bottom - 1) &&
current_position.X > screen_size.Left &&
ch != '#') {
MovePlayer(new_position);
} else {
invalid_move = true;
Message();
}
break;
case VK_NUMPAD2 : // Move south
new_position.Y++;
ReadConsoleOutputCharacter(hOut,&ch, 1, new_position, &NumRead);
if (current_position.Y < (screen_size.Bottom - 1) && ch != '#') {
MovePlayer(new_position);
} else {
invalid_move = true;
Message();
}
break;
case VK_NUMPAD3 : // Move southeast
new_position.X++; new_position.Y++;
ReadConsoleOutputCharacter(hOut,&ch, 1, new_position, &NumRead);
if (current_position.Y < (screen_size.Bottom - 1) &&
current_position.X < screen_size.Right &&
ch != '#') {
MovePlayer(new_position);
} else {
invalid_move = true;
Message();
}
break;
case VK_NUMPAD6 : // Move east
new_position.X++;
ReadConsoleOutputCharacter(hOut,&ch, 1, new_position, &NumRead);
if (current_position.X < screen_size.Right && ch != '#') {
MovePlayer(new_position);
} else {
invalid_move = true;
Message();
}
break;
case VK_NUMPAD9 : // Move northeast
new_position.X++; new_position.Y--;
ReadConsoleOutputCharacter(hOut,&ch, 1, new_position, &NumRead);
if (current_position.Y > screen_size.Top &&
current_position.X < screen_size.Right &&
ch != '#') {
MovePlayer(new_position);
} else {
invalid_move = true;
Message();
}
break;
}
}
return direction;
}
void PLAYERS::MovePlayer(COORD& new_position) {
SetConsoleCursorPosition(hOut, current_position);
WriteConsole(hOut, " ", 1, &NumWritten, NULL);
SetConsoleCursorPosition(hOut, new_position);
WriteConsole(hOut, "*", 1, &NumWritten, NULL);
current_position = new_position;
return;
}
void PLAYERS::Message() {
char message[] = "You Cannot Move There!";
char clear[] = " ";
COORD pos = {5, (screen_size.Bottom + 1)};
SetConsoleCursorPosition(hOut, pos);
if (invalid_move)
WriteConsole(hOut, &message, sizeof(message), &NumWritten, NULL);
else
WriteConsole(hOut, &clear, sizeof(clear), &NumWritten, NULL);
SetConsoleCursorPosition(hOut, current_position);
return;
}
WORD PLAYERS::GetCode() {
ReadConsoleInput(hIn, &InRec, 1, &NumRead);
return InRec.Event.KeyEvent.wVirtualKeyCode;
}
void PLAYERS::Create() {
hIn = GetStdHandle(STD_INPUT_HANDLE);
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD winsize = GetLargestConsoleWindowSize(hOut);
screen_size.Right = winsize.X - 3;
screen_size.Bottom = winsize.Y - 3;
screen_size.Left = 1;
screen_size.Top = 2;
invalid_move = false;
// set start position
current_position.X = 3; current_position.Y = 3;
MovePlayer(current_position);
return;
}
int main() {
// set console title and make full screen
InitConsole("Test Game", true);
// Make cursor invisible
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info;
cursor_info.dwSize = 10;
cursor_info.bVisible = false;
SetConsoleCursorInfo(hOut, &cursor_info);
// Display Game Screen
COORD pos;
std::cout<<"Use Num Pad Arrow Keys To Move Cursor. Hit <ENTER> To Quit.\n";
std::cout<<(unsigned char)201;
for (int i = 0; i < (MaxXposition() - 3); ++i)
std::cout<<(unsigned char)205;
std::cout<<(unsigned char)187;
for (int i = 2; i < (MaxYposition() - 3); ++i) {
SetCursorPosition(0, i);
std::cout<<(unsigned char)186;
SetCursorPosition( (MaxXposition() - 2), i);
std::cout<<(unsigned char)186;
}
SetCursorPosition(0, (MaxYposition() - 3) );
std::cout<<(unsigned char)200;
for (int i = 0; i < (MaxXposition() - 3); ++i)
std::cout<<(unsigned char)205;
std::cout<<(unsigned char)188;
// Set up maze
// This is a test wall
SetCursorPosition(20,20); std::cout<<"#####";
// Set up Player and move him to the start position
PLAYERS Player;
// Movement loop
WORD code;
do {
code = Player.Movement();
} while (code != VK_RETURN);
return 0;
}
BTW, my_consoleopps is a wrapper of sorts that I created that addresses console issuses such as size and positioning.