• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Memory game, JavaScript ,

Object Storage Arubacloud
+2 głosów
334 wizyt
pytanie zadane 30 stycznia 2022 w JavaScript przez ferdynand Obywatel (1,250 p.)

Siema,

Zacząlem tworzyć memory game. Po klkniciue w diva, ktory znajduje sie na planszy, chce by dodawalo do niego dziecko 'img' z tablicy i jest ok, dodaje tak jak chcialem. Teraz chcialbym w if napisac warunek ze jezeli np ten div ma juz zdjecie, czyli ma juz klase 'has-img' nie mozesz do niego dodac dziecka. Jest możliwe cos takiego ??? . Poprostu chce, aby img juz bylo i nie mogelo sie dodac kolejny raz . Szukam dłuższą chwile, ale nie moge tego znalesc. Bede wdzieczny za pomoc i jesli ktoś mógłby luknąc na kod i powiedziec mi czy idzie to w dobrym kierunku :)  Pozdrawiam :)

  <div data-aos-delay="800" data-aos="fade-right" class="moves-scores">
     <!--  liczba punktów -->
     <p>score</p>
    <div class="score"></div>
    <!--  liczba ruchów -->
    <p>moves</p>
    <div class="moves"></div>
    </div>
    <div data-aos-delay="500" data-aos="fade-down" class="parent">
    <h1>Memory game</h1>
    <div class="board">
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
       <div></div>
    </div>
</div>

<div data-aos-delay="800" data-aos="fade-left" class="timer-buttons">
<button class="start">start</button>
<button class="pause">pause</button>
<button class="restart">restart</button>
<div class="timer"><p>00 : 00</p></div>
</div>
    
const board = document.querySelector('.board')

const images = [...document.querySelectorAll('.board > div')];

// Tablica z której bede pobierać zdjęcia.
let imagesArray = [
    'images/chesse.png', 
    'images/cola.png', 
    'images/cupcake.png', 
    'images/fries.png', 
    'images/hamburger.png', 
    'images/icecream.png',
    'images/pancake.png',  
    'images/pizza.png', 
    'images/chesse.png', 
    'images/cola.png', 
    'images/cupcake.png', 
    'images/fries.png', 
    'images/hamburger.png', 
    'images/icecream.png',
    'images/pancake.png',  
    'images/pizza.png'];

function drawImages() {
    images.forEach(image => {
        image.addEventListener('click', () => {

        let randomImg = imagesArray.splice(Math.floor(Math.random() * imagesArray.length),1)[0];
        const img = document.createElement('img');
        img.src = randomImg;
        image.appendChild(img);
        image.classList.add('has-img');
        })
    })
    
}
drawImages();

 

2 odpowiedzi

+3 głosów
odpowiedź 30 stycznia 2022 przez qax Dyskutant (8,060 p.)
wybrane 30 stycznia 2022 przez ferdynand
 
Najlepsza

Musisz po prostu sprawdzić po kliknięciu czy dany div zawiera klasę .has-img za pomocą metody .classList.contains() np.:

