Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SDL2/SDL_image.h>
- #include <SDL2/SDL_mixer.h>
- #include <SDL2/SDL_ttf.h>
- #include <iostream>
- using namespace std;
- typedef unsigned int uint;
- const int size = 4;
- enum movDir {UP, DOWN, LEFT, RIGHT, FORWARD, BACK};
- bool win, done, moved;
- uint score;
- class tile
- {
- public:
- tile() : val(0), blocked(false) {}
- uint val;
- bool blocked;
- };
- tile board[size][size][size];
- #define Texture SDL_Texture*
- unsigned window_x = 1330;
- unsigned window_y = 340;
- unsigned window_start_x = 0;
- unsigned window_start_y = 0;
- SDL_Renderer *renderer;
- //CSDL_Setup* csdl_setup;
- Texture background;
- Texture grid;
- Texture tile_2;
- Texture tile_4;
- Texture tile_8;
- Texture tile_16;
- Texture tile_32;
- Texture tile_64;
- Texture tile_128;
- Texture tile_256;
- Texture tile_512;
- Texture tile_1024;
- Texture tile_2048;
- Texture loadImage(char* image){
- SDL_Surface *loadedImage = IMG_Load(image);
- if(!loadedImage) {
- printf("Failed to load image: %s\n", SDL_GetError() );
- SDL_Quit();
- exit(1);
- }
- Texture texture = SDL_CreateTextureFromSurface(renderer, loadedImage);
- SDL_FreeSurface(loadedImage);
- if(!texture) {
- printf("Failed to create texture: %s\n", SDL_GetError() );
- SDL_Quit();
- exit(1);
- }
- return texture;
- }
- TTF_Font* font;
- void init_sdl(){
- static bool init=false;
- if(init) return;
- init = true;
- if (SDL_Init(SDL_INIT_EVERYTHING) != 0){
- printf("SDL_Init failed: %s\n", SDL_GetError());
- exit(1);
- }
- SDL_Window *window = SDL_CreateWindow("2048",window_start_x,window_start_y, window_x,window_y,SDL_WINDOW_SHOWN);
- if (!window){
- printf("Window creation failed: %s\n", SDL_GetError());
- SDL_Quit();
- exit(1);
- }
- renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
- if (!renderer){
- printf("Renderer creation failed: %s\n", SDL_GetError());
- SDL_Quit();
- exit(1);
- }
- background = loadImage("background.png");
- grid = loadImage("grid.png");
- tile_2 = loadImage("2.png");
- tile_4 = loadImage("4.png");
- tile_8 = loadImage("8.png");
- tile_16 = loadImage("16.png");
- tile_32= loadImage("32.png");
- tile_64 = loadImage("64.png");
- tile_128 = loadImage("128.png");
- tile_256 = loadImage("256.png");
- tile_512 = loadImage("512.png");
- tile_1024 = loadImage("1024.png");
- tile_2048 = loadImage("2048.png");
- /*if(TTF_Init()==-1){
- printf("Font error %s\n", TTF_GetError());
- exit(1);
- }
- font = TTF_OpenFont("CS.ttf", 48);
- if(!font){
- printf("Font error %s\n", TTF_GetError());
- exit(1);
- }*/
- }
- /*Texture r(string message){
- init_sdl();
- SDL_Surface* s = TTF_RenderText_Blended(font, message.c_str(), (SDL_Color){.r=0,.g=0,.b=0,.a=255});
- if(!s){
- printf("Error creating surface %s\n", SDL_GetError());
- exit(1);
- }
- auto tex =SDL_CreateTextureFromSurface(renderer, s);
- if(!tex){
- printf("Error creating surface %s\n", SDL_GetError());
- exit(1);
- }
- SDL_FreeSurface(s);
- return tex;
- }*/
- void displayTexture(Texture t, unsigned x, unsigned y, unsigned width, unsigned height, SDL_RendererFlip flip = SDL_FLIP_NONE){
- SDL_Rect tex_size;
- tex_size.x = 0;
- tex_size.y = 0;
- SDL_Rect toplace;
- toplace.x = x;
- toplace.y = y;
- toplace.w = width;
- toplace.h = height;
- SDL_QueryTexture(t, NULL, NULL, &tex_size.w, &tex_size.h);
- SDL_RenderCopyEx(renderer,t,&tex_size,&toplace,0,NULL,flip);
- }
- //Texture background_image, player_image;
- /*int array[9];
- Texture display[] = {r(" "), r("2"), r("4"), r("8"), r("16"), r("32"), r("64"), r("128"), r("256"), r("512"), r("1024"), r("2048"), r("4096"), r("8192")};
- unsigned char colors[][3] = {
- {0,0,0}, // none
- {200, 0, 200}, // 2
- {200, 0, 200}, // 4
- {200, 0, 200}, // 8
- {200, 0, 200}, // 16
- {200, 0, 200}, // 32
- {200, 0, 200}, // 64
- {200, 0, 200}, // 128
- {200, 0, 200}, // 256
- {200, 0, 200}, // 512
- {200, 0, 200}, // 1024
- {200, 0, 200}, // 2048
- {200, 0, 200}, // 4096
- {200, 0, 200}, // 8192
- };*/
- bool testAdd(int x, int y, int z, uint v){
- if (x < 0 || x > 3 || y < 0 || y > 3 || z < 0 || z > 3) return false;
- return board[x][y][z].val == v;
- }
- bool canMove(){
- for (int y = 0; y < size; y++){
- for (int x = 0; x < size; x++){
- for (int z = 0; z < size; z++){
- if (!board[x][y][z].val) return true;
- }
- }
- }
- for (int x = 0; x < size; x++){
- for (int y = 0; y < size; y++){
- for (int z = 0; z < size; z++){
- if (testAdd(x + 1, y, z, board[x][y][z].val)) return true;
- if (testAdd(x - 1, y, z, board[x][y][z].val)) return true;
- if (testAdd(x, y + 1, z, board[x][y][z].val)) return true;
- if (testAdd(x, y - 1, z, board[x][y][z].val)) return true;
- if (testAdd(x, y, z + 1, board[x][y][z].val)) return true;
- if (testAdd(x, y, z - 1, board[x][y][z].val)) return true;
- }
- }
- }
- return false;
- }
- void addTile(){
- for (int y = 0; y < size; y++){
- for (int x = 0; x < size; x++){
- for (int z = 0; z < size; z++){
- if (!board[x][y][z].val)
- {
- uint a, b, c;
- for (int i = 0; i < 3; i++){
- do
- {a = rand() % size; b = rand() % size; c = rand() % size;}
- while (board[a][b][c].val);
- int s = rand() % 100;
- if (s > 89) board[a][b][c].val = size;
- else board[a][b][c].val = 2;
- }
- if (canMove()) return;
- }
- }
- }
- }
- done = true;
- }
- void moveVert(int x, int y, int z, int d){
- if (board[x][y + d][z].val && board[x][y + d][z].val == board[x][y][z].val && !board[x][y][z].blocked && !board[x][y + d][z].blocked )
- {
- board[x][y][z].val = 0;
- board[x][y + d][z].val *= 2;
- score += board[x][y + d][z].val;
- board[x][y + d][z].blocked = true;
- moved = true;
- }
- else if (!board[x][y + d][z].val && board[x][y][z].val)
- {
- board[x][y + d][z].val = board[x][y][z].val;
- board[x][y][z].val = 0;
- moved = true;
- }
- if (d > 0) {if (y + d < 3) moveVert(x, y + d, z, 1);}
- else {if (y + d > 0) moveVert(x, y + d, z, -1);}
- }
- void moveHori(int x, int y, int z, int d){
- if (board[x + d][y][z].val && board[x + d][y][z].val == board[x][y][z].val && !board[x][y][z].blocked && !board[x + d][y][z].blocked )
- {
- board[x][y][z].val = 0;
- board[x + d][y][z].val *= 2;
- score += board[x + d][y][z].val;
- board[x + d][y][z].blocked = true;
- moved = true;
- }
- else if (!board[x + d][y][z].val && board[x][y][z].val)
- {
- board[x + d][y][z].val = board[x][y][z].val;
- board[x][y][z].val = 0;
- moved = true;
- }
- if (d > 0) {if (x + d < 3) moveHori(x + d, y, z, 1);}
- else {if (x + d > 0) moveHori(x + d, y, z, -1);}
- }
- void movePlane(int x, int y, int z, int d){
- if (board[x][y][z + d].val && board[x][y][z + d].val == board[x][y][z].val && !board[x][y][z].blocked && !board[x][y][z + d].blocked )
- {
- board[x][y][z].val = 0;
- board[x][y][z + d].val *= 2;
- score += board[x][y][z + d].val;
- board[x][y][z + d].blocked = true;
- moved = true;
- }
- else if (!board[x][y][z + d].val && board[x][y][z].val)
- {
- board[x][y][z + d].val = board[x][y][z].val;
- board[x][y][z].val = 0;
- moved = true;
- }
- if (d > 0) {if (z + d < 3) movePlane(x, y, z + d, 1);}
- else {if (z + d > 0) movePlane(x, y, z + d, -1);}
- }
- void move(movDir d){
- switch(d)
- {
- case UP:
- for (int x = 0; x < size; x++){
- for (int z = 0; z < size; z++){
- int y = 1;
- while (y < size)
- {if (board[x][y][z].val) moveVert(x, y, z, -1); y++;}
- }
- }
- break;
- case DOWN:
- for (int x = 0; x < size; x++){
- for (int z = 0; z < size; z++){
- int y = 2;
- while (y >= 0)
- {if (board[x][y][z].val) moveVert(x, y, z, 1); y--;}
- }
- }
- break;
- case LEFT:
- for (int y = 0; y < size; y++){
- for (int z = 0; z < size; z++){
- int x = 1;
- while (x < size)
- {if (board[x][y][z].val) moveHori(x, y, z, -1); x++;}
- }
- }
- break;
- case RIGHT:
- for (int y = 0; y < size; y++){
- for (int z = 0; z < size; z++){
- int x = 2;
- while (x >= 0)
- {if (board[x][y][z].val) moveHori(x, y, z, 1); x--;}
- }
- }
- break;
- case FORWARD:
- for (int x = 0; x < size; x++){
- for (int y = 0; y < size; y++){
- int z = 1;
- while (z < size)
- {if (board[x][y][z].val) movePlane(x, y, z, -1); z++;}
- }
- }
- break;
- case BACK:
- for (int x = 0; x < size; x++){
- for (int y = 0; y < size; y++){
- int z = 2;
- while (z >= 0)
- {if (board[x][y][z].val) movePlane(x, y, z, 1); z--;}
- }
- }
- }
- }
- void checkKeys(int key){
- switch(key){
- case SDLK_UP:
- printf("up\n"); fflush(0);
- //do up stuff
- move(UP);
- break;
- case SDLK_DOWN:
- printf("down\n"); fflush(0);
- //do down stuff
- move(DOWN);
- break;
- case SDLK_RIGHT:
- printf("right\n"); fflush(0);
- //do right stuff
- move(RIGHT);
- break;
- case SDLK_LEFT:
- printf("left\n"); fflush(0);
- //do left stuff
- move(LEFT);
- break;
- case SDLK_f:
- printf("forward\n"); fflush(0);
- //do left stuff
- move(FORWARD);
- break;
- case SDLK_r:
- printf("back\n"); fflush(0);
- //do left stuff
- move(BACK);
- break;
- }
- }
- void initialize() {
- done = false;
- win = false;
- moved = true;
- score = 0;
- /*for(int i=0; i<9; i++) array[i] = 0;
- array[rand()%9] = 1;
- do{
- int temp = rand()%9;
- if(array[temp]!=0) continue;
- array[temp] = 1;
- }while(false);*/
- //}
- //int& get(int x, int y){
- // return array[x*3+y];
- }
- void render(){
- SDL_RenderClear(renderer);
- SDL_SetRenderDrawColor(renderer,255,255,0,255);
- SDL_Rect rectangle;
- rectangle.x = 0;
- rectangle.y = 0;
- rectangle.w = window_x;
- rectangle.h = window_y;
- SDL_RenderFillRect(renderer, &rectangle);
- /*for(int i=0; i<3; i++)
- for(int j=0; j<3; j++){
- //SDL_SetRenderDrawColor(renderer,colors[array[i*3+j]][0],colors[array[i*3+j]][1],colors[array[i*3+j]][2],255);
- SDL_Rect rectangle;
- rectangle.x = i*window_x/3;
- rectangle.y = j*window_y/3;
- rectangle.w = (i+1)*window_x/3;
- rectangle.h = (j+1)*window_y/3;
- SDL_RenderFillRect(renderer, &rectangle);
- SDL_Rect tex_size;
- tex_size.x = 0;
- tex_size.y = 0;
- SDL_Rect toplace;
- //SDL_QueryTexture(display[array[i*3+j]], NULL, NULL, &tex_size.w, &tex_size.h);
- toplace.x = i*window_x/3;
- toplace.y = j*window_y/3;
- toplace.w = window_x/3;
- toplace.h = window_y/3;
- //SDL_RenderCopyEx(renderer,display[array[i*3+j]],&tex_size,&toplace,0,NULL,SDL_FLIP_NONE);
- }*/
- /*SDL_SetRenderDrawColor(renderer,0,0,0,255);
- for(int i=1; i<3; i++){
- SDL_RenderDrawLine(renderer, i*window_x/3, 0, i*window_x/3, window_y);
- SDL_RenderDrawLine(renderer, 0, i*window_y/3, window_x, i*window_y/3);
- }*/
- displayTexture(background, 0, 0, window_x, window_y);
- displayTexture(grid, 19, 49, 556, 557);
- displayTexture(grid, 19+556, 49+557, 556, 557);
- displayTexture(grid, 19+2*556, 49+2*557, 556, 557);
- displayTexture(grid, 19+3*556, 49+3*557, 556, 557);
- //displayTexture(player_image, 0, (int)((player1)*window_y),(int)(player_width*window_x), (int)(player_height*window_y));
- //displayTexture(player_image, window_x-(int)(player_width*window_x), (int)((player2)*window_y),(int)(player_width*window_x), (int)(player_height*window_y),SDL_FLIP_HORIZONTAL);
- SDL_RenderPresent(renderer);
- }
- void loop(){
- //addTile();
- SDL_Event e;
- //csdl_setup->Begin();
- int quit = 0;
- //addTile();
- while (!quit){
- while(!done){
- //if (moved) addTile();
- while (SDL_PollEvent(&e)){
- if (e.type == SDL_QUIT) quit = 1;
- else if (e.key.state == SDL_PRESSED) {
- moved = false;
- for (int x = 0; x < size; x++)
- for (int y = 0; y < size; y++)
- for (int z = 0; z < size; z++)
- board[x][y][z].blocked = false;
- checkKeys(e.key.keysym.sym);
- }
- }
- render();
- }
- }
- }
- int main(int argc, char** argv){
- //Our event structure
- init_sdl();
- initialize();
- loop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement