Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- //enumy
- enum animal_enum {NO_ANIMAL, RAT, CAT, DOG, WOLF, JAGUAR, TIGER, LION, ELEPHANT};
- enum type_enum {FIELD, TRAP, RIVER, DEN_P1, DEN_P2};
- enum player_enum {P1, P2, NO_PLAYER};
- //skróty
- #define fi first
- #define se second
- //typy danych
- typedef pair<short, short> pss;
- //consty
- const short n = 9, m = 7;
- const short tile_type[n][m] = {
- {FIELD, FIELD, TRAP, DEN_P1, TRAP, FIELD, FIELD},
- {FIELD, FIELD, FIELD, TRAP, FIELD, FIELD, FIELD},
- {FIELD, FIELD, FIELD, FIELD, FIELD, FIELD, FIELD},
- {FIELD, RIVER, RIVER, FIELD, RIVER, RIVER, FIELD},
- {FIELD, RIVER, RIVER, FIELD, RIVER, RIVER, FIELD},
- {FIELD, RIVER, RIVER, FIELD, RIVER, RIVER, FIELD},
- {FIELD, FIELD, FIELD, FIELD, FIELD, FIELD, FIELD},
- {FIELD, FIELD, FIELD, TRAP, FIELD, FIELD, FIELD},
- {FIELD, FIELD, TRAP, DEN_P2, TRAP, FIELD, FIELD}};
- const pss shift[] = {{-2, 0}, {1, 0}, {0, -1}, {0, 1}};
- //struktury
- struct pon {
- animal_enum animal;
- player_enum player;
- };
- struct move_struct {
- pss from;
- pss shift;
- };
- //funcje pomocjicze
- inline bool valid_coord(pss p);
- //klasa przedstawiająca stan gry
- class State {
- public:
- short player; // który gracz wykonuje ruch
- vector<vector<pon>> board; // nasza plansza
- vector<vector<pss>> animal_poss; // dokładne pozycje zwierząt
- //konstruktor
- State(short player, vector<vector<pon>> board, vector<vector<pss>> animal_poss) : player(player), board(board), animal_poss(animal_poss) {}
- //destruktor
- ~State() {
- }
- // wypisanie planszy
- void print() {
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < m; j++) {
- char c;
- if(board[i][j].animal == NO_ANIMAL) c = '.';
- else if(board[i][j].animal == RAT) c = 'R' | ((board[i][j].player == P1) * 32);
- else if(board[i][j].animal == CAT) c = 'C' | ((board[i][j].player == P1) * 32);
- else if(board[i][j].animal == CAT) c = 'D' | ((board[i][j].player == P1) * 32);
- else if(board[i][j].animal == CAT) c = 'W' | ((board[i][j].player == P1) * 32);
- else if(board[i][j].animal == CAT) c = 'J' | ((board[i][j].player == P1) * 32);
- else if(board[i][j].animal == CAT) c = 'T' | ((board[i][j].player == P1) * 32);
- else if(board[i][j].animal == CAT) c = 'L' | ((board[i][j].player == P1) * 32);
- else if(board[i][j].animal == CAT) c = 'E' | ((board[i][j].player == P1) * 32);
- cout << c;
- }
- cout << endl;
- }
- cout << endl;
- }
- vector<move_struct> generate_possible_moves() {
- vector<move_struct> possible_moves;
- pss my_den = (player == P1 ? make_pair(0, 3) : make_pair(8, 3));
- for(int animal = 1; animal < 9; animal++) {
- if(animal_poss[player][animal] == (pss) {-1, -1}) continue; //jeśli to zwierze jest zbite
- for(auto s: shift){
- pss poss = {animal_poss[player][animal].fi + s.fi, animal_poss[player][animal].se + s.se};
- //początkowe / ogólne sprawdzenia
- if(!valid_coord(poss)) continue; //jeśli wychodzimy poza plansza
- if(board[poss.fi][poss.se].animal != NO_ANIMAL && board[poss.fi][poss.se].player == player) continue; // jeśli w poss znajduje się zwierze i to nasze zwierze
- if(poss == my_den) continue; //jeśli whodzimy do swojej jamy
- if(animal != RAT && animal != TIGER && animal != LION && tile_type[poss.fi][poss.se] == RIVER) continue; // tylko szczur może wchodzić do wody,a tygrys i lew mogą nad nią skakać
- switch(animal) {
- case RAT:
- if(tile_type[poss.fi][poss.se] != TRAP && board[poss.fi][poss.se].animal > RAT && board[poss.fi][poss.se].animal != ELEPHANT) continue;
- if(tile_type[animal_poss[player][animal].fi][animal_poss[player][animal].se] == RIVER && tile_type[poss.fi][poss.se] != RIVER && board[poss.fi][poss.se].animal) continue; //jeśli szczur był w wodzi i z niej wychodzi to nie może bić
- possible_moves.push_back({animal_poss[player][animal], s});
- break;
- case CAT:
- if(tile_type[poss.fi][poss.se] != TRAP && board[poss.fi][poss.se].animal > CAT) continue;
- possible_moves.push_back({animal_poss[player][animal], s});
- break;
- case DOG:
- if(tile_type[poss.fi][poss.se] != TRAP && board[poss.fi][poss.se].animal > DOG) continue;
- possible_moves.push_back({animal_poss[player][animal], s});
- break;
- case WOLF:
- if(tile_type[poss.fi][poss.se] != TRAP && board[poss.fi][poss.se].animal > WOLF) continue;
- possible_moves.push_back({animal_poss[player][animal], s});
- break;
- case JAGUAR:
- if(tile_type[poss.fi][poss.se] != TRAP && board[poss.fi][poss.se].animal > JAGUAR) continue;
- possible_moves.push_back({animal_poss[player][animal], s});
- break;
- case TIGER:
- if(tile_type[poss.fi][poss.se] != TRAP && board[poss.fi][poss.se].animal > TIGER) continue;
- if(tile_type[poss.fi][poss.se] == RIVER) poss = make_jump_over_water(poss, animal, s);
- if(poss == (pss){-1, -1}) continue;
- possible_moves.push_back({animal_poss[player][animal], s});
- break;
- case LION:
- if(tile_type[poss.fi][poss.se] != TRAP && board[poss.fi][poss.se].animal > LION) continue;
- possible_moves.push_back({animal_poss[player][animal], s});
- break;
- case ELEPHANT:
- if(tile_type[poss.fi][poss.se] != TRAP && board[poss.fi][poss.se].animal > ELEPHANT) continue;
- possible_moves.push_back({animal_poss[player][animal], s});
- break;
- }
- }
- }
- }
- inline pss make_jump_over_water(pss poss, int animal, pss s){
- while(tile_type[poss.fi][poss.se] == RIVER){
- if(board[poss.fi][poss.se].animal > 0){ //trafiliśmy na szczura
- poss = {-1, -1};
- break;
- }
- poss.fi += s.fi, poss.se += s.se; //lecimy dalej jak Jordan
- }
- if(board[poss.fi][poss.se].player == player || board[poss.fi][poss.se].animal > animal) poss = {-1, -1}; //przeskoczyliśmy wode ale wskakujemy na nasze inne zwierze albo na zwirze przeciwnika o większej mocy
- return poss;
- }
- inline bool end_game(){
- return board[0][3].animal || board[8][3].animal;
- }
- };
- void make_move(State &s) {
- }
- int main(){
- //ustawianie gry
- vector<vector<pon>> init_board(n, vector<pon>(m, {NO_ANIMAL, NO_PLAYER}));
- short player = P1;
- init_board[0][0] = {LION, P1}, init_board[0][6] = {TIGER, P1}, init_board[1][1] = {DOG, P1}, init_board[1][5] = {CAT, P1}, init_board[2][0] = {RAT, P1}, init_board[2][2] = {JAGUAR, P1}, init_board[2][4] = {WOLF, P1}, init_board[2][6] = {ELEPHANT, P1};
- init_board[8][6] = {LION, P2}, init_board[8][0] = {TIGER, P2}, init_board[7][5] = {DOG, P2}, init_board[7][1] = {CAT, P2}, init_board[7][6] = {RAT, P2}, init_board[7][4] = {JAGUAR, P2}, init_board[7][2] = {WOLF, P2}, init_board[7][0] = {ELEPHANT, P2};
- vector<vector<pss>> animal_poss(2, vector<pss>(9));
- animal_poss[P1][LION] = {0, 0}, animal_poss[P1][TIGER] = {0, 6}, animal_poss[P1][DOG] = {1, 1}, animal_poss[P1][CAT] = {1, 5}, animal_poss[P1][RAT] = {2, 0}, animal_poss[P1][JAGUAR] = {2, 2}, animal_poss[P1][WOLF] = {2, 4}, animal_poss[P1][ELEPHANT] = {2, 6};
- animal_poss[P2][LION] = {8, 6}, animal_poss[P2][TIGER] = {8, 0}, animal_poss[P2][DOG] = {7, 5}, animal_poss[P2][CAT] = {7, 1}, animal_poss[P2][RAT] = {7, 6}, animal_poss[P2][JAGUAR] = {7, 4}, animal_poss[P2][WOLF] = {7, 2}, animal_poss[P2][ELEPHANT] = {7, 0};
- State s(player, init_board, animal_poss);
- //graj dopuki ktoś nie wygrał
- while(s.end_game()){
- make_move(s);
- }
- //wypisz kto wygrał
- }
- inline bool valid_coord(pss p){
- return 0 <= p.fi && p.fi < n && 0 <= p.se && p.se < m;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement