Skip to content

Instantly share code, notes, and snippets.

@pi0
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pi0/924aa8cd14cd5b7e0913 to your computer and use it in GitHub Desktop.
Save pi0/924aa8cd14cd5b7e0913 to your computer and use it in GitHub Desktop.
#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