Last active
August 29, 2015 14:01
-
-
Save pi0/924aa8cd14cd5b7e0913 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <math.h> | |
#include <time.h> | |
#include <conio.h> | |
static int Tiles[16]; | |
int NoSpaceAvailable(void); | |
int SpaceAvailable(void); | |
int NextStep(void); | |
void InitTiles(void); | |
void ShiftRight(void); | |
void ShiftLeft(void); | |
void ShiftUp(void); | |
void ShiftDown(void); | |
void MergeUp(void); | |
void MergeDown(void); | |
void MergeLeft(void); | |
void MergeRight(void); | |
void PrintTiles(void); | |
int NoSpaceAvailable(void) | |
{ | |
int i = 0; | |
int allFill = 1; | |
for (i = 0, allFill = 1; i < 16 && allFill; ++i){ | |
if (Tiles[i] == 0){ | |
allFill = 0; | |
} | |
} | |
return allFill; | |
} | |
int SpaceAvailable(void) | |
{ | |
return !NoSpaceAvailable(); | |
} | |
int NextStep(void) | |
{ | |
int random_loc = 0; | |
int got_what_we_need = 1; | |
// init random numbers generation seed | |
if (NoSpaceAvailable()) return 0; | |
srand(time(NULL)); | |
for (got_what_we_need = 1; got_what_we_need; got_what_we_need = 0){ | |
random_loc = rand() % 16; | |
if (Tiles[random_loc] == 0){ | |
Tiles[random_loc] = 2; | |
got_what_we_need = 1; | |
} | |
} | |
return 1; // yes, we got what we need. | |
} | |
void InitTiles(void) | |
{ | |
int i = 0; | |
for (i = 0; i < 16; ++i){ | |
Tiles[i] = 0; | |
} | |
} | |
void ShiftRight(void) | |
{ | |
int i = 0; | |
int j = 0; | |
int k = 0; | |
// most eligible space | |
int mes = 0; | |
for (i = 0; i <4; ++i){ | |
mes = 4 * i +4 - 1; | |
for (j = mes; j > 4 * i; --j){ | |
if (Tiles[j] != 0) continue; | |
for (k = j - 1; k >= 4 * i; --k){ | |
if (Tiles[k] != 0) break; | |
} | |
if (k >= 4 * i && Tiles[k] != 0){ // put k >= 0 and boom, bad logic | |
Tiles[j] = Tiles[k]; | |
Tiles[k] = 0; | |
} | |
} | |
} | |
} | |
void ShiftLeft(void) | |
{ | |
int i = 0; | |
int j = 0; | |
int k = 0; | |
// most eligible space | |
int mes = 0; | |
for (i = 0; i <4; ++i){ | |
mes = 4 * i + 0; | |
for (j = mes; j < 4 * i +4 - 1; ++j){ | |
if (Tiles[j] != 0) continue; | |
for (k = j + 1; k <= 4 * i +4 - 1; ++k){ | |
if (Tiles[k] != 0) break; | |
} | |
if (k <= 4 * i +4 - 1 && Tiles[k] != 0){ // put k >= 0 and boom, bad logic | |
Tiles[j] = Tiles[k]; | |
Tiles[k] = 0; | |
} | |
} | |
} | |
} | |
void ShiftDown(void) | |
{ | |
int i = 0; | |
int j = 0; | |
int k = 0; | |
// most eligible space | |
int mes = 0; | |
for (i = 0; i <4; ++i){ | |
mes = i +4*(4 - 1); | |
for (j = mes; j > i; j -= 4){ | |
if (Tiles[j] != 0) continue; | |
for (k = j - 4; k >= i; k -= 4){ | |
if (Tiles[k] != 0) break; | |
} | |
if (k >= i && Tiles[k] != 0){ // put k >= 0 and boom, bad logic | |
Tiles[j] = Tiles[k]; | |
Tiles[k] = 0; | |
} | |
} | |
} | |
} | |
void ShiftUp(void) | |
{ | |
int i = 0; | |
int j = 0; | |
int k = 0; | |
for (i = 0; i <4; ++i){ | |
for (j = i; j <4*(4 - 1) + i; j += 4){ | |
if (Tiles[j] != 0) continue; | |
for (k = j + 4; k <=4*(4 - 1) + i; k += 4){ | |
if (Tiles[k] != 0) break; | |
} | |
if (k <=4*(4 - 1) + i && Tiles[k] != 0){ | |
Tiles[j] = Tiles[k]; | |
Tiles[k] = 0; | |
} | |
} | |
} | |
} | |
void MergeRight(void) | |
{ | |
int i = 0; | |
int j = 0; | |
int k = 0; | |
for (i = 0; i <4; ++i){ | |
for (j = 4 * i +4 - 1; j > 4 * i; --j){ | |
if (Tiles[j] == 0) continue; | |
for (k = j - 1; k >= 4 * i; --k){ | |
if (Tiles[k] == 0) continue; | |
if (Tiles[k] == Tiles[j]){ | |
Tiles[j] *= 2; | |
Tiles[k] = 0; | |
j = k; | |
} | |
break; | |
} | |
} | |
} | |
} | |
void MergeLeft(void) | |
{ | |
int i = 0; | |
int j = 0; | |
int k = 0; | |
for (i = 0; i <4; ++i){ | |
for (j = 4 * i; j < 4 * i +4 - 1; ++j){ | |
if (Tiles[j] == 0) continue; | |
for (k = j + 1; k <= 4 * i +4 - 1; ++k){ | |
if (Tiles[k] == 0) continue; | |
if (Tiles[j] == Tiles[k]){ | |
Tiles[j] *= 2; | |
Tiles[k] = 0; | |
j = k; | |
} | |
break; | |
} | |
} | |
} | |
} | |
void MergeDown(void) | |
{ | |
int i = 0; | |
int j = 0; | |
int k = 0; | |
for (i = 0; i <4; ++i){ | |
for (j =4*(4 - 1) + i; j > i; j -=4){ | |
if (Tiles[j] == 0) continue; | |
for (k = j -4; k >= i; k -=4){ | |
if (Tiles[k] == 0) continue; | |
if (Tiles[j] == Tiles[k]){ | |
Tiles[j] *= 2; | |
Tiles[k] = 0; | |
j = k; | |
} | |
break; | |
} | |
} | |
} | |
} | |
void MergeUp(void) | |
{ | |
int i = 0; | |
int j = 0; | |
int k = 0; | |
for (i = 0; i <4; ++i){ | |
for (j = i; j <4*(4 - 1) + i; j +=4){ | |
if (Tiles[j] == 0) continue; | |
for (k = j +4; k <=4*(4 - 1) + i; k +=4){ | |
if (Tiles[k] == 0) continue; | |
if (Tiles[j] == Tiles[k]){ | |
Tiles[j] *= 2; | |
Tiles[k] = 0; | |
j = k; | |
} | |
break; | |
} | |
} | |
} | |
} | |
void PrintTiles() | |
{ | |
int i =4, j =4; | |
for (i = 0; i <4; ++i){ | |
for (j = 0; j <4; ++j){ | |
printf("%6d", Tiles[4*i + j]); | |
} | |
printf("\n\n"); | |
} | |
} | |
void PlayGame() | |
{ | |
char userChoice = 'k'; | |
printf("Going to start game. Use AD for left, right. WS for up,Down.\n"); | |
printf("k to kill game.\n"); | |
InitTiles(); | |
NextStep(); | |
do{ | |
printf("\n\n\n"); | |
if (!NextStep()){ | |
break; | |
} | |
PrintTiles(); | |
userChoice = _getch(); | |
if (userChoice == '\n') userChoice = _getch(); | |
switch (userChoice){ | |
case 'a': | |
case 'A': | |
MergeLeft(); ShiftLeft(); break; | |
case 'd': | |
case 'D': | |
MergeRight(); ShiftRight(); break; | |
case 'w': | |
case 'W': | |
MergeUp(); ShiftUp(); break; | |
case 's': | |
case 'S': | |
MergeDown(); ShiftDown(); break; | |
} | |
printf("\n\n\n"); | |
} while (SpaceAvailable() && userChoice != 'k'); | |
printf("\nGame over.\n"); | |
} | |
int main() | |
{ | |
PlayGame(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment