Oyunumuz Ne Olacak? - NOY#2

noyjavascriptoyunyoutube

6 yıl önce 0 yorum

Sonunda nasıl bir oyun yazacağımızı buldum! "Çevrimiçi Satranç Oyunu" :)

Evet bir satranç oyunu. En azından oynanmasını bilmeseniz bile duyduğunuzu düşünüyorum. 8x8 bir tahta üzerine yerleştirilen taşları hareket ettirerek oynanıyor. İki kişi ile oynanıyor. Yani sistemimizi iki kişilik bir sisteme göre tasarlayacağız. Oyunun birçok detayı var. Hatta bu konularda standartlar belirleyen kuruluşlar dahi var. 

Oyunda o kadar önemli durumlar varki bunun için bir kütüphane yazmanın gerekli olduğunu düşündüm. Örneğin satrançta her hamlenin bir kodu oluyor. Bu hareketlere standard algebraic notation (SAN) deniyor. Türkçesi standart cebirsel gösterim diye geçiyor. Örnek bir hareketten bahsedelim. Kale ile şah'ın yer değiştirmesiyle oluşan hamleye rok denir. Rok sadece belirli durumlarda yapılabilir. Kale veya Şah'ın daha önce oynatılmaması ve aralarında taş olmaması gerekir. 2 tip rok yapılabilir uzun veya kısa. Kısa olan O-O şeklinde uzun olan O-O-O şeklinde gösterilir. Bunun gibi ve buna benzer diğer kurallar da var haliyle. Hepsini barındıran bir kütüphane yazmak oldukça iş gücü gerektiriyor :/

Bu durumda oyunun nasıl yazılacağı konusunda kaygıya düştüm ama bir şekilde chess.js beni bu kaygımdan kurtardı :) Satranç adına biraz önce de bahsettiğim gibi belirli kuralların hepsini bir şekilde toplamışlar ve güzel bir kütüphane ile karşımıza çıkmışlar. Bir doküman'ı var tabi ama ben yine de ne olur ne olmaz diye dokümanın yanında chess.js dosyasını biraz karıştırdım :) bu kütüphanenin işimize yarayacağını düşünüyorum.

Bir örnek

Terminal'i açalım ve istediğiniz bir dizine geçelim örneğin ~ dizini. satranc_test adında bir dosya oluşturup o dizine geçelim.

cd ~ && mkdir satranc_test && cd satranc_test

Bu dizine chess.js bağımlılığını kuralım. (i, install'ın kısaltması)

npm i chess.js

Bu dizinde terminal'i açıp node komutunu çalıştıralım

avare:satranc_test avare$ node
> 

Sonra chess.js'i require edip yeni bir Chess modeli oluşturalım ve bunu yazdıralım.

> var { Chess } = require('chess.js');
> var satranc = new Chess();
> console.log(satranc.ascii());
   +------------------------+
 8 | r  n  b  q  k  b  n  r |
 7 | p  p  p  p  p  p  p  p |
 6 | .  .  .  .  .  .  .  . |
 5 | .  .  .  .  .  .  .  . |
 4 | .  .  .  .  .  .  .  . |
 3 | .  .  .  .  .  .  .  . |
 2 | P  P  P  P  P  P  P  P |
 1 | R  N  B  Q  K  B  N  R |
   +------------------------+
     a  b  c  d  e  f  g  h
> process.exit()
avare:satranc_test avare$ 

Gördüğünüz gibi ascii olarak ekrana yazdırdık. (process.exit() çıkış yapmak içindi)

Oyunu biraz daha eğlenceli yapalım ve biraz önce bahsettiğim durumu oluşturan (rok) olayı canlandıralım. chess.js bunun için bize fen adında bir işlem sunuyor.

Nedir bu fen peki? 

Forsyth–Edwards Notation'nın kısaltması. Bir satranç oyununun hangi taşlarının hangi konumda olduğunu, bazı durumların yaşanıp yaşanmadı bilgisini, sıranın kimde olduğunu tutan string diyebiliriz. Yani oyunun son halini tutuyor. Örneğin başlangıç oyununun FEN'i şudur: 

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

"Peki biz bunu ne yapacağız?" demeden ben hemen rok olayını canlandıran bir FEN oluşturmaya koyuluyorum. Uygulamada (gerçek hayatta) olmayacak bir oyun ama şöyle oluşturdum:

rnbqkb1r/pppppppp/5n2/8/3P1BP1/2NQ3N/PPP1PPBP/R3K2R w KQkq - 7 8

Bu oyunda sıra beyazın ve iki kalesindeki arasında taş yok yani O-O veya O-O-O hamlelerini (rok) yapmaya hakkı var. Hadi bunu deneyelim 

> var { Chess } = require('chess.js');
> var satranc = new Chess()
> console.log(satranc.ascii())
   +------------------------+
 8 | r  n  b  q  k  b  n  r |
 7 | p  p  p  p  p  p  p  p |
 6 | .  .  .  .  .  .  .  . |
 5 | .  .  .  .  .  .  .  . |
 4 | .  .  .  .  .  .  .  . |
 3 | .  .  .  .  .  .  .  . |
 2 | P  P  P  P  P  P  P  P |
 1 | R  N  B  Q  K  B  N  R |
   +------------------------+
     a  b  c  d  e  f  g  h

// load methodu ile oyuna fen ekliyebiliyoruz.
> satranc.load('rnbqkb1r/pppppppp/5n2/8/3P1BP1/2NQ3N/PPP1PPBP/R3K2R w KQkq - 7 8')
> console.log(satranc.ascii())
   +------------------------+
 8 | r  n  b  q  k  b  .  r |
 7 | p  p  p  p  p  p  p  p |
 6 | .  .  .  .  .  n  .  . |
 5 | .  .  .  .  .  .  .  . |
 4 | .  .  .  P  .  B  P  . |
 3 | .  .  N  Q  .  .  .  N |
 2 | P  P  P  .  P  P  B  P |
 1 | R  .  .  .  K  .  .  R |
   +------------------------+
     a  b  c  d  e  f  g  h

// burada e1 karesindeki taşın (beyaz şah'ın) hareket değerlerini yazdırıyoruz gördüğünüz gibi 'O-O' ve 'O-O-O' mevcut
> console.log(satranc.moves({square: 'e1'}))
[ 'Kd2', 'Kf1', 'Kd1', 'O-O', 'O-O-O' ]

// Burada O-O-O hamlesini yapıyoruz ve son durumu yazdırıyoruz gördüğünüz gibi K(king) R(rook) rok yaptı
> satranc.move('O-O-O')
> console.log(satranc.ascii())
   +------------------------+
 8 | r  n  b  q  k  b  .  r |
 7 | p  p  p  p  p  p  p  p |
 6 | .  .  .  .  .  n  .  . |
 5 | .  .  .  .  .  .  .  . |
 4 | .  .  .  P  .  B  P  . |
 3 | .  .  N  Q  .  .  .  N |
 2 | P  P  P  .  P  P  B  P |
 1 | .  .  K  R  .  .  .  R |
   +------------------------+
     a  b  c  d  e  f  g  h

Böylelikle oyundan biraz bahsetmiş olduk. Diğer bölümde görüşmek üzere. Kendinize iyi bakın :)

Düşündüklerin nedir ?

Abdurrahman Eker

(1010 Eylül 11111001100)

  • Full Stack Developer Turkey/Sivas
  • İnternette Avare Kodcu
  • coffee
  • github
  • instagram
  • linkedin
  • youtube
  • Yeni içeriklerden haberdar olmak ister misin ?