Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <ctime>
- #include "../Graph_lib/Simple_window.h"
- #include "../Graph_lib/Graph.h"
- using namespace Graph_lib;
- using namespace std;
- //window2048 win{ Point{ 100, 100 }, 700, 600, "2048" };
- struct window2048 : Simple_window
- {
- //window2048 (Point xy, int wm, int h, const string& name);
- using Simple_window::Simple_window;
- private:
- Button top;
- Button down;
- Button right;
- Button left;
- bool butt_pushed;
- static void cb_top(Address, Address);
- static void cb_down(Address, Address);
- static void cb_left(Address, Address);
- static void cb_right(Address, Address);
- };
- class Cell
- {
- public:
- Cell(int bin);
- void plus_pow()
- {
- b_pow++;
- }
- int get_bin(){return b_pow;}
- int get_color(){return Set_color();}
- private:
- int Set_color();
- int b_pow;
- };
- int Cell::Set_color()
- {
- switch(b_pow)
- {
- case -1:
- return 0; //error check
- break;
- case 0:
- return 17;
- break;
- case 1:
- return 214;
- break;
- case 2:
- return 211;
- break;
- case 3:
- return 132;
- break;
- case 4:
- return 129;
- break;
- default:
- return 2;
- }
- }
- Cell::Cell(int bin)
- {
- b_pow=bin;
- }
- class Board : public Shape
- {
- public:
- Board();
- void set_table(char move);
- protected:
- void draw_lines() const;
- private:
- void right_set(int i);
- void left_set(int i); //с этого момента не написанно
- void up_set(int i);
- void down_set(int i);
- void start_game();
- void random_cell();
- vector<Vector_ref<Cell>> table;
- };
- Board::Board()
- :Shape ()
- {
- start_game();
- }
- int end_of_game()
- {
- Text end_of_game (Point (200, 200), "End of game");
- end_of_game.set_color(Color::blue);
- win.attach(end_of_game);
- return 0;
- }
- void Board::random_cell()
- {
- vector<vector<int>> free_cell;
- for(int i {0} ; i<4 ; ++i)
- {
- for(int j {0} ; j<4 ; ++j)
- {
- if (table[i][j].get_bin()==0)
- free_cell.push_back(vector<int>{i,j});
- }
- }
- if (free_cell.size()==0)
- {
- throw ("Game Over"); //if no moves on next turn
- }
- int a = free_cell.size();
- if (a == 1)
- {
- table[free_cell[0][0]][free_cell[0][1]]=Cell{1};
- return;
- }
- srand((unsigned int)time(NULL));
- a = abs(rand() % a);
- table[free_cell[a][0]][free_cell[a][1]]=Cell{1};
- }
- void Board::start_game()
- {
- for (int i{0} ; i<4 ; ++i)
- {
- Vector_ref<Cell> set;
- table.push_back(set);
- for (int j{0} ; j<4 ; ++j)
- {
- table[i].push_back(new Cell(0));
- }
- }
- random_cell();
- random_cell();
- }
- void Board::right_set(int i)
- {
- while (true)
- {
- for(int l{3}; l >= 2; --l) //хз l>=2 или l>=1
- {
- for (int j{l} ; j >= 1 ; --j)//сдвиг не 0 вправо до конца
- {
- if(table[i][j].get_bin()==0)
- for (int h{0} ; h < 4 ; ++h)
- {
- for(int J{j} ; J>=1 ; --J)
- if(table[i][J].get_bin()==0 && J>=1)
- swap(table[i][J-1],table[i][J]);
- }
- }
- for (int j{l} ; j>=1 ; --j)//слияние вправо
- {
- if (table[i][j].get_bin()==table[i][j-1].get_bin() && table[i][j].get_bin()!=0)
- {
- table[i][j].plus_pow();
- table[i][j-1]=Cell(0);
- }
- }
- }
- }
- end_of_game();
- }
- //void Board::up_set(int i)
- //{
- // for (int l{3})
- //}
- void Board::set_table(char move)
- {
- switch (move)
- {
- case 'r':
- {
- for (int i{0} ; i<4 ; i++)
- right_set(i);
- random_cell();
- break;
- }
- // case 'l':
- // for (int i{0} ; i<4 ; i++)
- // left_set(i);
- // random_cell();
- // break;
- }
- }
- void Board::draw_lines() const
- {
- Shape::draw_lines();
- Vector_ref<Graph_lib::Rectangle> rect;
- Vector_ref<Text> box;
- vector<Vector_ref<Cell>> prin = table;
- for (int i{0} ; i<4 ; i++)
- {
- for (int j{0} ; j<4 ; j++)
- {
- rect.push_back(new Graph_lib::Rectangle{Point{j*150,i*150},150,150});
- rect[rect.size()-1].set_fill_color(prin[i][j].get_color());
- rect[rect.size()-1].draw();
- if (prin[i][j].get_bin()>0)
- {
- string s = to_string((int)pow(2,prin[i][j].get_bin()));
- box.push_back(new Graph_lib::Text{Point{j*150+60, i*150+90} , s });
- box[box.size()-1].set_font_size(60);
- box[box.size()-1].draw();
- }
- }
- }
- }
- int main()
- {
- Board game;
- win.attach(game);
- win.wait_for_button();
- while(true)
- {
- win.wait_for_button();
- game.set_table('r');
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement