Skip to content
Daily Construction Blog
Daily Construction Blog

Play Chess Online

Posted on May 16, 2025May 16, 2025 By admin

Gelişmiş Satranç Oyunu

Beyaz Başlar
// Bu satır style tag'inin üstüne taşındı // Satranç tahtasının başlangıç durumu const initialBoard = [ ['bR', 'bN', 'bB', 'bQ', 'bK', 'bB', 'bN', 'bR'], ['bP', 'bP', 'bP', 'bP', 'bP', 'bP', 'bP', 'bP'], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['wP', 'wP', 'wP', 'wP', 'wP', 'wP', 'wP', 'wP'], ['wR', 'wN', 'wB', 'wQ', 'wK', 'wB', 'wN', 'wR'] ]; // Taşların Unicode karakterleri const pieceMap = { 'wR': '♖', 'wN': '♘', 'wB': '♗', 'wQ': '♕', 'wK': '♔', 'wP': '♙', 'bR': '♜', 'bN': '♞', 'bB': '♝', 'bQ': '♛', 'bK': '♚', 'bP': '♟' }; let board = []; let selectedSquare = null; let currentPlayer = 'w'; // 'w' for white, 'b' for black let gameStatus = document.getElementById('game-status'); // Tahtayı ve taşları çizen fonksiyon function drawBoard() { const chessboardElement = document.getElementById('chessboard'); chessboardElement.innerHTML = ''; // Tahtayı temizle for (let row = 0; row < 8; row++) { for (let col = 0; col < 8; col++) { const squareElement = document.createElement('div'); const isLight = (row + col) % 2 === 0; squareElement.classList.add('square', isLight ? 'light' : 'dark'); squareElement.dataset.row = row; squareElement.dataset.col = col; squareElement.id = `square-${row}-${col}`; const piece = board[row][col]; if (piece) { const pieceElement = document.createElement('span'); pieceElement.classList.add('piece', piece.startsWith('w') ? 'white-piece' : 'black-piece'); pieceElement.textContent = pieceMap[piece]; squareElement.appendChild(pieceElement); } squareElement.addEventListener('click', handleSquareClick); chessboardElement.appendChild(squareElement); } } } // Kare tıklamasını işleyen fonksiyon function handleSquareClick(event) { const clickedSquare = event.currentTarget; const row = parseInt(clickedSquare.dataset.row); const col = parseInt(clickedSquare.dataset.col); const piece = board[row][col]; if (selectedSquare === null) { // Taş seçme if (piece && piece.startsWith(currentPlayer)) { selectedSquare = { row, col }; clickedSquare.classList.add('selected'); highlightPossibleMoves(row, col); } } else { // Taş hareket ettirme veya başka taş seçme const startRow = selectedSquare.row; const startCol = selectedSquare.col; if (startRow === row && startCol === col) { // Aynı kareye tekrar tıklandı, seçimi kaldır deselectSquare(); } else if (piece && piece.startsWith(currentPlayer)) { // Başka kendi taşını seçme deselectSquare(); selectedSquare = { row, col }; clickedSquare.classList.add('selected'); highlightPossibleMoves(row, col); } else { // Hareket etme denemesi if (isValidMove(startRow, startCol, row, col)) { movePiece(startRow, startCol, row, col); switchPlayer(); deselectSquare(); checkGameStatus(); } else { // Geçersiz hareket, seçimi kaldır deselectSquare(); } } } } // Seçimi kaldıran fonksiyon function deselectSquare() { if (selectedSquare) { const { row, col } = selectedSquare; document.getElementById(`square-${row}-${col}`).classList.remove('selected'); removePossibleMoveHighlights(); selectedSquare = null; } } // Olası hareketleri vurgulayan fonksiyon function highlightPossibleMoves(row, col) { const possibleMoves = getLegalMoves(row, col); possibleMoves.forEach(move => { document.getElementById(`square-${move.row}-${move.col}`).classList.add('possible-move'); }); } // Olası hareket vurgularını kaldıran fonksiyon function removePossibleMoveHighlights() { document.querySelectorAll('.possible-move').forEach(square => { square.classList.remove('possible-move'); }); } // Taş hareketini gerçekleştiren fonksiyon function movePiece(startRow, startCol, endRow, endCol) { board[endRow][endCol] = board[startRow][startCol]; board[startRow][startCol] = ''; drawBoard(); // Tahtayı yeniden çiz } // Sıradaki oyuncuyu değiştiren fonksiyon function switchPlayer() { currentPlayer = currentPlayer === 'w' ? 'b' : 'w'; gameStatus.textContent = currentPlayer === 'w' ? 'Beyaz Sırası' : 'Siyah Sırası'; } // Oyun durumunu kontrol eden fonksiyon (Şah, Mat vb.) function checkGameStatus() { const kingColor = currentPlayer; if (isCheckmate(kingColor)) { gameStatus.textContent = `${kingColor === 'w' ? 'Siyah' : 'Beyaz'} Kazandı! Mat!`; // Oyunu durdurma veya yeniden başlatma seçenekleri eklenebilir } else if (isCheck(kingColor)) { gameStatus.textContent += ` - Şah!`; } } // Belirtilen renkteki şahın şahta olup olmadığını kontrol eden fonksiyon function isCheck(kingColor) { // Şahın pozisyonunu bul let kingRow, kingCol; for (let r = 0; r < 8; r++) { for (let c = 0; c < 8; c++) { if (board[r][c] === kingColor + 'K') { kingRow = r; kingCol = c; break; } } if (kingRow !== undefined) break; } // Rakip taşların şahı tehdit edip etmediğini kontrol et const opponentColor = kingColor === 'w' ? 'b' : 'w'; for (let r = 0; r < 8; r++) { for (let c = 0; c < 8; c++) { const piece = board[r][c]; if (piece && piece.startsWith(opponentColor)) { // Geçici olarak isValidMove kullanıyoruz, ancak bu fonksiyonun // şahın kendi rengi tarafından tehdit edilmediğini varsayması gerekir. // Daha doğru bir kontrol için, her rakip taşın tüm olası hareketlerini // kontrol edip şahın karesinde bitip bitmediğine bakmak gerekir. // Basitlik adına, burada isValidMove'u kullanıyoruz, ancak bu tam doğru olmayabilir. // Gelişmiş bir satranç motoru daha karmaşık bir şah kontrolü gerektirir. // TODO: Daha doğru bir şah kontrolü implemente et. if (isValidMove(r, c, kingRow, kingCol, true)) { // 'true' isValidMove'a tehdit kontrolü olduğunu belirtmek için eklenebilir return true; } } } } return false; } // Belirtilen renkteki şahın mat olup olmadığını kontrol eden fonksiyon function isCheckmate(kingColor) { if (!isCheck(kingColor)) { return false; // Şahta değilse mat olamaz } // Oynayabilecek herhangi bir yasal hareket var mı kontrol et for (let r = 0; r < 8; r++) { for (let c = 0; c < 8; c++) { const piece = board[r][c]; if (piece && piece.startsWith(kingColor)) { const legalMoves = getLegalMoves(r, c); if (legalMoves.length > 0) { return false; // Yasal bir hareket bulundu, mat değil } } } } return true; // Yasal hareket bulunamadı, mat } // Bir taşın yasal hareketlerini döndüren fonksiyon (Şah çekme durumunu dikkate alarak) function getLegalMoves(startRow, startCol) { const piece = board[startRow][startCol]; if (!piece) return []; const possibleMoves = getPossibleMoves(startRow, startCol); const legalMoves = []; possibleMoves.forEach(move => { // Hareketi geçici olarak yap const originalEndPiece = board[move.row][move.col]; const originalStartPiece = board[startRow][startCol]; board[move.row][move.col] = originalStartPiece; board[startRow][startCol] = ''; // Hareket sonrası kendi şahımızın şahta olup olmadığını kontrol et const kingColor = originalStartPiece.startsWith('w') ? 'w' : 'b'; if (!isCheck(kingColor)) { legalMoves.push(move); } // Tahtayı eski durumuna geri getir board[startRow][startCol] = originalStartPiece; board[move.row][move.col] = originalEndPiece; }); return legalMoves; } // Bir taşın olası hareketlerini döndüren fonksiyon (Şah çekme durumunu dikkate almaz) function getPossibleMoves(startRow, startCol) { const piece = board[startRow][startCol]; const moves = []; const color = piece.startsWith('w') ? 'w' : 'b'; const direction = color === 'w' ? -1 : 1; // Beyaz yukarı, siyah aşağı switch (piece[1]) { case 'P': // Piyon // İleri hareket if (board[startRow + direction] && board[startRow + direction][startCol] === '') { moves.push({ row: startRow + direction, col: startCol }); // İlk hareket ve 2 kare ileri if ((color === 'w' && startRow === 6) || (color === 'b' && startRow === 1)) { if (board[startRow + 2 * direction] && board[startRow + 2 * direction][startCol] === '') { moves.push({ row: startRow + 2 * direction, col: startCol }); } } } // Çapraz yeme if (board[startRow + direction]) { if (startCol > 0 && board[startRow + direction][startCol - 1] && board[startRow + direction][startCol - 1].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow + direction, col: startCol - 1 }); } if (startCol < 7 && board[startRow + direction][startCol + 1] && board[startRow + direction][startCol + 1].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow + direction, col: startCol + 1 }); } } // TODO: En passant ve terfi ekle break; case 'R': // Kale // Dikey ve yatay hareket for (let i = startRow + 1; i < 8; i++) { // Aşağı if (board[i][startCol] === '') { moves.push({ row: i, col: startCol }); } else { if (board[i][startCol].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: i, col: startCol }); } break; } } for (let i = startRow - 1; i >= 0; i--) { // Yukarı if (board[i][startCol] === '') { moves.push({ row: i, col: startCol }); } else { if (board[i][startCol].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: i, col: startCol }); } break; } } for (let i = startCol + 1; i < 8; i++) { // Sağ if (board[startRow][i] === '') { moves.push({ row: startRow, col: i }); } else { if (board[startRow][i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow, col: i }); } break; } } for (let i = startCol - 1; i >= 0; i--) { // Sol if (board[startRow][i] === '') { moves.push({ row: startRow, col: i }); } else { if (board[startRow][i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow, col: i }); } break; } } break; case 'N': // At const knightMoves = [ [-2, -1], [-2, 1], [-1, -2], [-1, 2], [1, -2], [1, 2], [2, -1], [2, 1] ]; knightMoves.forEach(move => { const newRow = startRow + move[0]; const newCol = startCol + move[1]; if (newRow >= 0 && newRow < 8 && newCol >= 0 && newCol < 8) { const targetPiece = board[newRow][newCol]; if (targetPiece === '' || targetPiece.startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: newRow, col: newCol }); } } }); break; case 'B': // Fil // Çapraz hareket for (let i = 1; startRow + i < 8 && startCol + i < 8; i++) { // Sağ aşağı if (board[startRow + i][startCol + i] === '') { moves.push({ row: startRow + i, col: startCol + i }); } else { if (board[startRow + i][startCol + i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow + i, col: startCol + i }); } break; } } for (let i = 1; startRow - i >= 0 && startCol + i < 8; i++) { // Sağ yukarı if (board[startRow - i][startCol + i] === '') { moves.push({ row: startRow - i, col: startCol + i }); } else { if (board[startRow - i][startCol + i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow - i, col: startCol + i }); } break; } } for (let i = 1; startRow + i < 8 && startCol - i >= 0; i++) { // Sol aşağı if (board[startRow + i][startCol - i] === '') { moves.push({ row: startRow + i, col: startCol - i }); } else { if (board[startRow + i][startCol - i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow + i, col: startCol - i }); } break; } } for (let i = 1; startRow - i >= 0 && startCol - i >= 0; i++) { // Sol yukarı if (board[startRow - i][startCol - i] === '') { moves.push({ row: startRow - i, col: startCol - i }); } else { if (board[startRow - i][startCol - i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow - i, col: startCol - i }); } break; } } break; case 'Q': // Vezir // Kale ve Fil hareketlerinin birleşimi (Yukarıdaki Kale ve Fil mantığını buraya kopyalayabilirsiniz) // Dikey ve yatay hareket (Kale gibi) for (let i = startRow + 1; i < 8; i++) { // Aşağı if (board[i][startCol] === '') { moves.push({ row: i, col: startCol }); } else { if (board[i][startCol].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: i, col: startCol }); } break; } } for (let i = startRow - 1; i >= 0; i--) { // Yukarı if (board[i][startCol] === '') { moves.push({ row: i, col: startCol }); } else { if (board[i][startCol].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: i, col: startCol }); } break; } } for (let i = startCol + 1; i < 8; i++) { // Sağ if (board[startRow][i] === '') { moves.push({ row: startRow, col: i }); } else { if (board[startRow][i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow, col: i }); } break; } } for (let i = startCol - 1; i >= 0; i--) { // Sol if (board[startRow][i] === '') { moves.push({ row: startRow, col: i }); } else { if (board[startRow][i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow, col: i }); } break; } } // Çapraz hareket (Fil gibi) for (let i = 1; startRow + i < 8 && startCol + i < 8; i++) { // Sağ aşağı if (board[startRow + i][startCol + i] === '') { moves.push({ row: startRow + i, col: startCol + i }); } else { if (board[startRow + i][startCol + i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow + i, col: startCol + i }); } break; } } for (let i = 1; startRow - i >= 0 && startCol + i < 8; i++) { // Sağ yukarı if (board[startRow - i][startCol + i] === '') { moves.push({ row: startRow - i, col: startCol + i }); } else { if (board[startRow - i][startCol + i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow - i, col: startCol + i }); } break; } } for (let i = 1; startRow + i < 8 && startCol - i >= 0; i++) { // Sol aşağı if (board[startRow + i][startCol - i] === '') { moves.push({ row: startRow + i, col: startCol - i }); } else { if (board[startRow + i][startCol - i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow + i, col: startCol - i }); } break; } } for (let i = 1; startRow - i >= 0 && startCol - i >= 0; i++) { // Sol yukarı if (board[startRow - i][startCol - i] === '') { moves.push({ row: startRow - i, col: startCol - i }); } else { if (board[startRow - i][startCol - i].startsWith(color === 'w' ? 'b' : 'w')) { moves.push({ row: startRow - i, col: startCol - i }); } break; } } break; case 'K': // Şah const kingMoves = [ [-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1] ]; kingMoves.forEach(move => { const newRow = startRow + move[0]; const newCol = startCol + move[1]; if (newRow >= 0 && newRow < 8 && newCol >= 0 && newCol < 8) { const targetPiece = board[newRow][newCol]; if (targetPiece === '' || targetPiece.startsWith(color === 'w' ? 'b' : 'w')) { // TODO: Şahın gideceği yerin şah tehdidi altında olup olmadığını kontrol et moves.push({ row: newRow, col: newCol }); } } }); // TODO: Rok ekle break; } return moves; } // Hareketin geçerli olup olmadığını kontrol eden fonksiyon function isValidMove(startRow, startCol, endRow, endCol) { const piece = board[startRow][startCol]; if (!piece) return false; // Başlangıç karesinde taş yok const targetPiece = board[endRow][endCol]; const color = piece.startsWith('w') ? 'w' : 'b'; const opponentColor = color === 'w' ? 'b' : 'w'; // Kendi taşının üzerine gitme if (targetPiece && targetPiece.startsWith(color)) { return false; } const possibleMoves = getPossibleMoves(startRow, startCol); // Olası hareketler arasında hedef kare var mı kontrol et const isPossible = possibleMoves.some(move => move.row === endRow && move.col === endCol); if (!isPossible) { return false; } // Hareket sonrası kendi şahın şahta kalıp kalmadığını kontrol et (Bu kontrol getLegalMoves içinde yapılıyor) // Bu fonksiyon sadece temel hareket kurallarını kontrol etmeliydi. // getLegalMoves fonksiyonu zaten bu kontrolü yaptığı için bu kısım burada gereksiz olabilir. // Ancak, getPossibleMoves sadece temel hareketleri verir, şah kontrolü yapmaz. // Bu yüzden, hareketin yasal olup olmadığını kontrol etmek için getLegalMoves kullanılmalıdır. // TODO: isValidMove yerine getLegalMoves kullanılarak hareketin yasal olup olmadığı kontrol edilmeli. // Şimdilik basit bir isValidMove implementasyonu bırakıyorum, ancak bu tam doğru bir satranç motoru için yeterli değil. // Geçici olarak hareketi yap const originalEndPiece = board[endRow][endCol]; const originalStartPiece = board[startRow][startCol]; board[endRow][endCol] = originalStartPiece; board[startRow][startCol] = ''; // Hareket sonrası kendi şahımızın şahta olup olmadığını kontrol et const kingColor = originalStartPiece.startsWith('w') ? 'w' : 'b'; const isInCheckAfterMove = isCheck(kingColor); // Tahtayı eski durumuna geri getir board[startRow][startCol] = originalStartPiece; board[endRow][endCol] = originalEndPiece; // Eğer hareket sonrası şahta değilse ve hareket olası hareketlerden biriyse geçerli return isPossible && !isInCheckAfterMove; } // Oyunu başlatan fonksiyon function startGame() { // Başlangıç tahtasını kopyala board = initialBoard.map(row => [...row]); currentPlayer = 'w'; gameStatus = document.getElementById('game-status'); // Elementi tekrar al drawBoard(); } // Sayfa yüklendiğinde oyunu başlat document.addEventListener('DOMContentLoaded', startGame);
Uncategorized

