mirror of
https://github.com/jeremysrand/apple2048.git
synced 2024-06-08 06:29:30 +00:00
Get the basic game working
This commit is contained in:
parent
8111301a14
commit
0902ec0f79
115
apple2048.c
115
apple2048.c
|
@ -1,12 +1,121 @@
|
||||||
|
#include <conio.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <conio.h>
|
|
||||||
|
#include "game.h"
|
||||||
|
|
||||||
|
|
||||||
|
void printBoard(void)
|
||||||
|
{
|
||||||
|
tPos x;
|
||||||
|
tPos y;
|
||||||
|
|
||||||
|
clrscr();
|
||||||
|
|
||||||
|
for (y = 1; y <= BOARD_SIZE; y++) {
|
||||||
|
printf("+");
|
||||||
|
for (x = 1; x <= BOARD_SIZE; x++) {
|
||||||
|
printf("--------+");
|
||||||
|
}
|
||||||
|
printf("\n!");
|
||||||
|
for (x = 1; x <= BOARD_SIZE; x++) {
|
||||||
|
printf(" !");
|
||||||
|
}
|
||||||
|
printf("\n!");
|
||||||
|
for (x = 1; x <= BOARD_SIZE; x++) {
|
||||||
|
printf("%s!", tileStringForPos(x, y));
|
||||||
|
}
|
||||||
|
printf("\n!");
|
||||||
|
for (x = 1; x <= BOARD_SIZE; x++) {
|
||||||
|
printf(" !");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("+");
|
||||||
|
for (x = 1; x <= BOARD_SIZE; x++) {
|
||||||
|
printf("--------+");
|
||||||
|
}
|
||||||
|
printf("\n\nCURRENT SCORE: %ld\nTRY TO GET THE %ld TILE!", currentScore(),
|
||||||
|
nextTarget());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void gameWon(void)
|
||||||
|
{
|
||||||
|
printf("\nCONGRATULATIONS, YOU HAVE WON THE GAME!\n");
|
||||||
|
cgetc();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void gameLost(void)
|
||||||
|
{
|
||||||
|
printf("\nSORRY, NO MORE MOVES.\n");
|
||||||
|
cgetc();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void handleNextEvent(void)
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ch = cgetc();
|
||||||
|
switch (ch) {
|
||||||
|
case 'i':
|
||||||
|
case 'I':
|
||||||
|
case 11: // Up arrow
|
||||||
|
slideInDirection(DIR_UP);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 'j':
|
||||||
|
case 'J':
|
||||||
|
case 8: // Left arrow
|
||||||
|
slideInDirection(DIR_LEFT);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 'k':
|
||||||
|
case 'K':
|
||||||
|
case 21: // Right arrow
|
||||||
|
slideInDirection(DIR_RIGHT);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
case 'M':
|
||||||
|
case 10: // Up arrow
|
||||||
|
slideInDirection(DIR_DOWN);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 27: // Escape
|
||||||
|
case 'q':
|
||||||
|
case 'Q':
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
case 'r':
|
||||||
|
case 'R':
|
||||||
|
initGame();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
printf("DOES THIS WORK...\n");
|
initGame();
|
||||||
while (!kbhit()) {
|
|
||||||
|
while (true) {
|
||||||
|
printBoard();
|
||||||
|
|
||||||
|
if (isGameWon())
|
||||||
|
gameWon();
|
||||||
|
|
||||||
|
if (isGameLost())
|
||||||
|
gameLost();
|
||||||
|
|
||||||
|
handleNextEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
29
game.c
29
game.c
|
@ -76,6 +76,9 @@ static tTileValue gNextTarget = 11;
|
||||||
static uint8_t gNumEmptyTiles;
|
static uint8_t gNumEmptyTiles;
|
||||||
|
|
||||||
|
|
||||||
|
void addRandomTile(void);
|
||||||
|
|
||||||
|
|
||||||
void initGame(void)
|
void initGame(void)
|
||||||
{
|
{
|
||||||
tPos pos;
|
tPos pos;
|
||||||
|
@ -133,8 +136,10 @@ void slideInDirection(tDir dir)
|
||||||
tPos pos;
|
tPos pos;
|
||||||
tPos destPos;
|
tPos destPos;
|
||||||
int8_t incr;
|
int8_t incr;
|
||||||
|
tTileValue tileValue;
|
||||||
|
bool addNewTile = false;
|
||||||
|
|
||||||
if (dir > 0) {
|
if (dir < 0) {
|
||||||
pos = 0;
|
pos = 0;
|
||||||
incr = 1;
|
incr = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -149,14 +154,34 @@ void slideInDirection(tDir dir)
|
||||||
if (destPos == pos)
|
if (destPos == pos)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (gTileValues[destPos] > 0) {
|
addNewTile = true;
|
||||||
|
|
||||||
|
tileValue = gTileValues[destPos];
|
||||||
|
if (tileValue > 0) {
|
||||||
|
tileValue++;
|
||||||
gTileValues[destPos]++;
|
gTileValues[destPos]++;
|
||||||
gNumEmptyTiles++;
|
gNumEmptyTiles++;
|
||||||
|
gCurrentScore += gValueScores[tileValue];
|
||||||
|
|
||||||
|
// This is a hack to prevent multiple merges from happening to
|
||||||
|
// the same tile in a single turn. We set the value to a high
|
||||||
|
// negative (< -1) and then flip the sign bit later.
|
||||||
|
gTileValues[destPos] = -tileValue;
|
||||||
} else {
|
} else {
|
||||||
gTileValues[destPos] = gTileValues[pos];
|
gTileValues[destPos] = gTileValues[pos];
|
||||||
}
|
}
|
||||||
gTileValues[pos] = 0; // Empty the old position
|
gTileValues[pos] = 0; // Empty the old position
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (pos = 0; pos < NUM_TILES; pos++) {
|
||||||
|
tileValue = gTileValues[pos];
|
||||||
|
if (tileValue < BLOCKED_TILE_VALUE) {
|
||||||
|
gTileValues[pos] = -tileValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addNewTile)
|
||||||
|
addRandomTile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user