Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html lang="pl">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Pentago - web</title>
- <style>
- *{
- transition-duration: .5s;
- margin: 0;
- padding: 0;
- font-family: Arial, Helvetica, sans-serif;
- }
- .info_window{
- width: 800px;
- height: 600px;
- margin-top: -1000px;
- margin-left: 50%;
- transform: translateX(-50%);
- border: 2px solid black;
- position: absolute;
- z-index: 1;
- background-color: white;
- }
- .close_button{
- height: 40px;
- width: 40px;
- display: inline-block;
- }
- .close_button p, .info_button p{
- line-height: 40px;
- font-size: 28px;
- text-align: center;
- }
- .close_button:hover, .info_button:hover{
- color: gray;
- cursor: pointer;
- }
- .info_button{
- height: 40px;
- width: 40px;
- }
- .info p{
- padding: 20px;
- font-size: 20px;
- }
- .main{
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: 340px;
- height: 530px;
- z-index: 0;
- }
- .grid_container{
- display: grid;
- grid-template-columns: 170px 170px;
- grid-template-rows: 95px 170px 170px 95px;
- }
- .grid_container > div{
- padding: 10px;
- }
- .grid_container .rotating_board_part{
- display: grid;
- grid-template-columns: 50px 50px 50px;
- grid-template-rows: 50px 50px 50px;
- }
- .rotating_board_part > div{
- box-sizing: border-box;
- border: 1px solid black;
- background-color: white;
- cursor: pointer;
- }
- .motion_button{
- width: 50px;
- height: 50px;
- background-color: aquamarine;
- border: 1px solid aquamarine;
- color: white;
- box-sizing: border-box;
- margin-left: 50%;
- margin-top: 50%;
- transform: translate(-50%, -50%);
- }
- .motion_button:hover{
- background-color: white;
- color: aquamarine;
- cursor: pointer;
- }
- .motion_button > p{
- line-height: 42px;
- font-size: 30px;
- margin-left: 45%;
- transform: translateX(-50%);
- }
- .motion_controls{
- grid-template-columns: 75px 75px;
- display: grid;
- }
- </style>
- </head>
- <body>
- <div class="info_button"><p>?</p></div>
- <section class="info_window">
- <div class="close_button"><p>✖</p></div>
- <article class="info">
- <p>Gra w Pentago.<br>Pentago jest grą dwuosobową na planszy. Plansza skłąda się z 4 ruchomych części, które można obracać. Każda część zawiera 9 miejsc na żetony.<br>Gracze po kolei oddają ruch składający się z 2 etapów:<br> - dołożenia swojego żetonu na nezajęte pole planszy;<br> - obrót jednej z części planszy o 90 stopni w dowolnym kierunku.<br>Nie można pominąć żadnego etapu ruchu w swojej kolejce.<br>Wygrywa osoba, której 5 żetonów po PEŁNYM RUCHU jest ułożonych w rzędzie/kolumnie/po skosach (podobnie do gry w kółko i krzyżyk).</p>
- </article>
- </section>
- <section class="main">
- <div class="grid_container">
- <div class="motion_controls">
- <div class="motion_button"><p>←</p></div>
- <div class="motion_button"><p>→</p></div>
- </div>
- <div class="motion_controls">
- <div class="motion_button"><p>←</p></div>
- <div class="motion_button"><p>→</p></div>
- </div>
- <div class="rotating_board_part" style="transform: rotate(0deg);"></div>
- <div class="rotating_board_part" style="transform: rotate(0deg);"></div>
- <div class="rotating_board_part" style="transform: rotate(0deg);"></div>
- <div class="rotating_board_part" style="transform: rotate(0deg);"></div>
- <div class="motion_controls">
- <div class="motion_button"><p>←</p></div>
- <div class="motion_button"><p>→</p></div>
- </div>
- <div class="motion_controls">
- <div class="motion_button"><p>←</p></div>
- <div class="motion_button"><p>→</p></div>
- </div>
- </div>
- </section>
- </body>
- <script>
- /*
- ------------------
- DEFINITIONS
- ------------------
- */
- var COLOR_TO_BE = {color: 1};
- var TURN_PAHSES = [false, false];
- var COLORS = ["white", "blue", "red"];
- class Square{
- // 0 -> no color | 1 -> blue | 2 -> red
- color = 0;
- gui_representation;
- constructor(gui_element){
- this.gui_representation = gui_element;
- this.color = {color: 0};
- let color = this.color
- this.gui_representation.addEventListener("click", function (evt){
- if(TURN_PAHSES[0] == false && color.color == 0){
- color.color = COLOR_TO_BE.color;
- evt.currentTarget.style.backgroundColor = COLORS[COLOR_TO_BE.color];
- TURN_PAHSES[0] = true;
- if(COLOR_TO_BE.color == 1) COLOR_TO_BE.color = 2;
- else COLOR_TO_BE.color = 1;
- }
- });
- this.gui_representation.addEventListener("mouseenter", function(evt){
- if(TURN_PAHSES[0] == false && color.color == 0){
- evt.currentTarget.style.backgroundColor = COLORS[COLOR_TO_BE.color];
- evt.currentTarget.style.opacity = 0.5;
- }
- });
- this.gui_representation.addEventListener("mouseleave", function(evt){
- evt.currentTarget.style.backgroundColor = COLORS[parseInt(color.color)];
- evt.currentTarget.style.opacity = 1;
- });
- }
- }
- class RBoard{
- squares = [[0,0,0],[0,0,0],[0,0,0]];
- constructor(table){
- if(table.length == 3 && table[0].length == 3){
- for(let i = 0; i < 3; i++){
- for(let ii = 0; ii < 3; ii++){
- this.squares[i][ii] = table[i][ii];
- }
- }
- }else{
- for(let i = 0; i < 3; i++){
- for(let ii = 0; ii < 3; ii++){
- this.squares[i][ii] = null;
- }
- }
- }
- }
- rotate_clockwise() {
- let tmp_t = [[],[],[]];
- for(let i = 0; i < 3; i++){
- for(let ii = 0; ii < 3; ii++){
- tmp_t[i][ii] = this.squares[i][ii];
- }
- }
- for(let i = 0; i < 3; i++){
- for(let ii = 0; ii < 3; ii++){
- this.squares[i][ii] = tmp_t[2-ii][i];
- }
- }
- }
- rotate_counterclockwise(){
- let tmp_t = [[],[],[]];
- for(let i = 0; i < 3; i++){
- for(let ii = 0; ii < 3; ii++){
- tmp_t[i][ii] = this.squares[i][ii];
- }
- }
- for(let i = 0; i < 3; i++){
- for(let ii = 0; ii < 3; ii++){
- this.squares[i][ii] = tmp_t[ii][2-i];
- }
- }
- }
- }
- class MainBoard{
- r_boards_t = [0,0,0,0];
- squares_map = [[],[],[],[],[],[]];
- constructor(table){
- if(table.length == 4){
- for(let i = 0; i < 4; i++){
- this.r_boards_t[i] = table[i];
- }
- }else{
- for(let i = 0; i < 4; i++){
- this.r_boards_t[i] = null;
- }
- }
- }
- drawBoard(rbt_t){
- for(let i = 0; i < 4; i++){
- for(let ii = 0; ii < 3; ii++){
- for(let iii = 0; iii < 3; iii++){
- rbt_t[i].appendChild(this.r_boards_t[i].squares[ii][iii].gui_representation);
- }
- }
- }
- }
- updateSquaresMap(){
- for(let a = 0; a < 2; a++){
- for(let b = 0; b < 2; b++){
- for(let i = 0; i < 3; i++){
- for(let ii = 0; ii < 3; ii++){
- this.squares_map[i+a*3][ii+b*3] = this.r_boards_t[2*a + b].squares[i][ii];
- }
- }
- }
- }
- }
- checkIfWinner(){
- let red = false;
- let blue = false;
- // horizontal lines
- for(let i = 0; i < 6; i++){
- let red_count = 0;
- let blue_count = 0;
- for(let ii = 0; ii < 6; ii++){
- if(this.squares_map[i][ii].color.color == 1){
- blue_count++;
- }else if(this.squares_map[i][ii].color.color == 2){
- red_count++;
- }
- }
- if(blue_count >= 5 || red_count >= 5){
- let continuity = 1;
- for(let ii = 0; ii < 5; ii++){
- if(this.squares_map[i][ii].color.color == this.squares_map[i][ii+1].color.color){
- continuity++;
- if(continuity == 5){
- if(blue_count >= 5){
- blue = true;
- }else{
- red = true;
- }
- break;
- }
- }else{
- continuity = 1;
- }
- }
- console.log(blue);
- }
- }
- // vertical lines
- for(let i = 0; i < 6; i++){
- let red_count = 0;
- let blue_count = 0;
- for(let ii = 0; ii < 6; ii++){
- if(this.squares_map[ii][i].color.color == 1){
- blue_count++;
- }else if(this.squares_map[ii][i].color.color == 2){
- red_count++;
- }
- }
- if(blue_count >= 5 || red_count >= 5){
- let continuity = 1;
- for(let ii = 0; ii < 5; ii++){
- if(this.squares_map[ii][i].color.color == this.squares_map[ii+1][i].color.color){
- continuity++;
- if(continuity == 5){
- if(blue_count >= 5){
- blue = true;
- }else{
- red = true;
- }
- break;
- }
- }else{
- continuity = 1;
- }
- }
- }
- }
- // diagonals
- // two short diagonals x 2
- let blue_count_t = [0, 0, 0, 0];
- let red_count_t = [0, 0, 0, 0];
- for(let a = 0; a < 5; a++){
- // [1][0] -> [5][4]
- if(this.squares_map[1+a][0+a].color.color == 1){
- blue_count_t[0]++;
- }else if(this.squares_map[1+a][0+a].color.color == 2){
- red_count_t[0]++;
- }
- // [0][1] -> [4][5]
- if(this.squares_map[0+a][1+a].color.color == 1){
- blue_count_t[1]++;
- }else if(this.squares_map[0+a][1+a].color.color == 2){
- red_count_t[1]++;
- }
- // [0][4] -> [4][0]
- if(this.squares_map[0+a][4-a].color.color == 1){
- blue_count_t[2]++;
- }else if(this.squares_map[0+a][4-a].color.color == 2){
- red_count_t[2]++;
- }
- // [1][5] -> [5][1]
- if(this.squares_map[1+a][5-a].color.color == 1){
- blue_count_t[3]++;
- }else if(this.squares_map[1+a][5-a].color.color == 2){
- red_count_t[3]++;
- }
- }
- if(blue_count_t.includes(5)){
- blue = true;
- }
- if(red_count_t.includes(5)){
- red = true;
- }
- // one long diagonal x 2
- blue_count_t = [0, 0];
- red_count_t = [0, 0];
- let continuity_t = [1, 1];
- for(let a = 0; a < 6; a++){
- // [0][0] -> [5][5]
- if(this.squares_map[0+a][0+a].color.color == 1) blue_count_t[0]++;
- else if(this.squares_map[0+a][0+a].color.color == 2) red_count_t[0]++;
- // [0][5] -> [5][0]
- if(this.squares_map[0+a][5-a].color.color == 1) blue_count_t[1]++;
- else if(this.squares_map[0+a][5-a].color.color == 2) red_count_t[1]++;
- }
- if(blue_count_t[0] >= 5 || red_count_t[0] >= 5){
- for(let a = 0; a < 5; a++){
- if(this.squares_map[0+a][0+a].color.color == this.squares_map[0+a+1][0+a+1].color.color){
- continuity_t[0]++;
- if(continuity_t[0] == 5){
- if(blue_count_t[0] >= 5){
- blue = true;
- }else{
- red = true;
- }
- break;
- }
- }else{
- continuity_t[0] = 1;
- }
- }
- }
- if(blue_count_t[1] >= 5 || red_count_t[1] >= 5){
- for(let a = 0; a < 5; a++){
- if(this.squares_map[0+a][5-a].color.color == this.squares_map[0+a+1][5-a-1].color.color){
- continuity_t[1]++;
- if(continuity_t[1] == 5){
- if(blue_count_t[1] >= 5){
- blue = true;
- }else{
- red = true;
- }
- break;
- }
- }else{
- continuity_t[1] = 1;
- }
- }
- }
- let result = 0;
- if(blue && red) result = 3;
- else if(red) result = 2;
- else if(blue) result = 1;
- return result;
- }
- }
- function show_info_window(){
- info_window.style.marginTop = "100px";
- }
- function hide_info_window(){
- info_window.style.marginTop = "-1000px";
- }
- /*
- ------------------------
- SCRIPT -> PREPARATION
- ------------------------
- */
- let rbt_t = document.getElementsByClassName("rotating_board_part");
- let info_button = document.getElementsByClassName("info_button")[0];
- let close_button = document.getElementsByClassName("close_button")[0];
- let info_window = document.getElementsByClassName("info_window")[0];
- let motion_buttons = document.getElementsByClassName("motion_button");
- info_button.addEventListener("click", show_info_window);
- close_button.addEventListener("click", hide_info_window);
- /* BOARD CREATION */
- let r_table = [0, 0, 0, 0];
- for(let i = 0; i < 4; i++){
- let sq_table = [[[],[],[]], [[],[],[]], [[],[],[]], [[],[],[]]];
- for(let ii = 0; ii < 3; ii++){
- for(let iii = 0; iii < 3; iii++){
- let r = document.createAttribute("r");
- let x = document.createAttribute("x");
- let y = document.createAttribute("y");
- r.value = i;
- x.value = ii;
- y.value = iii;
- // r and (x; y) -> r_table[r][x][y]
- let gui_element = document.createElement("div");
- gui_element.attributes.setNamedItem(r);
- gui_element.attributes.setNamedItem(x);
- gui_element.attributes.setNamedItem(y);
- // gui_element, color_to_be, turn_phases, colors
- sq_table[i][ii].push(new Square(gui_element, COLOR_TO_BE, TURN_PAHSES, COLORS));
- }
- }
- r_table[i] = new RBoard(sq_table[i]);
- }
- let main_board = new MainBoard(r_table);
- /* BOARD ON SCREEN */
- main_board.drawBoard(rbt_t);
- /* BUTTONS FUNCTIONALITY */
- for(let i = 0; i < 8; i++){
- motion_buttons[i].addEventListener("click", function(){
- // style placed in HTML elements
- if(TURN_PAHSES[0] == true && TURN_PAHSES[1] == false){
- let element = rbt_t[Math.floor(i/2)];
- let rotation = element.style.transform;
- let in_value = (rotation.split('(')[1]).split('d')[0];
- let out_value = (i % 2 == 0) ? (parseInt(in_value, 10) - 90) : (parseInt(in_value, 10) + 90);
- element.style = "transform: rotate(" + out_value + "deg);";
- // rotation of internal arrays
- if(i % 2 == 0){
- main_board.r_boards_t[Math.floor(i/2)].rotate_counterclockwise();
- }else{
- main_board.r_boards_t[Math.floor(i/2)].rotate_clockwise();
- }
- TURN_PAHSES[1] = true;
- }
- });
- }
- /*
- ------------------------
- SCRIPT -> GAMEPLAY
- ------------------------
- */
- // blue starts
- var game = window.setInterval(function(){
- if(TURN_PAHSES[0] == true && TURN_PAHSES[1] == true){
- main_board.updateSquaresMap();
- let result = main_board.checkIfWinner();
- if(result == 1){
- alert("BLUE WINS!");
- clearInterval(game);
- }else if(result == 2){
- alert("RED WINS!");
- clearInterval(game);
- }else if(result == 3){
- alert("IT IS A TIE!");
- clearInterval(game);
- }else{
- TURN_PAHSES = [false, false];
- }
- }
- },100);
- </script>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement