Jag har börjat programera ett spel där man ska försöka akta sig för fyrkanter. Roligt väll? :o) Du kan testa hur det funkar genom att ladda ned exe filen.
Det finns dock två problem med spelet, det fungerar och så. Det ena är att COORDsen inte uppdateras automatiskt, det andra är att när man klickar på upp eller ned så flyttar smilien två steg..
Hoppas någon kan hjälpa mig..
#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
#define SCREEN_WIDTH 400
#define SCREEN_HEIGHT 15
#define START_X 0
#define START_Y
#define PLAYER 1
#define FYRKANT '#'
void DrawMaze(CHAR_INFO screenBuffer[], int playerX, int playerY,int positionX);
void Delay(DWORD nTimeMs);
bool MovePlayer(CHAR_INFO screenBuffer[], COORD &playerPos);
int main()
{
int position=0;
int positionX=0;
CHAR_INFO screenBuffer[SCREEN_WIDTH * SCREEN_HEIGHT] = {0};
COORD bufferSize = {SCREEN_WIDTH , SCREEN_HEIGHT};
COORD playerPos = {START_X, START_Y};
srand( GetTickCount() );
for(int y = 0; y < bufferSize.Y; y++)
{
for(int x = 0; x < bufferSize.X; x++)
{
if(!(rand() % 40))
{
screenBuffer[x + y * SCREEN_WIDTH].Char.AsciiChar = FYRKANT;
screenBuffer[x + y * SCREEN_WIDTH].Attributes = FOREGROUND_BLUE;
}
}
}
cout << "Get ready\n";
Delay(400);
cout << "set\n";
Delay(400);
cout << "Go!";
Delay(400);
DrawMaze(screenBuffer, playerPos.X+position, playerPos.Y,positionX);
for(position=0;position<400;position++)
{
positionX = position;
if(screenBuffer[playerPos.X+position + playerPos.Y * SCREEN_WIDTH].Char.AsciiChar == FYRKANT){
system("cls");
cout << "You are dead\nPress any key to exit";
cin.get();
exit(0);
}
if(MovePlayer(screenBuffer, playerPos))
{
DrawMaze(screenBuffer, playerPos.X+position, playerPos.Y,positionX);
}
}
}
void DrawMaze(CHAR_INFO screenBuffer[], int playerX, int playerY,int y)
{
SMALL_RECT drawRect = {0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1};
COORD bufferSize = {SCREEN_WIDTH , SCREEN_HEIGHT};
COORD zeroZero = {y,0};
HANDLE hOutput;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
screenBuffer[playerX + playerY * SCREEN_WIDTH].Char.AsciiChar = PLAYER;
screenBuffer[playerX + playerY * SCREEN_WIDTH].Attributes = FOREGROUND_RED;
WriteConsoleOutput(hOutput, screenBuffer, bufferSize, zeroZero, &drawRect);
}
bool MovePlayer(CHAR_INFO screenBuffer[], COORD &playerPos)
{
INPUT_RECORD InputRecord;
COORD oldPosition = playerPos;
DWORD Events=0;
HANDLE hInput;
bool bPlayerMoved = false;
hInput = GetStdHandle(STD_INPUT_HANDLE);
ReadConsoleInput(hInput, &InputRecord, 1, &Events);
if(InputRecord.EventType == KEY_EVENT)
{
if(InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_UP)
{
if(playerPos.Y > 0)
{
playerPos.Y--;
bPlayerMoved = true;
}
}
else if(InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_DOWN)
{
if(playerPos.Y < (SCREEN_HEIGHT - 1) )
{
playerPos.Y++;
bPlayerMoved = true;
}
}
else if(InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
{
exit(0);
}
return true;
}
FlushConsoleInputBuffer(hInput);
if(bPlayerMoved)
{
if(screenBuffer[playerPos.X + playerPos.Y * SCREEN_WIDTH].Char.AsciiChar != FYRKANT)
{
screenBuffer[oldPosition.X + oldPosition.Y * SCREEN_WIDTH].Char.AsciiChar = ' ';
screenBuffer[oldPosition.X + oldPosition.Y * SCREEN_WIDTH].Attributes = 0;
}
return true;
}
return false;
}
void Delay(DWORD nTimeMs){
MSG msg;
DWORD endTick;
endTick = GetTickCount() + nTimeMs;
while(GetTickCount() < endTick)
{
if(PeekMessage(&msg, NULL, 0, 0, TRUE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return;
}