Guest User

Kalapeli

a guest
Aug 2nd, 2023
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 15.78 KB | Gaming | 0 0
  1. const gameVersion = "v0.6.0"
  2.  
  3. var movementInterval; // Muuttuja liikkeen päivitystä varten
  4.  
  5. let gameDifficulty = 0;
  6.  
  7. // Määritä enimmäiskalatilanne peliruudulla
  8. // NOTICE const alkuliite muutettu, jotta pelin vaikeutumisen yhteydessä ruudussa olevien kalojen määrää voidaan lisätä
  9. let maxFishCount = 5; // Esimerkki: Enimmillään ruudulla voi olla 5 kalaa samanaikaisesti
  10.  
  11. var gameOver = false; // Alustetaan peli lopetetuksi
  12.  
  13. var score = 0; // Alustetaan pistemäärä nollaksi
  14.  
  15. // NOTICE lisätty muuttuja, johon ChatGPT on viitannut luomassaan koodissa
  16. let normalSpeed = 1
  17.  
  18. // NOTICE lisätty muuttuja, johon ChatGPT on viitannut luomassaan koodissa
  19. let time = 0
  20.  
  21. // Alkuperäinen pelaajan kalan position arvo
  22. var initialPlayerPosition = 150;
  23.  
  24. var fishCount = 0; // Alustetaan generoitujen kalojen määrä nollaksi
  25.  
  26. // Pelaajan kalan tiedot
  27. var playerFish = {
  28.   id: 1,
  29.   // NOTICE lisätty muuttuja ChatGPT'n muuttuja viittauksen pohjalta
  30.   positionX: 40, // NOTICE arvoa muutettu, ettei kala ole pelialueen reunassa kiinni
  31.   positionY: initialPlayerPosition,
  32.   position: 30,
  33.   level: 1,
  34.   color: "orange",
  35.   // NOTICE nopeus arvo muutettu takaisin alkuperäiseen kuosiinsa (Viimeisin keskustelu, versio v0.2.1)
  36.   speed: normalSpeed,
  37.   width: 50, // Kalan leveys
  38.   height: 30, // Kalan korkeus
  39.   eye: {
  40.     x: 38,
  41.     y: -5,
  42.     radius: 5
  43.   },
  44.   pupil: {
  45.     x: 1,
  46.     y: 0,
  47.     radius: 2.5
  48.   }
  49. };
  50.  
  51. const fishColorsData = [
  52.   {
  53.     color: "red",
  54.     width: 56,
  55.     height: 36,
  56.     eye: { x: 12, y: -5, radius: 6},
  57.     pupil: { x: -1, y: 0, radius: 3},
  58.     onCollision: (playerFish) => {
  59.       // Tämä funktio kutsutaan, kun pelaajan kala törmää punaiseen kalaan
  60.       // Voit toteuttaa tässä vaikutuksen, jonka punainen kala aiheuttaa
  61.       // Esim. vähennä pelaajan elämiä tai lisää pelin nopeutta
  62.       console.log("Peli päättyi! Punainen kala osui pelaajan kalaa.");
  63.       gameOver = true;
  64.     },
  65.   },
  66.   // Lisää muut kalalajit ja niiden vaikutusfunktiot tarpeen mukaan
  67.   {
  68.     color: "yellow",
  69.     width: 37,
  70.     height: 24,
  71.     eye: { x: 11, y: -3, radius: 4},
  72.     pupil: { x: -1, y: 0, radius: 2},
  73.     onCollision: (fish) => {  // NOTICE argumentti muutettu (playerFish -> fish)
  74.       console.log("Pelaaja sai pisteen!");
  75.       // NOTICE funktio kutsu lisätty
  76.       addPoints(1)
  77.      
  78.       // Poista kala fishList-listalta
  79.       var fishIndex = fishList.indexOf(fish);
  80.       if (fishIndex !== -1) {
  81.         fishList.splice(fishIndex, 1);
  82.       }
  83.   },
  84.   },
  85.     {
  86.     color: "blue",
  87.     width: 26,
  88.     height: 26,
  89.     // NOTICE kupla ei tarvitse silmään liittyviä tietoja
  90.     // eye: { x: 15, y: 10, radius: 5 },
  91.     // pupil: { x: 16, y: 10, radius: 2 },
  92.     onCollision: (fish) => {  // NOTICE argumentti muutettu (playerFish -> fish)
  93.       console.log("Pelaaja sai kolme pistettä kuplasta!");
  94.       // NOTICE funktio kutsu lisätty
  95.       addPoints(3)
  96.  
  97.       // Poista kupla fishList-listalta
  98.       var fishIndex = fishList.indexOf(fish);
  99.       if (fishIndex !== -1) {
  100.         fishList.splice(fishIndex, 1);
  101.       }
  102.     },
  103.     // Arvotaan nopeus välillä 1-5
  104.     getSpeed: () => {
  105.       // NOTICE painotuksia muutettu   
  106.       const speeds = [1.5, 1.0, 0.8];
  107.       const probabilities = [0.7, 0.2, 0.1];
  108.  
  109.       // Arvotaan satunnainen indeksi painotetulla todennäköisyydellä
  110.       const random = Math.random();
  111.       let cumulativeProbability = 0;
  112.       for (let i = 0; i < speeds.length; i++) {
  113.       cumulativeProbability += probabilities[i];
  114.       if (random < cumulativeProbability) {
  115.       return speeds[i];
  116.       }
  117.   }
  118.  
  119.   // Oletuksena palautetaan nopeus 1.2, jos kaikki todennäköisyydet ovat nollia
  120.   return 1.2;
  121.     },
  122.   },
  123. ];
  124.  
  125. // Luo uuden kalalistan, johon lisätään muut kalaobjektit
  126. var fishList = [];
  127.  
  128. // NOTICE funktio lisätty ChatGPT'n viittauksen perusteella
  129. function getVersion() {
  130.     return gameVersion
  131. }
  132.  
  133. // Aloita peli
  134. function startGame() {
  135.   // NOTICE Muuttujat on säästetty funktion edellisestä versiosta
  136.   fishList = [];
  137.   score = 0;
  138.  
  139.   fishCount = 0; // Nollaa generoitujen kalojen määrä
  140.  
  141.   // NOTICE lisätty nollauksia
  142.   gameDifficulty = 0;
  143.   maxFishCount = 5;
  144.   normalSpeed = 1;
  145.   time = 0
  146.  
  147.   // Palauta pelaajan kalan position alkuperäiseen arvoon
  148.   playerFish.positionY = initialPlayerPosition;
  149.  
  150.   // Päivitä pistemäärän näyttö
  151.   document.getElementById("score-display").textContent = score;
  152.  
  153.   canvas.removeEventListener("click", startGame);
  154.   gameOver = false;
  155.   updateGame();
  156. }
  157.  
  158. // Funktio, joka lisää pelaajalle pisteitä
  159. function addPoints(points) {
  160.   score += points;
  161.   // Voit tässä päivittää myös näytöllä näkyvää pistetilannetta tarvittaessa
  162. }
  163.  
  164. //
  165. function getRandomColor() {
  166.   const colors = ["red", "yellow", "blue"];
  167.  
  168.   // Muokkaa todennäköisyyslistaa vaikeustason perusteella
  169.   let probabilities;
  170.  
  171.   if (gameDifficulty >= 4) {
  172.     const redProbability = 0.45 + (gameDifficulty - 4) * 0.02; // Punaisen todennäköisyys nousee 1-2% jokaisella vaikeustason nousulla
  173.     const yellowProbability = 0.45 - (gameDifficulty - 4) * 0.02; // Keltaisen todennäköisyys laskee 1-2% jokaisella vaikeustason nousulla
  174.     probabilities = [redProbability, yellowProbability, 0.1]; // Sininen pysyy samana (10%)
  175.   } else if (gameDifficulty >= 2) {
  176.     probabilities = [0.4, 0.45, 0.15]; // Punainen 40%, keltainen 45%, sininen 15%
  177.   } else if (gameDifficulty >= 1) {
  178.     probabilities = [0.35, 0.65, 0]; // Punainen 35%, keltainen 65%, sininen 0%
  179.   } else {
  180.     probabilities = [0.25, 0.75, 0]; // Punainen 25%, keltainen 75%, sininen 0%
  181.   }
  182.  
  183.   // Arvotaan satunnainen indeksi painotetulla todennäköisyydellä
  184.   const random = Math.random();
  185.   let cumulativeProbability = 0;
  186.   for (let i = 0; i < colors.length; i++) {
  187.     cumulativeProbability += probabilities[i];
  188.     if (random < cumulativeProbability) {
  189.       // console.log(random + " - " + cumulativeProbability + " = " + colors[i] + " (" + i +")" + "(" + gameDifficulty +")")
  190.       return colors[i];
  191.     }
  192.   }
  193.  
  194.   console.log("Kalaa ei arvottu? " + random)
  195.   // Oletuksena palautetaan sininen, jos kaikki todennäköisyydet ovat nollia (esim. vaikeustasolla 0)
  196.   return "yellow";
  197. }
  198.  
  199. // NOTICE Joitakin osia tuotu vanhasta generaattorista
  200. function generateFish() {
  201.   // Arvo satunnainen väri
  202.   const randomColor = getRandomColor()
  203.  
  204.   // Etsi vastaava kala-objekti fishColorsData-listasta
  205.   const fishData = fishColorsData.find((fish) => fish.color === randomColor);
  206.  
  207.   if (fishData) {
  208.     // Jos löydettiin kala-objekti, käytä getSpeed-funktiota tai arvo normaali nopeus
  209.     const speed = fishData.getSpeed ? fishData.getSpeed() : Math.random() < 0.12 ? 1.5 : 1; // getRandomNumber(1, 5);
  210.    
  211.     // Generoidaan kalan sijainti ja muut ominaisuudet
  212.     const positionX = gameWidth;
  213.     //NOTICE Arvontaa muutettu kalan piirron muutoksen vuoksi + sijanti tiedot siirretty myöhemmälle kalojen vaihtelevan koon vuoksi
  214.     const positionY = Math.floor(Math.random() * (gameHeight - fishData.height) + fishData.height / 2); // Satunnainen korkeus (20-260); // Arvo satunnainen sijainti pystysuunnassa
  215.    
  216.     const newFish = {
  217.       // DEBUG pidetään toistaiseksi kalan ominaisuutena  
  218.       level: Math.floor(Math.random() * playerFish.level) + 1, // Satunnainen taso (1-pelaajan taso)
  219.        
  220.       id: fishCount + 2, // Lisää 2 id:hen, jotta huomioi pelaajan kalan
  221.       color: fishData.color,
  222.       positionX,
  223.       positionY,
  224.       speed,
  225.       width: fishData.width,
  226.       height: fishData.height,
  227.       eye: { ...fishData.eye }, // Kopioidaan silmä-objekti uuteen kalahaamuun
  228.       pupil: { ...fishData.pupil }, // Kopioidaan pupilli-objekti uuteen kalahaamuun
  229.       onCollision: fishData.onCollision,
  230.       // Lisää muut kalan ominaisuudet tarpeen mukaan
  231.     };
  232.    
  233.     fishList.push(newFish); // Lisää uusi kalaobjekti kalalistaan
  234.     fishCount++; // Kasvata generoitujen kalojen määrää yhdellä
  235.   } else {
  236.       console.log("Arvottua kalaa ei löytynyt!")
  237.   }
  238. }
  239.  
  240. // Määritä pistemäärärajat eri vaikeustasoille
  241. const difficultyThresholds = {
  242.   1: 10, // Esimerkki: 10 pistettä vaaditaan vaikeustason 1 saavuttamiseen
  243.   2: 25, // Esimerkki: 20 pistettä vaaditaan vaikeustason 2 saavuttamiseen
  244.   3: 40  // Esimerkki: 30 pistettä vaaditaan vaikeustason 3 saavuttamiseen
  245. };
  246.  
  247. // Päivitä pelin vaikeustaso ja pelinopeus pelaajan pisteiden perusteella
  248. function updateGameDifficulty(score) {
  249.   // Tarkista, onko saavutettu uusi vaikeustaso
  250.   for (const difficultyLevel in difficultyThresholds) {
  251.     if (score >= difficultyThresholds[difficultyLevel] && difficultyLevel > gameDifficulty) {
  252.       // Päivitä vaikeustaso ja pelinopeus
  253.       // NOTICE muuteettu nostamaan vaikeus tasoa
  254.       gameDifficulty += 1 // = parseInt(difficultyLevel);
  255.       normalSpeed += 0.5; // Esimerkki: Kasvata pelinopeutta 0.5 yksikköä uutta vaikeustasoa kohti
  256.       console.log(`Uusi vaikeustaso: ${gameDifficulty}`);
  257.       break; // Poistu silmukasta, kun ensimmäinen uusi vaikeustaso on löytynyt
  258.     }
  259.   }
  260. }
  261.  
  262. function checkCollision_OLD(playerFish, fish) {
  263.   // Tarkista, osuvatko kalojen rajat toisiinsa
  264.   // NOTICE törmäys tarkastusta hienosäädetty
  265.   if (
  266.     // playerFish.positionX < fish.positionX + fish.width && // alkuperäinen
  267.     // NOTICE kalojen törmäystä säädetty
  268.     playerFish.positionX + playerFish.width / 2 < fish.positionX + fish.width / 2 &&
  269.     playerFish.positionX + playerFish.width > fish.positionX &&
  270.     playerFish.positionY < fish.positionY + fish.height  &&
  271.     playerFish.positionY + playerFish.height > fish.positionY
  272.   ) {
  273.     return true; // Osuvat yhteen
  274.   }
  275.  
  276.   return false; // Eivät osu yhteen
  277. }
  278.  
  279. function checkCollision(playerFish, fish) {
  280.   // Lasketaan kalojen keskipisteiden välinen etäisyys
  281.   // NOTICE laskentaa korjattu
  282.   const distanceX = (playerFish.positionX + playerFish.width - playerFish.height / 2) - (fish.positionX + fish.height/ 2);
  283.   const distanceY = (playerFish.positionY) - (fish.positionY);
  284.   const distance = Math.sqrt(distanceX ** 2 + distanceY ** 2);
  285.  
  286.   // Lasketaan pelaajan ohjaaman kalan säde
  287.   const playerFishRadius = playerFish.height / 2;
  288.  
  289.   // Lasketaan viholliskalan säde
  290.   const fishRadius = fish.height / 2;
  291.  
  292.   // Tarkistetaan, osuvatko kalojen rajat toisiinsa
  293.   if (distance < playerFishRadius + fishRadius) {
  294.     return true; // Osuvat yhteen
  295.   }
  296.  
  297.   return false; // Eivät osu yhteen
  298. }
  299.  
  300. // Pelin päätyttyä tarkista tulosennätys
  301. // NOTICE funktion nimi muutettu sekannuksen välttämiseksi
  302. function updateGameOver() {
  303.   // NOTICE funktio kutsu muutettu muuttuja kutsuksi   
  304.   const finalScore = score; // Oletetaan, että game.js-tiedostossa on metodi getScore() palauttamaan pelaajan pisteet
  305.   const highScore = checkHighScore(finalScore);
  306.   saveHighScore(highScore);
  307.   updateHighScoreElement();
  308.   // Muut pelin lopettamiseen liittyvät toimenpiteet...
  309. }
  310.  
  311. // Päivittää pelitapahtumat ja liikuttaa kaloja
  312. function updateGame() {
  313.   // Päivitä muut kalaobjektit
  314.   for (var i = 0; i < fishList.length; i++) {
  315.     var fish = fishList[i];
  316.     // NOTICE Kalan "fish.level" ominaisuus vaihdettu pelin perus nopeuteen "normalSpeed"
  317.     fish.positionX -= normalSpeed * fish.speed * 2;
  318.    
  319.     // *** Lisätty ChatGPT'n luomaa koodia
  320.     // Tarkista, onko kala edennyt pelialueen reunan ohi
  321.     if (fish.positionX < -fish.width) {
  322.       // Poista kala listalta
  323.       fishList.splice(i, 1);
  324.     }
  325.    
  326.     if (checkCollision(playerFish, fish)) {
  327.       console.log(fish)
  328.       fish.onCollision(fish); // Suoritetaan kalan "onCollision" -funktio törmäyksen tapahtuessa
  329.       // Tässä voit tehdä muutakin logiikkaa, jos tarpeen
  330.       document.getElementById("score-display").textContent = score;
  331.     }
  332.   }
  333.  
  334.   // NOTICE funktio kutsu lisätty
  335.   renderGame(fishList, playerFish)
  336.    
  337.   // NOTICE muuttuja viittausta muokattu vastaamaan aiempaa koodia
  338.   updateGameDifficulty(score);
  339.  
  340.   // Generoi uusi kala satunnaisesti
  341.   // NOTICE generointi tiheyttä muutettu
  342.   if (Math.random() < 0.013) { // Voit säätää generointitiheyttä muuttamalla lukua
  343.     //  && fishList.length < maxFishCount ChatGPT'n luomaa ominaisuutta ei vielä lisätty
  344.     generateFish();
  345.   }
  346.  
  347.   // Tarkista, onko peli päättynyt
  348.   if (!gameOver) {
  349.     requestAnimationFrame(updateGame);
  350.   } else {
  351.     // NOTICE drawGameOver metodin paikkaa muutettu
  352.     drawGameOver();
  353.     updateGameOver()
  354.   }
  355.  
  356.   time += 1 * normalSpeed;
  357. }
  358.  
  359. function startMoving(direction) {
  360.   // Tarkista, että liike ei ole jo käynnissä
  361.   if (!movementInterval) {
  362.     movementInterval = setInterval(function () {
  363.       // Päivitä pelaajan kalan sijaintia haluttuun suuntaan
  364.       updatePlayerFishPosition(direction);
  365.     }, 10); // Päivitä liike pienellä aikavälillä (esim. 10 ms)
  366.   }
  367. }
  368.  
  369. function stopMoving() {
  370.   // Pysäytä liike ja tyhjennä interval-muuttuja
  371.   clearInterval(movementInterval);
  372.   movementInterval = null;
  373. }
  374.  
  375. document.addEventListener("keydown", function (event) {
  376.   // Tarkista, minkä nuolinäppäimen tapahtuma laukaisi
  377.   switch (event.keyCode) {
  378.     case 38: // Nuolinäppäin ylös
  379.       startMoving("up");
  380.       break;
  381.     case 40: // Nuolinäppäin alas
  382.       startMoving("down");
  383.       break;
  384.   }
  385. });
  386.  
  387. document.addEventListener("keyup", function (event) {
  388.   // Tarkista, minkä nuolinäppäimen tapahtuma laukaisi
  389.   switch (event.keyCode) {
  390.     case 38: // Nuolinäppäin ylös
  391.     case 40: // Nuolinäppäin alas
  392.       stopMoving();
  393.       break;
  394.   }
  395. });
  396.  
  397. // NOTICE Muutettu "playerFish.position" viittaus muotoon "playerFish.positionY"
  398. function updatePlayerFishPosition(direction) {
  399.   // Päivitä pelaajan kalan sijaintia haluttuun suuntaan
  400.   if (direction === "up") {
  401.     playerFish.positionY -= playerFish.speed;
  402.   } else if (direction === "down") {
  403.     playerFish.positionY += playerFish.speed;
  404.   }
  405.  
  406.   // Varmista, että pelaajan kala pysyy pelialueella
  407.   // NOTICE pelaajan kalan liikettä säädetty piirrossa tehdyn muutoksen vuoksi
  408.   if (playerFish.positionY < playerFish.height / 2) {
  409.     playerFish.positionY = playerFish.height / 2;
  410.   } else if (playerFish.positionY > gameHeight - playerFish.height / 2) {
  411.     playerFish.positionY = gameHeight - playerFish.height / 2;
  412.   }
  413. }
  414.  
  415. // NOTICE lisätty funktio kutsut jo olemassa oleviin funktioigin
  416. // Kuunnellaan napin painalluksia
  417. document.getElementById('move-up').addEventListener('mousedown', function() {
  418.   // moveDirection = 1; // Pelaaja liikkuu ylös kun painetaan
  419.   startMoving("up");
  420. });
  421. document.getElementById('move-up').addEventListener('mouseup', function() {
  422.   // moveDirection = 0; // Pelaaja pysähtyy kun päästetään nappi
  423.   stopMoving();
  424. });
  425.  
  426. document.getElementById('move-down').addEventListener('mousedown', function() {
  427.   // moveDirection = -1; // Pelaaja liikkuu alas kun painetaan
  428.   startMoving("down");
  429. });
  430. document.getElementById('move-down').addEventListener('mouseup', function() {
  431.   // moveDirection = 0; // Pelaaja pysähtyy kun päästetään nappi
  432.   stopMoving();
  433. });
  434.  
  435. // Tämä lisää tapahtumakuuntelijan "touchstart" -tapahtumalle, joka toimii mobiililaitteilla
  436. document.getElementById('move-up').addEventListener('touchstart', () => {
  437.   startMoving("up");
  438. });
  439.  
  440. // Tämä lisää tapahtumakuuntelijan "touchstart" -tapahtumalle, joka toimii mobiililaitteilla
  441. document.getElementById('move-down').addEventListener('touchstart', () => {
  442.   startMoving("down");
  443. });
  444.  
  445. // Tämä lisää tapahtumakuuntelijan "touchstart" -tapahtumalle, joka toimii mobiililaitteilla
  446. document.getElementById('move-up').addEventListener('touchend', () => {
  447.   stopMoving();
  448. });
  449.  
  450. // Tämä lisää tapahtumakuuntelijan "touchstart" -tapahtumalle, joka toimii mobiililaitteilla
  451. document.getElementById('move-down').addEventListener('touchsend', () => {
  452.   stopMoving();
  453. });
  454.  
  455. // Kutsu drawGameOver-funktiota pelin alussa
  456. // NOTICE "updateHighScore" -funktio kutsu lisätty
  457. updateHighScoreElement()
  458. drawStartGame();
Add Comment
Please, Sign In to add comment