<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kim Milyoner Olmak İster? (2 Kişilik Sesli)</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #0c0c2c;
color: white;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
flex-direction: column;
}
.game-container {
display: flex;
width: 95%;
max-width: 1200px;
border: 2px solid #ccc;
border-radius: 10px;
background-color: #000033;
}
.main-panel {
flex-grow: 1;
padding: 20px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.player-panels {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
.player-panel {
width: 48%;
border: 1px solid #aaa;
border-radius: 10px;
padding: 10px;
text-align: center;
}
.player-panel.active {
border-color: #ffcc00;
box-shadow: 0 0 10px #ffcc00;
}
.lifelines {
margin-top: 10px;
}
.lifeline-btn {
background-color: #4CAF50;
color: white;
padding: 10px;
margin: 5px;
border: none;
border-radius: 5px;
cursor: pointer;
}
.lifeline-btn:disabled {
background-color: #555;
cursor: not-allowed;
}
.question-container {
background-color: #1a1a4a;
padding: 20px;
border-radius: 10px;
text-align: center;
font-size: 1.5em;
margin-bottom: 20px;
min-height: 100px;
}
.options-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 15px;
}
.option {
background-color: #333366;
padding: 15px;
border-radius: 10px;
cursor: pointer;
border: 2px solid transparent;
font-size: 1.2em;
}
.option:hover {
background-color: #4d4d8a;
}
.option.selected {
background-color: #ff9933;
border-color: #fff;
}
.option.correct {
background-color: #009933;
animation: flash 1s;
}
.option.incorrect {
background-color: #cc0000;
}
.sidebar {
width: 250px;
background-color: #1a1a4a;
padding: 20px;
display: flex;
flex-direction: column-reverse;
border-left: 2px solid #ccc;
}
.money-ladder {
list-style: none;
padding: 0;
margin: 0;
text-align: center;
}
.money-ladder li {
padding: 8px;
border-radius: 5px;
margin-bottom: 5px;
font-weight: bold;
}
.money-ladder .current-question {
background-color: #ff9933;
color: #000;
}
.money-ladder .safe-haven {
background-color: #006400;
}
.controls {
margin-top: 20px;
text-align: center;
}
#start-btn, #voice-btn {
padding: 15px 30px;
font-size: 1.2em;
cursor: pointer;
background-color: #ffcc00;
color: #000;
border: none;
border-radius: 5px;
}
#voice-btn {
background-color: #0099ff;
color: white;
margin-left: 10px;
}
#voice-btn:disabled {
background-color: #555;
}
.audience-chart {
display: flex;
justify-content: space-around;
align-items: flex-end;
height: 150px;
margin-top: 20px;
border: 1px solid #fff;
padding: 10px;
}
.bar {
width: 20%;
background-color: #ffcc00;
text-align: center;
}
</style>
</head>
<body>
<div class="game-container">
<div class="main-panel">
<div class="player-panels">
<div id="player1-panel" class="player-panel">
<h3>1. Oyuncu</h3>
<div id="player1-score">Kazanç: 0 TL</div>
<div class="lifelines">
<button id="p1-lifeline-5050" class="lifeline-btn" onclick="useLifeline('5050', 1)">50/50</button>
<button id="p1-lifeline-double" class="lifeline-btn" onclick="useLifeline('double', 1)">Çift Cevap</button>
<button id="p1-lifeline-audience" class="lifeline-btn" onclick="useLifeline('audience', 1)">Seyirci</button>
</div>
</div>
<div id="player2-panel" class="player-panel">
<h3>2. Oyuncu</h3>
<div id="player2-score">Kazanç: 0 TL</div>
<div class="lifelines">
<button id="p2-lifeline-5050" class="lifeline-btn" onclick="useLifeline('5050', 2)">50/50</button>
<button id="p2-lifeline-double" class="lifeline-btn" onclick="useLifeline('double', 2)">Çift Cevap</button>
<button id="p2-lifeline-audience" class="lifeline-btn" onclick="useLifeline('audience', 2)">Seyirci</button>
</div>
</div>
</div>
<div id="question-container" class="question-container">
Kim Milyoner Olmak İster'e Hoş Geldiniz!
</div>
<div class="options-container">
<div class="option" id="optionA" data-option="A"></div>
<div class="option" id="optionB" data-option="B"></div>
<div class="option" id="optionC" data-option="C"></div>
<div class="option" id="optionD" data-option="D"></div>
</div>
<div id="audience-poll" class="audience-chart" style="display: none;"></div>
<div class="controls">
<button id="start-btn" onclick="startGame()">Oyunu Başlat</button>
<button id="voice-btn" disabled>Cevap Ver</button>
</div>
</div>
<div class="sidebar">
<ul class="money-ladder" id="money-ladder">
</ul>
</div>
</div>
<script>
const questions = [
{ question: "Türkiye'nin başkenti neresidir?", options: ["İstanbul", "Ankara", "İzmir", "Bursa"], answer: "B" },
{ question: "Hangi gezegen 'Kızıl Gezegen' olarak bilinir?", options: ["Venüs", "Mars", "Jüpiter", "Satürn"], answer: "B" },
{ question: "Mustafa Kemal Atatürk'ün anıt mezarı nerededir?", options: ["Çanakkale", "Samsun", "Ankara", "İstanbul"], answer: "C" },
{ question: "Hangi hayvan 'ormanlar kralı' olarak bilinir?", options: ["Kaplan", "Fil", "Aslan", "Ayı"], answer: "C" },
{ question: "Dünyanın en yüksek dağı hangisidir?", options: ["K2", "Kangchenjunga", "Lhotse", "Everest"], answer: "D" },
{ question: "Hangi ünlü ressam 'Mona Lisa' tablosunu yapmıştır?", options: ["Vincent van Gogh", "Pablo Picasso", "Leonardo da Vinci", "Rembrandt"], answer: "C" },
{ question: "Futbolda bir takımda kaç oyuncu bulunur?", options: ["9", "10", "11", "12"], answer: "C" },
{ question: "Hangi elementin kimyasal sembolü 'O' dur?", options: ["Oksijen", "Altın", "Gümüş", "Demir"], answer: "A" },
{ question: "İstiklal Marşı'nın şairi kimdir?", options: ["Namık Kemal", "Ziya Gökalp", "Mehmet Akif Ersoy", "Yahya Kemal Beyatlı"], answer: "C" },
{ question: "Hangi ülke 'Güneşin Doğduğu Ülke' olarak bilinir?", options: ["Çin", "Japonya", "Hindistan", "Tayland"], answer: "B" },
{ question: "Hangisi bir programlama dili değildir?", options: ["Java", "Python", "HTML", "C++"], answer: "C" },
{ question: "Fatih Sultan Mehmet, İstanbul'u hangi yılda fethetmiştir?", options: ["1299", "1453", "1517", "1071"], answer: "B" },
{ question: "Hangisi periyodik tabloda bir soygaz değildir?", options: ["Helyum", "Neon", "Argon", "Hidrojen"], answer: "D" }
];
const moneyLadder = [
"5.000.000 TL", "1.000.000 TL", "400.000 TL", "200.000 TL", "100.000 TL",
"50.000 TL", "30.000 TL", "15.000 TL", "7.500 TL", "5.000 TL", "2.000 TL", "1.000 TL", "500 TL"
].reverse();
const safeHavens = [1, 6]; // 2. ve 7. sorular (0-indexed)
let currentPlayer = 1;
let playerScores = { 1: 0, 2: 0 };
let playerLifelines = {
1: { '5050': true, 'double': true, 'audience': true },
2: { '5050': true, 'double': true, 'audience': true }
};
let currentQuestionIndex = 0;
let gameInProgress = false;
let doubleAnswerUsed = false;
let gameState = 'answering'; // 'answering' veya 'confirming' olabilir
let pendingChoice = null;
const questionContainer = document.getElementById('question-container');
const options = Array.from(document.getElementsByClassName('option'));
const moneyLadderEl = document.getElementById('money-ladder');
const startBtn = document.getElementById('start-btn');
const voiceBtn = document.getElementById('voice-btn');
const speechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
let recognition;
if(speechRecognition) {
recognition = new speechRecognition();
recognition.lang = 'tr-TR';
recognition.continuous = false;
recognition.interimResults = false;
recognition.onresult = (event) => {
const transcript = event.results[0][0].transcript.trim().toLowerCase();
if (gameState === 'confirming') {
if (transcript.includes('evet')) {
checkAnswer(pendingChoice);
} else if (transcript.includes('hayır')) {
cancelSelection();
} else {
speak("Lütfen 'evet' veya 'hayır' deyin.");
}
} else if (gameState === 'answering') {
const choice = transcript.toUpperCase().charAt(0);
if (['A', 'B', 'C', 'D'].includes(choice)) {
selectAnswer(choice);
} else {
speak("Lütfen geçerli bir şık söyleyin: A, B, C, veya D.");
}
}
};
recognition.onerror = (event) => {
speak("Sesinizi anlayamadım. Lütfen tekrar deneyin.");
};
}
voiceBtn.addEventListener('click', () => {
if(recognition){
recognition.start();
if (gameState === 'answering') {
speak("Lütfen cevabınızı söyleyin.");
} else if (gameState === 'confirming') {
speak("Evet mi, hayır mı?");
}
}
});
function speak(text) {
speechSynthesis.cancel(); // Önceki konuşmaları iptal et
const utterance = new SpeechSynthesisUtterance(text);
utterance.lang = 'tr-TR';
speechSynthesis.speak(utterance);
}
function updateMoneyLadder() {
moneyLadderEl.innerHTML = '';
moneyLadder.forEach((amount, index) => {
const li = document.createElement('li');
li.textContent = `${index + 1}. Soru: ${amount}`;
if (safeHavens.includes(index)) {
li.classList.add('safe-haven');
}
if (index === currentQuestionIndex) {
li.classList.add('current-question');
}
moneyLadderEl.appendChild(li);
});
}
function startGame() {
gameInProgress = true;
startBtn.style.display = 'none';
voiceBtn.disabled = false;
resetPlayer(1);
resetPlayer(2);
switchPlayer(1);
}
function switchPlayer(player) {
currentPlayer = player;
currentQuestionIndex = 0;
document.getElementById('player1-panel').classList.toggle('active', currentPlayer === 1);
document.getElementById('player2-panel').classList.toggle('active', currentPlayer === 2);
speak(`Sıra ${currentPlayer}. oyuncuda. Bol şans!`);
setTimeout(loadQuestion, 2000);
}
function resetPlayer(player) {
playerScores[player] = 0;
playerLifelines[player] = { '5050': true, 'double': true, 'audience': true };
document.getElementById(`p${player}-lifeline-5050`).disabled = false;
document.getElementById(`p${player}-lifeline-double`).disabled = false;
document.getElementById(`p${player}-lifeline-audience`).disabled = false;
document.getElementById(`player${player}-score`).textContent = `Kazanç: 0 TL`;
}
function loadQuestion() {
gameState = 'answering';
pendingChoice = null;
resetOptions();
if (currentQuestionIndex >= questions.length) {
endGame(true);
return;
}
const q = questions[currentQuestionIndex];
questionContainer.textContent = q.question;
options.forEach((opt, index) => {
opt.textContent = `${opt.dataset.option}: ${q.options[index]}`;
});
updateMoneyLadder();
speak(`Soru geliyor: ${q.question}... Şıklar: A) ${q.options[0]}, B) ${q.options[1]}, C) ${q.options[2]}, D) ${q.options[3]}`);
}
function selectAnswer(choice) {
if (!gameInProgress || gameState !== 'answering') return;
const selectedOptionEl = document.getElementById(`option${choice}`);
if (selectedOptionEl.style.visibility === 'hidden') return;
options.forEach(opt => opt.classList.remove('selected'));
selectedOptionEl.classList.add('selected');
pendingChoice = choice;
gameState = 'confirming';
speak("Son kararınız mı?");
}
function cancelSelection() {
if (pendingChoice) {
document.getElementById(`option${pendingChoice}`).classList.remove('selected');
}
pendingChoice = null;
gameState = 'answering';
speak("Cevap iptal edildi. Lütfen yeni bir cevap seçin.");
}
function checkAnswer(choice) {
gameState = 'checking'; // Cevap kontrol edilirken başka işlem yapılmasını engelle
const q = questions[currentQuestionIndex];
const selectedOptionEl = document.getElementById(`option${choice}`);
if (choice === q.answer) {
selectedOptionEl.classList.remove('selected');
selectedOptionEl.classList.add('correct');
speak("Doğru cevap!");
currentQuestionIndex++;
setTimeout(loadQuestion, 2000);
} else {
selectedOptionEl.classList.remove('selected');
selectedOptionEl.classList.add('incorrect');
const correctOptionEl = document.getElementById(`option${q.answer}`);
correctOptionEl.classList.add('correct');
speak(`Yanlış cevap. Doğru cevap ${q.answer} şıkkıydı.`);
let safeHavenIndex = -1;
for(let i = safeHavens.length - 1; i >= 0; i--) {
if (currentQuestionIndex > safeHavens[i]) {
safeHavenIndex = safeHavens[i];
break;
}
}
playerScores[currentPlayer] = safeHavenIndex !== -1 ? parseInt(moneyLadder[safeHavenIndex].replace(/\D/g, '')) : 0;
document.getElementById(`player${currentPlayer}-score`).textContent = `Kazanç: ${playerScores[currentPlayer]} TL`;
speak(`${currentPlayer}. oyuncu, ${playerScores[currentPlayer]} lira ile oyunu tamamladı.`);
setTimeout(() => {
const nextPlayer = currentPlayer === 1 ? 2 : 1;
if(document.getElementById(`player${nextPlayer}-panel`).classList.contains('played')) {
endGame(false);
} else {
document.getElementById(`player${currentPlayer}-panel`).classList.add('played');
switchPlayer(nextPlayer);
}
}, 3000);
}
}
function useLifeline(type, player) {
if (player !== currentPlayer || !playerLifelines[player][type] || !gameInProgress) return;
document.getElementById(`p${player}-lifeline-${type}`).disabled = true;
playerLifelines[player][type] = false;
speak(`${type} jokeri kullanılıyor.`);
const q = questions[currentQuestionIndex];
if (type === '5050') {
const wrongOptions = ['A', 'B', 'C', 'D'].filter(o => o !== q.answer);
const toRemove1 = wrongOptions.splice(Math.floor(Math.random() * wrongOptions.length), 1)[0];
const toRemove2 = wrongOptions.splice(Math.floor(Math.random() * wrongOptions.length), 1)[0];
document.getElementById(`option${toRemove1}`).style.visibility = 'hidden';
document.getElementById(`option${toRemove2}`).style.visibility = 'hidden';
} else if (type === 'double') {
speak("Çift cevap hakkınız var. İlk tahmininizi yapın.");
} else if (type === 'audience') {
const poll = document.getElementById('audience-poll');
poll.innerHTML = '';
poll.style.display = 'flex';
const percentages = [0,0,0,0];
const correctIndex = ['A', 'B', 'C', 'D'].indexOf(q.answer);
percentages[correctIndex] = Math.floor(Math.random() * 40) + 41; // 41-80%
let remaining = 100 - percentages[correctIndex];
for(let i=0; i<4; i++){
if(i !== correctIndex){
const share = Math.floor(Math.random() * remaining);
percentages[i] = share;
remaining -= share;
}
}
percentages[percentages.findIndex(p => p === 0 && percentages.indexOf(p) !== correctIndex)] += remaining;
['A','B','C','D'].forEach((opt, index) => {
const bar = document.createElement('div');
bar.className = 'bar';
bar.style.height = `${percentages[index]}%`;
bar.textContent = `${opt}: ${percentages[index]}%`;
poll.appendChild(bar);
});
}
}
function resetOptions() {
options.forEach(opt => {
opt.style.visibility = 'visible';
opt.classList.remove('correct', 'incorrect', 'selected');
});
document.getElementById('audience-poll').style.display = 'none';
}
function endGame(isWinner) {
gameInProgress = false;
voiceBtn.disabled = true;
let message = "";
if (isWinner) {
message = `Tebrikler ${currentPlayer}. Oyuncu! Büyük ödül olan ${moneyLadder[moneyLadder.length-1]} sizin!`;
} else {
const winner = playerScores[1] > playerScores[2] ? 1 : (playerScores[2] > playerScores[1] ? 2 : null);
if(winner === null) {
message = "Oyun bitti! Skorlar berabere!";
} else {
message = `Oyun bitti! Kazanan ${winner}. oyuncu!`;
}
}
questionContainer.textContent = message;
speak(message);
}
// Initial setup
updateMoneyLadder();
</script>
</body>
</html>
Selamlar milyoner oyununu bu sefer ses ile cevap veriyoruz örnek b diyoruz son kararınız mı diye soruyor evet dersek kitliyor hayır dersek geri çekiyor öncelik soru ve şıkları okumasını bekliyoruz cevap ver butonuna basıyoruz sesli olarak b diyoruz b işaretleniyor son kararınız mı diyor evet dersek doğru ise yeşil yanıyor hiçbir şekilde manuel işaretleme yapamıyorsunuz olaylar ses ile ilerliyor jokerler hariç
proje geliştirelibilir kodları yukarı bıraktım