Post navigation

Previous post
Next post

Related Posts

Zeka Testi

Posted on May 18, 2025

Zeka Testi Zeka Testi 1. Hangi sayı dizideki bir sonraki sayıdır? 2, 4, 8, 16, ? 2. “Kitap” kelimesi “kağıt” ile nasıl bir ilişkiye sahipse, “ev” kelimesi ne ile benzer bir ilişkiye sahiptir? 3. Aşağıdaki kelimelerden hangisi diğerlerinden farklıdır? Elma, muz, havuç, çilek. 4. Bir saatte akrep 5 kez tam…

Read More

Report the error code OR-FGEMF-86

Posted on January 10, 2025

The error code OR-FGEMF-86 generally points to a payment-related issue on Google’s platform. It might indicate a problem with verifying your payment method, a declined transaction, or a flag for unusual activity. Here’s how to address this issue: 1. Verify Your Payment Information 2. Check Your Payment Method 3. Try…

Read More

Error [OR-FGEMF-20] Google Play Store

Posted on February 1, 2025

he OR-FGEMF-20 error typically occurs when a transaction is declined on the Google Play Store.To resolve this issue, consider the following steps: videoFix Google Play Store Transaction Was Declined Error [OR-FGEMF-20]

Read More

Recent Posts

  • Engliah Test
  • Test3
  • Test 2
  • Test
  • Zeka Testi

Recent Comments

No comments to show.

Archives

  • May 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • July 2024
  • June 2024
  • May 2024

Categories

  • Ads
  • Architecture
  • Bridge
  • Construct
  • Education
  • Engineering
  • Flat
  • Homes
  • Internet
  • Online Education
  • Real Estate
  • Rental
  • Shopping
  • Uncategorized
  • Vehicles
©2025 Daily Construction Blog | WordPress Theme by Services