function drawImages() {
    images.forEach(image => {
        image.addEventListener('click', () => {
          if (!this.classList.contains('has-img') {
          let randomImg = imagesArray.splice(Math.floor(Math.random() * imagesArray.length),1)[0];
          const img = document.createElement('img');
          img.src = randomImg;
          image.appendChild(img);
          image.classList.add('has-img');
        })
        }
    })
}

1. https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/contains

2. https://developer.mozilla.org/pl/docs/Web/API/Element/classList

komentarz 30 stycznia 2022 przez ferdynand Obywatel (1,250 p.)
Przepraszam, bo chyba zle sformuowałem pytanie, bardziej chodziło mi o to. Co mam wpisac nie w warunku, a w if, żeby takiego dziecka nie dodało drugi raz, dawałem taki warunke jaki mi podałeś na początku, ale nie o warunek chodzi a to, że jesli dany div.classlist.contains('has-img") to kiedy w niego klikne nie moge juz do niego dodac dziecka.  

 if (image.classList.contains('has-img')) {

             ...nie mozesz dodac dziecka...

          }
1
komentarz 30 stycznia 2022 przez qax Dyskutant (8,060 p.)
Hmmm... Przecież dlatego w if-ie wstawiłem na początku znak negacji (!). Czy z nim też nie działa?
komentarz 30 stycznia 2022 przez ferdynand Obywatel (1,250 p.)

kurcze teraz działa, zamiast this musialem dac poprostu image. Dziękuje pięknie za pomoc i pozdrawiam.wink 

1
komentarz 30 stycznia 2022 przez qax Dyskutant (8,060 p.)

Pozdrawiam wzajemnie smiley

PS. Faktycznie nie zauważyłem, że tam jest pętla forEach i this nie zadziała...

2
komentarz 30 stycznia 2022 przez ScriptyChris Mędrzec (190,190 p.)

this wewnątrz event listenera powinno zadziałać (tj. wskazać element, do którego jest podpięty listener) jeśli funkcja nie będzie strzałkowa.

+2 głosów
odpowiedź 30 stycznia 2022 przez VBService Ekspert (253,280 p.)
edycja 31 stycznia 2022 przez VBService

Możesz także załadować obrazki po kliknięciu button-a start,  a w imge.click dodać tylko "obracanie" (pojawienie się obrazka) karty itp.

 

przyklad

<div data-aos-delay="800" data-aos="fade-right" class="moves-scores">
  <!--  liczba punktów -->
  <p>score</p>
  <div class="score"></div>
  <!--  liczba ruchów -->
  <p>moves</p>
  <div class="moves"></div>
</div>
<div data-aos-delay="500" data-aos="fade-down" class="parent">
  <h1>Memory game</h1>
  <div class="board">
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
  </div>
</div>

<div data-aos-delay="800" data-aos="fade-left" class="timer-buttons">
  <button class="start">start</button>
  <button class="pause">pause</button>
  <button class="restart">restart</button>
  <div class="timer"><p>00 : 00</p></div>
</div>
* {
  box-sizing: border-box;
}
.board {
  max-width: 620px;
}
.board div {
  display: inline-block;
  width: 150px;
  height: 200px;
  border: 2px solid rgba(0,0,0,0.2);
  transition: border-color .65s ease-in-out;
  overflow: hidden;
}
.board div:hover {
  border-color: rgba(0,0,0,1);
}
.board div img {
  opacity: 0;
  transition: opacity 0.5s;
}
const board = document.querySelector('.board'),
      cards = board.querySelectorAll('div'),
      start_button = document.querySelector('.start');

// Tablica z której bede pobierać zdjęcia.
const imagesArray = [
  'https://picsum.photos/150/200/?random=1', 
  'https://picsum.photos/150/200/?random=2', 
  'https://picsum.photos/150/200/?random=3',
  'https://picsum.photos/150/200/?random=4',
];

start_button.addEventListener('click', start);

function start() {
  start_button.disabled = true;
  initializeBoard();
}

function initializeBoard() {
  for (let card of cards) {
    const img = document.createElement('IMG');
    img.src = imagesArray[randomIndex()];
    card.appendChild(img);
    img.addEventListener('click', checkCard);
    img.addEventListener('dragstart', (e) => { e.preventDefault(); });
  }
}

function checkCard(e) {
  const card = e.target;
  if (card.style.opacity == 0) {
    card.style.opacity = 1;
    setTimeout(() => {
      card.style.opacity = 0;
    }, 2000); 
  }
}

function randomIndex() {
  return Math.floor(Math.random() * imagesArray.length);
}

 

Podobne pytania

+3 głosów
0 odpowiedzi 168 wizyt
pytanie zadane 21 lutego 2022 w JavaScript przez ferdynand Obywatel (1,250 p.)
0 głosów
1 odpowiedź 898 wizyt
pytanie zadane 13 lutego 2019 w JavaScript przez Szymson Nowicjusz (120 p.)
0 głosów
1 odpowiedź 285 wizyt
pytanie zadane 4 marca 2022 w JavaScript przez Bakkit Dyskutant (7,600 p.)

92,566 zapytań

141,420 odpowiedzi

319,613 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...