1 dk, tahmini okuma süresi
Muhtemelen zaten bildiğiniz araçlarla sadece 15 dakikada bir oyun oluşturun. Oyunu başlatmak ve çalıştırmak için gereken tüm kodlar gönderide, ancak daha iyi olabilecek bir çok yönü var. Nasıl çalıştığını anladıktan sonra kendinize meydan okuyarak oyunu geliştirebilirsiniz.
Basitçe tanımlamak gerekirse, eşleşen resimleri bularak oyunu kazanmaya çalışıyoruz. Endişelenmeyin, web geliştirmeye yeni başlayan biriyseniz, kod sizin de anlayabileceğiniz kadar kolay. HTML ve CSS gayet temel ve basit. Javascript olan bölümlerde de kod bloklarına nasıl çalıştıklarını ve işe yarakdıkları yazan notlar ekledim.
Oyunu kazanmak, kazanınca ne olacağı, score tutma ve oyunu tekrar başlatma ile ilgili mantık oyunda mevcut değil. Bunlardan bazıları isterseniz kendi oyununuzda ekleyebelirsiniz. Hadi başlayalım.
Dediğim gibi HTML kısmı gayet basit.
<!DOCTYPE html>
<html lang="en">
<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">
<link rel="stylesheet" href="style.css">
<script defer src="main.js"></script>
<title>Memory Game</title>
</head>
<body>
<h1>Eşleşen Resimleri Bul</h1>
<div class="board-container">
{# Oyunu buraya ekleyeceğiz #}
</div>
</body>
</html>
Kullanacağımız CSS'in tamamı:
/* /style.css */
body {
background-color: azure;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.board-container {
background-color: rgb(65, 78, 78);
width: 600px;
height: 600px;
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(6, 1fr);
grid-gap:10px;
padding: 20px;
border-radius: 20px;
}
.board-container > * {
display: flex;
justify-content: center;
align-items: center;
border-radius: 5px;
}
Öncelikle kullanacağınız resimleri toparlayın. Görsel aramakla uğraşmak istemiyorsanız burada benim internetten bulduğum ücretsiz görselleri kullanabilirsiniz.
// /main.js
// Görsellerin olduğu array'i rastgele dağıtma için:
const shuffle = (objects) => {
for (let i = objects.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
let temp = objects[i];
objects[i] = objects[j];
objects[j] = temp;
}
}
window.onload = async () => {
// board container ı seçin
let boardContainer = await document.querySelector('.board-container');
// array'e görselleri tekrar ekleyip rastgele dağıtıyoruz
const doubleAndRender = async (objects, objectsLength) => {
for (let i = 0; i < objectsLength; i++){
objects.push({"id":19+i, "src": `${i+1}.png`})
}
// array'i birkaç kez karıştırıyorum
// gerçi 3 kez yapmak pek de gerekli değil :)
await shuffle(objects);
await shuffle(objects);
await shuffle(objects);
for(let i = 0; i < objects.length; i++){
let div = document.createElement("div");
div.style.background = "red";
// png numarasını daha sonra kullanılacak bir class olarak verin
div.classList.add("grid-item", `${objects[i]["id"]}.png`)
// id png numarasını alacak ".png" eki olmadan
div.setAttribute("id", `${objects[i]["id"]}`)
boardContainer.appendChild(div)
};
};
await shuffle(objects);
await doubleAndRender(objects, 18);
}
Ve bütün olayın gerçekleştiği yer burası. Mantığı aşağıdaki yorumlarda bulunabilirsiniz.
// eşleştirilecek kaç görüntünün açık olduğunu takip edin
let num = 0;
// tıklanan ilk resim
var target1;
// tıklanan ikinci resim
var target2;
window.addEventListener('click', (e) => {
// Burada kolayca kullanılabilecek şekilde png'lerimi numaralandırdım (1.png, 2.png, vb.)
// ve pngNum ile png'leri takip ediyorum
let pngNum;
// 3 farklı durumu kontrol ediliyorum:
// "grid-item" mı
// "active" değil mi
// birden fazla class'ı var mı
if(e.target.classList.contains("grid-item") && e.target.classList[1] && !e.target.classList.contains("active")){
// daha sonra eşleştirmek için png numarasını alıyorum
if(e.target.classList[1].split(".")[0] <= 18){
pngNum = e.target.classList[1].split(".")[0];
} else {
pngNum = e.target.classList[1].split(".")[0] - 18;
}
// aktif açık görsel yoksa
if(num === 0){
target1 = e.target;
// tıklanan grid öğesi
let image = document.createElement("img");
image.src = `pngs/${pngNum}.png`
image.style.maxWidth= '64px';
target1.appendChild(image)
// Eşleştirilecek active görüntülerin sayısını artırın
num += 1;
// active, eşleştirme bekleyen görsel varsa
} else if(num == 1){
if(target1 !== e.target){
target2 = e.target;
let image = document.createElement("img");
image.src = `pngs/${pngNum}.png`
image.style.maxWidth= '64px';
target2.appendChild(image)
num += 1;
}
// iki görüntü açıldığında/active iken
} else if(num == 2){
// Her iki id de mevcut png sayısında büyükse
if(parseInt(target1.id) > 18 && (parseInt(target2.id) > 18)) {
num = 0;
target1.removeChild(target1.childNodes[0]);
target2.removeChild(target2.childNodes[0]);
}
// Her iki id de mevcut png sayısında küçükse
else if (parseInt(target1.id) <= 18 && (parseInt(target2.id) <= 18)){
console.log("both low, not a match");
num = 0;
target1.removeChild(target1.childNodes[0]);
target2.removeChild(target2.childNodes[0]);
}
// Şimdi id'ler doğru aralıkta, eşleşme arıyorum
else {
if(parseInt(target1.id) > 18) {
// Eşleşmeyi hallet
if(parseInt(target1.id) - 18 == parseInt(target2.id)){
// "active" ekliyorum ki diğerleriyle karışmasınlar
target1.classList.add("active")
target2.classList.add("active")
// Görsel olarak bir fark olsun diye renk değiştiriyorum
target1.style.background = "white";
target2.style.background = "white";
// the number of open images to be mathced should be 0
num = 0;
}else {
// Eşleşme yok
target1.removeChild(target1.childNodes[0]);
target2.removeChild(target2.childNodes[0]);
num = 0
}
}else if(parseInt(target2.id) > 18) {
if(parseInt(target2.id) - 18 == parseInt(target1.id)){
target1.classList.add("active")
target2.classList.add("active")
target1.style.background = "white";
target2.style.background = "white";
num = 0;
} else {
target1.removeChild(target1.childNodes[0]);
target2.removeChild(target2.childNodes[0]);
num = 0;
}
}
}
}
}
})
Bu proje bitmeye yakın bile değil. Daha iyi hale getirmek için kendinizin yapabileceğiniz iyileştirme için yer var. Belki bir kart çevirme animasyonu ekleyebilirsiniz, görüntüleri kartlara dönüştürmek için daha iyi bir mantık uygulayabilirsiniz, insanların kendi görselleriyle kendi oyunlarını yaratabilmelerini sağlayabilirsiniz... Bu oyuna eklenebilecek o kadar çok şey var ki.
Gördüğünüz gibi bu oyunu yaratmak hiç de zor olmadı. Temel HTML, CSS ve javascript ile oluşturabileceğiniz çok şey var. Bu, yalnızca temel web geliştirme bilginizi kullanarak ne tür şeyler yaratabileceğinize hızlı bir örnekti.
Ilker Akbiyik