{"id":30343,"date":"2025-09-26T18:12:38","date_gmt":"2025-09-26T15:12:38","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/teknik-makale\/"},"modified":"2025-09-26T18:14:26","modified_gmt":"2025-09-26T15:14:26","slug":"javada-kucuk-bir-kart-oyunu-gelistirmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/","title":{"rendered":"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek"},"content":{"rendered":"<p>Java&#8217;da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehberde, nesne y\u00f6nelimli programlama prensiplerini kullanarak s\u0131f\u0131rdan basit bir kart oyununu nas\u0131l kodlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedeceksiniz.<\/p>\n<p>Yaz\u0131l\u0131m d\u00fcnyas\u0131na yeni ad\u0131m atan bir\u00e7ok ki\u015fi i\u00e7in, teorik bilgileri prati\u011fe d\u00f6kmek \u00e7o\u011fu zaman zorlay\u0131c\u0131 olabilir. \u00d6zellikle nesne y\u00f6nelimli programlama (OOP) gibi soyut kavramlar\u0131 anlamland\u0131rmak, ba\u015flang\u0131\u00e7ta kafa kar\u0131\u015ft\u0131r\u0131c\u0131 gelebilir. Ancak endi\u015felenmeyin! Bu k\u0131lavuz, Java&#8217;n\u0131n temel prensiplerini ve OOP kavramlar\u0131n\u0131 somut bir proje \u00fczerinden, yani basit bir kart oyunu geli\u015ftirerek \u00f6\u011frenmenize yard\u0131mc\u0131 olacak. Neden bir kart oyunu derseniz, kart oyunlar\u0131, <code>Kart<\/code>, <code>Deste<\/code>, <code>Oyuncu<\/code> gibi nesnelerin modellenmesi, bu nesneler aras\u0131ndaki ili\u015fkilerin kurulmas\u0131 ve oyun mant\u0131\u011f\u0131n\u0131n ad\u0131m ad\u0131m geli\u015ftirilmesi i\u00e7in harika birer laboratuvar g\u00f6revi g\u00f6r\u00fcr. Bu proje sayesinde, sadece kod yazmakla kalmayacak, ayn\u0131 zamanda problem \u00e7\u00f6zme becerilerinizi geli\u015ftirecek ve Java&#8217;n\u0131n g\u00fcc\u00fcn\u00fc uygulamal\u0131 olarak deneyimleyeceksiniz. Amac\u0131m\u0131z, en basitinden ba\u015flayarak, kendi ki\u015fisel yorumlar\u0131n\u0131z\u0131 ve yarat\u0131c\u0131l\u0131\u011f\u0131n\u0131z\u0131 katabilece\u011finiz, temel ancak tam i\u015flevsel bir kart oyunu iskeleti olu\u015fturmak. Bu rehber boyunca, her ad\u0131mda neyi neden yapt\u0131\u011f\u0131m\u0131z\u0131 anlayacak, b\u00f6ylece sadece kopyala-yap\u0131\u015ft\u0131r yapmak yerine ger\u00e7ek anlamda \u00f6\u011frenme f\u0131rsat\u0131 bulacaks\u0131n\u0131z. Haz\u0131rsan\u0131z, Java ile ilk oyununuzu yaratmak i\u00e7in kodlamaya ba\u015flayal\u0131m!<\/p>\n<p><strong>Java&#8217;da Kart Oyunu Geli\u015ftirmenin Temel Ta\u015flar\u0131 Nelerdir?<\/strong><\/p>\n<p>Herhangi bir yaz\u0131l\u0131m projesinde oldu\u011fu gibi, bir kart oyunu geli\u015ftirirken de projenin temel yap\u0131 ta\u015flar\u0131n\u0131 ve kullan\u0131lacak kavramlar\u0131 ba\u015ftan tan\u0131mlamak b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Java, nesne y\u00f6nelimli bir dil oldu\u011fu i\u00e7in, oyunumuzdaki her bir ana unsuru bir &#8220;nesne&#8221; olarak d\u00fc\u015f\u00fcnmek ve bu nesneleri temsil edecek &#8220;s\u0131n\u0131flar&#8221; olu\u015fturmak temel yakla\u015f\u0131m\u0131m\u0131z olacakt\u0131r. Bu yakla\u015f\u0131mla birlikte, projemizin iskeletini sa\u011flam temeller \u00fczerine in\u015fa edebiliriz. \u00d6ncelikli olarak, oyunumuzun ana bile\u015fenlerini belirlememiz gerekiyor: <code>Kart<\/code>, <code>Deste<\/code> ve <code>Oyuncu<\/code>. Bu \u00fc\u00e7 temel s\u0131n\u0131f, oyunun i\u015fleyi\u015fini ve mant\u0131\u011f\u0131n\u0131 kurmam\u0131z i\u00e7in bize yol g\u00f6sterecek.<\/p>\n<p><code>Kart<\/code> s\u0131n\u0131f\u0131, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere, destedeki her bir kart\u0131 temsil edecek. Her kart\u0131n kendine \u00f6zg\u00fc bir de\u011feri (\u00f6rne\u011fin, As, Papaz, K\u0131z, 2&#8217;li) ve bir t\u00fcr\u00fc (\u00f6rne\u011fin, Ma\u00e7a, Kupa, Karo, Sinek) olacakt\u0131r. Bu \u00f6zellikler, kartlar\u0131n birbirinden ayr\u0131lmas\u0131n\u0131 ve oyun kurallar\u0131na g\u00f6re i\u015flev g\u00f6rmesini sa\u011flar. Dolay\u0131s\u0131yla, <code>Kart<\/code> s\u0131n\u0131f\u0131n\u0131n i\u00e7inde bu de\u011ferleri tutacak de\u011fi\u015fkenler tan\u0131mlamal\u0131y\u0131z.<\/p>\n<p>Ard\u0131ndan, <code>Deste<\/code> s\u0131n\u0131f\u0131 geliyor. Bir deste, birden fazla kart\u0131 i\u00e7eren bir yap\u0131d\u0131r. Bu kartlar\u0131 depolamak ve \u00fczerinde \u00e7e\u015fitli i\u015flemler yapmak i\u00e7in Java&#8217;n\u0131n g\u00fc\u00e7l\u00fc koleksiyon yap\u0131lar\u0131ndan faydalanaca\u011f\u0131z. \u00d6zellikle <code>ArrayList<\/code>, kartlar\u0131 dinamik bir \u015fekilde ekleyip \u00e7\u0131karmak, desteyi kar\u0131\u015ft\u0131rmak ve kart da\u011f\u0131tmak gibi i\u015flemler i\u00e7in olduk\u00e7a uygun bir se\u00e7imdir. <code>Deste<\/code> s\u0131n\u0131f\u0131n\u0131n temel g\u00f6revleri aras\u0131nda, standart bir deste olu\u015fturmak (\u00f6rne\u011fin 52 kart), bu desteyi kar\u0131\u015ft\u0131rmak ve oyunculara kart da\u011f\u0131tmak bulunur. Koleksiyonlar sayesinde, kartlar\u0131n s\u0131ralamas\u0131n\u0131 kolayca de\u011fi\u015ftirebilir ve oyun ak\u0131\u015f\u0131n\u0131 y\u00f6netebiliriz.<\/p>\n<p>Son olarak, <code>Oyuncu<\/code> s\u0131n\u0131f\u0131, oyuna kat\u0131lan her bir ki\u015fiyi veya yapay zekay\u0131 temsil edecek. Her oyuncunun elinde belirli kartlar bulunacak ve bu kartlar\u0131 y\u00f6netmesi gerekecek. <code>Oyuncu<\/code> s\u0131n\u0131f\u0131 da, t\u0131pk\u0131 <code>Deste<\/code> gibi, kendi elindeki kartlar\u0131 tutmak i\u00e7in bir <code>ArrayList<\/code> yap\u0131s\u0131 kullanabilir. Ayr\u0131ca, oyuncular\u0131n adlar\u0131n\u0131 tutacak bir \u00f6zellik ve belki de oyun i\u00e7indeki puanlar\u0131n\u0131 takip edecek bir de\u011fi\u015fken i\u00e7erebilir.<\/p>\n<p>Nesne y\u00f6nelimli programlaman\u0131n temel kavramlar\u0131 olan s\u0131n\u0131flar (classes), nesneler (objects), nitelikler (attributes) ve davran\u0131\u015flar (methods) bu yap\u0131y\u0131 in\u015fa ederken s\u00fcrekli olarak kar\u015f\u0131m\u0131za \u00e7\u0131kacak. Her s\u0131n\u0131f, belirli bir nesne t\u00fcr\u00fcn\u00fcn \u015fablonu olacak, bu \u015fablonlardan t\u00fcretti\u011fimiz her bir \u00f6rnek ise bir nesne olacakt\u0131r. \u00d6rne\u011fin, <code>Kart<\/code> s\u0131n\u0131f\u0131ndan &#8220;Kupa As\u0131&#8221; ve &#8220;Ma\u00e7a Yedilisi&#8221; gibi ayr\u0131 ayr\u0131 <code>Kart<\/code> nesneleri olu\u015fturaca\u011f\u0131z. Bu nesneler, kendi i\u00e7lerinde de\u011fer ve t\u00fcr gibi nitelikleri bar\u0131nd\u0131racak ve belki de kart\u0131 ekrana yazd\u0131rmak gibi davran\u0131\u015flar\u0131 sergileyecek.<\/p>\n<p>Rastgelelik, kart oyunlar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Kartlar\u0131n kar\u0131\u015ft\u0131r\u0131lmas\u0131, tamamen rastgele bir s\u0131ra ile olmal\u0131d\u0131r. Java&#8217;da bu i\u015flemi ger\u00e7ekle\u015ftirmek i\u00e7in <code>java.util.Random<\/code> s\u0131n\u0131f\u0131n\u0131 veya <code>java.util.Collections.shuffle()<\/code> metodunu kullanabiliriz. \u00d6zellikle <code>Collections.shuffle()<\/code>, bir <code>List<\/code> i\u00e7erisindeki elemanlar\u0131 rastgele kar\u0131\u015ft\u0131rmak i\u00e7in olduk\u00e7a pratik ve etkili bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p>Bu temel ta\u015flar\u0131 do\u011fru bir \u015fekilde bir araya getirdi\u011fimizde, sadece bir kart oyunu de\u011fil, ayn\u0131 zamanda temiz, okunabilir ve geni\u015fletilebilir bir kod taban\u0131 olu\u015fturmu\u015f olaca\u011f\u0131z. Bu sayede, gelecekte oyunumuza yeni \u00f6zellikler eklemek veya farkl\u0131 oyun kurallar\u0131 uygulamak \u00e7ok daha kolay hale gelecektir. Bu giri\u015f, projemizin temel \u00e7er\u00e7evesini anlamam\u0131z\u0131 sa\u011flad\u0131. \u015eimdi, bu \u00e7er\u00e7eveyi somut kod par\u00e7ac\u0131klar\u0131yla doldurmaya ba\u015flayabiliriz.<\/p>\n<p><strong>Kart S\u0131n\u0131f\u0131 Nas\u0131l Olu\u015fturulur ve Neden \u00d6nemlidir?<\/strong><\/p>\n<p>Bir kart oyununun temel yap\u0131 ta\u015f\u0131, \u015f\u00fcphesiz ki &#8220;kart&#8221;\u0131n kendisidir. Dolay\u0131s\u0131yla, projemize ba\u015flarken <code>Kart<\/code> s\u0131n\u0131f\u0131n\u0131 do\u011fru bir \u015fekilde tasarlamak, oyunun geri kalan\u0131n\u0131 in\u015fa etmek i\u00e7in sa\u011flam bir zemin haz\u0131rlar. <code>Kart<\/code> s\u0131n\u0131f\u0131, her bir kart\u0131n benzersiz \u00f6zelliklerini tan\u0131mlayacak ve bu \u00f6zelliklere eri\u015fmemizi sa\u011flayacak metotlar\u0131 i\u00e7erecektir. Bu s\u0131n\u0131f\u0131n \u00f6nemi, oyun i\u00e7indeki her t\u00fcrl\u00fc etkile\u015fimin (kart \u00e7ekme, kart atma, kartlar\u0131 kar\u015f\u0131la\u015ft\u0131rma) do\u011frudan bu nesneler \u00fczerinden ger\u00e7ekle\u015fecek olmas\u0131ndan kaynaklan\u0131r.<\/p>\n<p>Peki, bir kart\u0131n hangi nitelikleri olmal\u0131d\u0131r? Genellikle, bir oyun kart\u0131n\u0131n iki ana \u00f6zelli\u011fi bulunur: de\u011feri ve t\u00fcr\u00fc (veya rengi). \u00d6rne\u011fin, &#8220;Ma\u00e7a As\u0131&#8221; kart\u0131nda &#8220;Ma\u00e7a&#8221; kart\u0131n t\u00fcr\u00fcn\u00fc, &#8220;As&#8221; ise de\u011ferini temsil eder. Bu nitelikleri Java&#8217;da nas\u0131l temsil edebiliriz? String&#8217;ler kullanmak bir se\u00e7enek olsa da, olas\u0131 de\u011ferleri ve t\u00fcrleri s\u0131n\u0131rl\u0131 ve sabit olan durumlarda <code>enum<\/code> (enumeration) yap\u0131s\u0131n\u0131 kullanmak \u00e7ok daha iyi bir \u00e7\u00f6z\u00fcmd\u00fcr. <code>enum<\/code>&#8216;lar, belirli bir grup i\u00e7indeki sabit de\u011ferleri tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r ve kodun okunabilirli\u011fini, g\u00fcvenilirli\u011fini art\u0131r\u0131r. Hatal\u0131 de\u011fer giri\u015flerini engeller ve IDE&#8217;nin otomatik tamamlama \u00f6zelliklerinden faydalanman\u0131z\u0131 sa\u011flar.<\/p>\n<p>Bu nedenle, <code>KartTuru<\/code> (Suit) ve <code>KartDegeri<\/code> (Rank) ad\u0131nda iki adet <code>enum<\/code> olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-java\">public enum KartTuru {\r\n    KUPA, KARO, MACA, SINEK\r\n}\r\n\r\npublic enum KartDegeri {\r\n    IKILI, UCLU, DORTLU, BESLI, ALTILI, YEDILI, SEKIZLI, DOKUZLU, ONLU, VALE, KIZ, PAPAZ, AS\r\n}<\/pre>\n<p><\/code><br \/>\nBu <code>enum<\/code>'lar sayesinde, bir kart\u0131n t\u00fcr\u00fcn\u00fc veya de\u011ferini tan\u0131mlarken sadece belirlenmi\u015f sabitleri kullanabiliriz. Bu, yaz\u0131m hatalar\u0131n\u0131 ve mant\u0131ksal hatalar\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r. \u015eimdi, bu <code>enum<\/code>'lar\u0131 kullanarak <code>Kart<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-java\">public class Kart {\r\n    private KartTuru tur;\r\n    private KartDegeri deger;\r\n\r\n    public Kart(KartTuru tur, KartDegeri deger) {\r\n        this.tur = tur;\r\n        this.deger = deger;\r\n    }\r\n\r\n    public KartTuru getTur() {\r\n        return tur;\r\n    }\r\n\r\n    public KartDegeri getDeger() {\r\n        return deger;\r\n    }\r\n\r\n    @Override\r\n    public String toString() {\r\n        \/\/ Kart\u0131n de\u011ferini ve t\u00fcr\u00fcn\u00fc daha okunabilir bir formatta d\u00f6nd\u00fcr\u00fcr\u00fcz.\r\n        \/\/ \u00d6rne\u011fin: \"AS KUPA\" veya \"ONLU SINEK\"\r\n        return deger + \" \" + tur;\r\n    }\r\n    \r\n    \/\/ Kartlar\u0131 kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in ek bir metot\r\n    public int karsilastir(Kart digerKart) {\r\n        return this.deger.compareTo(digerKart.getDeger());\r\n    }\r\n}<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki <code>Kart<\/code> s\u0131n\u0131f\u0131nda, iki adet <code>private<\/code> nitelik (<code>tur<\/code> ve <code>deger<\/code>) tan\u0131mlad\u0131k. Bu nitelikler <code>private<\/code> oldu\u011fu i\u00e7in do\u011frudan d\u0131\u015far\u0131dan eri\u015filemezler, bu da nesne y\u00f6nelimli programlaman\u0131n temel prensiplerinden biri olan kaps\u00fcllemeyi (encapsulation) sa\u011flar. Niteliklere eri\u015fim, <code>public<\/code> <code>get<\/code> metotlar\u0131 (<code>getTur()<\/code> ve <code>getDeger()<\/code>) arac\u0131l\u0131\u011f\u0131yla sa\u011flan\u0131r.<\/p>\n<p><code>Kart<\/code> s\u0131n\u0131f\u0131n\u0131n yap\u0131c\u0131 (constructor) metodu, bir <code>KartTuru<\/code> ve bir <code>KartDegeri<\/code> alarak yeni bir <code>Kart<\/code> nesnesi olu\u015fturur. Bu, her <code>Kart<\/code> nesnesinin ge\u00e7erli ve tan\u0131ml\u0131 bir t\u00fcr\u00fc ve de\u011feri olmas\u0131n\u0131 garanti eder.<\/p>\n<p><code>toString()<\/code> metodu, <code>Kart<\/code> nesnesinin metinsel bir temsilini d\u00f6nd\u00fcrmek i\u00e7in ezilmi\u015ftir (overridden). Bu sayede, bir <code>Kart<\/code> nesnesini do\u011frudan konsola yazd\u0131rd\u0131\u011f\u0131m\u0131zda, anla\u015f\u0131l\u0131r bir \u00e7\u0131kt\u0131 elde ederiz (\u00f6rne\u011fin \"AS KUPA\"). Bu, hata ay\u0131klama (debugging) s\u00fcrecinde olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><code>karsilastir()<\/code> metodu ise, iki kart\u0131 de\u011ferlerine g\u00f6re kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in kullan\u0131labilir. <code>enum<\/code>'lar\u0131n <code>compareTo()<\/code> metodu, tan\u0131mlanma s\u0131ras\u0131na g\u00f6re kar\u015f\u0131la\u015ft\u0131rma yapt\u0131\u011f\u0131 i\u00e7in, bu metot kart de\u011ferlerini kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in do\u011fal bir yol sunar. \u00d6rne\u011fin, <code>AS<\/code> de\u011feri <code>PAPAZ<\/code> de\u011ferinden daha b\u00fcy\u00fck kabul edilebilir (bu, <code>enum<\/code>'daki s\u0131ralamaya ba\u011fl\u0131d\u0131r). Bu basit s\u0131n\u0131f yap\u0131s\u0131, oyunun daha karma\u015f\u0131k mant\u0131klar\u0131n\u0131 in\u015fa etmek i\u00e7in sa\u011flam bir temel olu\u015fturur. Kartlar\u0131m\u0131z\u0131n kimlikleri art\u0131k net bir \u015fekilde tan\u0131mlanm\u0131\u015ft\u0131r ve oyunumuzun bir sonraki a\u015famas\u0131na, yani bu kartlar\u0131 bir araya getirecek olan desteyi olu\u015fturmaya ge\u00e7ebiliriz.<\/p>\n<p><strong>Deste S\u0131n\u0131f\u0131 ile Kartlar\u0131 Nas\u0131l Y\u00f6netiriz ve Kar\u0131\u015ft\u0131r\u0131r\u0131z?<\/strong><\/p>\n<p><code>Kart<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131 ba\u015far\u0131yla tan\u0131mlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi bu kartlar\u0131 bir araya getirecek, organize edecek ve oyunculara da\u011f\u0131tacak <code>Deste<\/code> s\u0131n\u0131f\u0131n\u0131 olu\u015fturman\u0131n zaman\u0131 geldi. Bir kart oyununun kalbi, genellikle destenin kendisidir. Destenin do\u011fru bir \u015fekilde olu\u015fturulmas\u0131, kar\u0131\u015ft\u0131r\u0131lmas\u0131 ve kart da\u011f\u0131t\u0131m\u0131, oyunun adil ve ak\u0131c\u0131 olmas\u0131n\u0131 sa\u011flar. <code>Deste<\/code> s\u0131n\u0131f\u0131, bu kritik g\u00f6revleri \u00fcstlenecek ve oyunun ana mekaniklerinden birini olu\u015fturacakt\u0131r.<\/p>\n<p><code>Deste<\/code> s\u0131n\u0131f\u0131n\u0131n temel amac\u0131, bir <code>Kart<\/code> nesneleri koleksiyonunu y\u00f6netmektir. Java'da bu t\u00fcr bir koleksiyonu temsil etmek i\u00e7in en uygun yap\u0131lardan biri <code>ArrayList<Kart><\/code>'t\u0131r. <code>ArrayList<\/code>, elemanlar\u0131 dinamik olarak ekleyip \u00e7\u0131karmam\u0131za, listeyi indeksler arac\u0131l\u0131\u011f\u0131yla y\u00f6netmemize ve \u00f6zellikle <code>Collections.shuffle()<\/code> gibi faydal\u0131 metotlarla kolayca i\u015flem yapmam\u0131za olanak tan\u0131r.<\/p>\n<p>\u0130\u015fte <code>Deste<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131n temel yap\u0131s\u0131:<\/p>\n<pre><code class=\"language-java\">import java.util.ArrayList;\r\nimport java.util.Collections;\r\nimport java.util.List;\r\n\r\npublic class Deste {\r\n    private List<Kart> kartlar; \/\/ Desteyi olu\u015fturan kartlar listesi\r\n\r\n    public Deste() {\r\n        kartlar = new ArrayList<>();\r\n        desteOlustur(); \/\/ Deste nesnesi olu\u015fturuldu\u011funda kartlar\u0131 otomatik olu\u015ftur\r\n        kartlariKaristir(); \/\/ Ve hemen kar\u0131\u015ft\u0131r\r\n    }\r\n\r\n    \/\/ Standart 52&#039;lik bir deste olu\u015fturur\r\n    private void desteOlustur() {\r\n        for (KartTuru tur : KartTuru.values()) {\r\n            for (KartDegeri deger : KartDegeri.values()) {\r\n                kartlar.add(new Kart(tur, deger));\r\n            }\r\n        }\r\n    }\r\n\r\n    \/\/ Desteyi kar\u0131\u015ft\u0131r\u0131r\r\n    public void kartlariKaristir() {\r\n        Collections.shuffle(kartlar);\r\n    }\r\n\r\n    \/\/ Desteden en \u00fcstteki kart\u0131 \u00e7eker ve d\u00f6nd\u00fcr\u00fcr\r\n    public Kart kartCek() {\r\n        if (kartlar.isEmpty()) {\r\n            System.out.println(\"Deste bo\u015f! Yeni bir deste olu\u015fturuluyor...\");\r\n            kartlar = new ArrayList<>(); \/\/ Yeni bo\u015f liste olu\u015ftur\r\n            desteOlustur(); \/\/ Yeniden doldur\r\n            kartlariKaristir(); \/\/ Ve kar\u0131\u015ft\u0131r\r\n        }\r\n        return kartlar.remove(0); \/\/ Listenin ba\u015f\u0131ndan bir kart\u0131 \u00e7ek ve listeden kald\u0131r\r\n    }\r\n\r\n    \/\/ Destede kalan kart say\u0131s\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr\r\n    public int kalanKartSayisi() {\r\n        return kartlar.size();\r\n    }\r\n}<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Deste<\/code> s\u0131n\u0131f\u0131n\u0131n yap\u0131c\u0131 (constructor) metodu, bir <code>ArrayList<\/code> ba\u015flat\u0131r ve hemen ard\u0131ndan <code>desteOlustur()<\/code> ve <code>kartlariKaristir()<\/code> metotlar\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r. Bu tasar\u0131m, her yeni <code>Deste<\/code> nesnesinin otomatik olarak dolu ve kar\u0131\u015ft\u0131r\u0131lm\u0131\u015f bir halde gelmesini sa\u011flar, b\u00f6ylece her zaman oynamaya haz\u0131r bir destemiz olur.<\/p>\n<p><code>desteOlustur()<\/code> metodu, <code>KartTuru<\/code> ve <code>KartDegeri<\/code> enum'lar\u0131ndaki t\u00fcm olas\u0131 kombinasyonlar\u0131 d\u00f6ng\u00fcye sokarak, her bir kombinasyon i\u00e7in yeni bir <code>Kart<\/code> nesnesi olu\u015fturur ve bu nesneyi <code>kartlar<\/code> listesine ekler. Bu sayede, standart 52'lik (veya enum'lar\u0131n\u0131z\u0131n b\u00fcy\u00fckl\u00fc\u011f\u00fcne ba\u011fl\u0131 olarak farkl\u0131 say\u0131da) bir deste olu\u015fturulmu\u015f olur.<\/p>\n<p><code>kartlariKaristir()<\/code> metodu, <code>java.util.Collections<\/code> s\u0131n\u0131f\u0131n\u0131n statik <code>shuffle()<\/code> metodunu kullanarak <code>kartlar<\/code> listesindeki elemanlar\u0131n s\u0131ras\u0131n\u0131 rastgele de\u011fi\u015ftirir. Bu, kart oyunlar\u0131nda adaleti ve tahmin edilemezli\u011fi sa\u011flayan kritik bir ad\u0131md\u0131r.<\/p>\n<p><code>kartCek()<\/code> metodu, destenin en \u00fcst\u00fcndeki (yani <code>ArrayList<\/code>'in ilk eleman\u0131) kart\u0131 al\u0131r ve desteden kald\u0131r\u0131r. Bu metodu \u00e7a\u011f\u0131rd\u0131\u011f\u0131m\u0131zda, desteden bir kart eksilir ve bu kart, \u00e7eken oyuncuya veya ilgili oyun mekani\u011fine verilir. Metot ayr\u0131ca, destenin bo\u015f olmas\u0131 durumunu da kontrol eder. E\u011fer deste bo\u015fsa, oyunun devaml\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak ad\u0131na yeni bir deste olu\u015fturur, kar\u0131\u015ft\u0131r\u0131r ve bu yeni desteden bir kart \u00e7eker. Bu, sonsuz bir oyun ak\u0131\u015f\u0131 i\u00e7in basit ama etkili bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p><code>kalanKartSayisi()<\/code> metodu ise, destede o an ka\u00e7 kart kald\u0131\u011f\u0131n\u0131 \u00f6\u011frenmek i\u00e7in basit bir yard\u0131mc\u0131 fonksiyondur.<\/p>\n<p><strong>Vaka Analizi: Ger\u00e7ek Bir Kart Oyununda Destenin Da\u011f\u0131t\u0131lmas\u0131<\/strong><\/p>\n<p>Ger\u00e7ek d\u00fcnyadaki bir\u00e7ok kart oyununda, destenin da\u011f\u0131t\u0131m \u015fekli oyunun stratejisi ve ak\u0131c\u0131l\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan \u00f6nemlidir. \u00d6rne\u011fin, poker gibi oyunlarda her oyuncuya belirli say\u0131da kart kapal\u0131 olarak da\u011f\u0131t\u0131l\u0131rken, blackjack'te ilk kartlar a\u00e7\u0131k, sonraki kartlar kapal\u0131 olabilir. Bizim <code>Deste<\/code> s\u0131n\u0131f\u0131m\u0131z, <code>kartCek()<\/code> metodu ile bu t\u00fcr senaryolar i\u00e7in temel bir yap\u0131 sunar. Bir oyuncuya kart da\u011f\u0131tmak istedi\u011fimizde, basit\u00e7e <code>deste.kartCek()<\/code> metodunu \u00e7a\u011f\u0131r\u0131r\u0131z ve d\u00f6nen <code>Kart<\/code> nesnesini oyuncunun eline ekleriz. Birden fazla oyuncuya belirli say\u0131da kart da\u011f\u0131tmak i\u00e7in ise bu metodu bir d\u00f6ng\u00fc i\u00e7inde kullanabiliriz.<\/p>\n<pre><code class=\"language-java\">\/\/ \u00d6rnek: \u00dc\u00e7 oyuncuya be\u015fer kart da\u011f\u0131tma\r\nList<Oyuncu> oyuncular = new ArrayList<>();\r\noyuncular.add(new Oyuncu(\"Alice\"));\r\noyuncular.add(new Oyuncu(\"Bob\"));\r\noyuncular.add(new Oyuncu(\"Charlie\"));\r\n\r\nDeste deste = new Deste(); \/\/ Deste otomatik olu\u015fturulur ve kar\u0131\u015ft\u0131r\u0131l\u0131r\r\n\r\nfor (int i = 0; i < 5; i++) { \/\/ Her oyuncuya 5 kart da\u011f\u0131t\r\n    for (Oyuncu oyuncu : oyuncular) {\r\n        oyuncu.kartEkle(deste.kartCek()); \/\/ Oyuncuya kart \u00e7ek ve eline ekle\r\n    }\r\n}\r\n\r\n\/\/ Oyuncular\u0131n ellerini kontrol et\r\nfor (Oyuncu oyuncu : oyuncular) {\r\n    System.out.println(oyuncu.getAd() + \" elindeki kartlar: \" + oyuncu.getElindekiKartlar());\r\n}<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>Deste<\/code> s\u0131n\u0131f\u0131, oyunun da\u011f\u0131t\u0131m mekaniklerini y\u00f6netmek i\u00e7in esnek ve yeniden kullan\u0131labilir bir yap\u0131 sunar. Bu temel ile art\u0131k kartlar\u0131 olu\u015fturabilir, kar\u0131\u015ft\u0131rabilir ve da\u011f\u0131tabiliriz. Bir sonraki ad\u0131mda, bu kartlar\u0131 alacak ve oyunun mant\u0131\u011f\u0131n\u0131 i\u015fletecek olan <code>Oyuncu<\/code> s\u0131n\u0131f\u0131n\u0131 ve ana oyun d\u00f6ng\u00fcs\u00fcn\u00fc inceleyece\u011fiz.<\/p>\n<p><strong>Oyun Mant\u0131\u011f\u0131: Oyuncular, Eller ve Tur D\u00f6ng\u00fcs\u00fc Nas\u0131l \u0130\u015fler?<\/strong><\/p>\n<p>Oyunun temel yap\u0131 ta\u015flar\u0131 olan <code>Kart<\/code> ve <code>Deste<\/code> s\u0131n\u0131flar\u0131m\u0131z\u0131 ba\u015far\u0131yla olu\u015fturduktan sonra, \u015fimdi bu elemanlar\u0131 bir araya getirecek olan oyun mant\u0131\u011f\u0131na ve <code>Oyuncu<\/code> s\u0131n\u0131f\u0131na odaklanmal\u0131y\u0131z. Herhangi bir kart oyununda, oyuncular\u0131n varl\u0131\u011f\u0131 ve onlar\u0131n elindeki kartlar\u0131 y\u00f6netebilmesi hayati \u00f6neme sahiptir. Bu b\u00f6l\u00fcm, <code>Oyuncu<\/code> s\u0131n\u0131f\u0131n\u0131n nas\u0131l tasarlanaca\u011f\u0131n\u0131, basit bir oyun d\u00f6ng\u00fcs\u00fcn\u00fcn nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ve bu d\u00f6ng\u00fc i\u00e7inde kartlar\u0131n nas\u0131l i\u015flenece\u011fini detayland\u0131racakt\u0131r.<\/p>\n<p>\u00d6ncelikle, <code>Oyuncu<\/code> s\u0131n\u0131f\u0131n\u0131 tasarlayal\u0131m. Bir oyuncunun temel nitelikleri, ad\u0131 ve elindeki kartlard\u0131r. Elindeki kartlar\u0131 y\u00f6netmek i\u00e7in t\u0131pk\u0131 <code>Deste<\/code> s\u0131n\u0131f\u0131nda oldu\u011fu gibi bir <code>ArrayList<Kart><\/code> kullanabiliriz.<\/p>\n<pre><code class=\"language-java\">import java.util.ArrayList;\r\nimport java.util.List;\r\n\r\npublic class Oyuncu {\r\n    private String ad;\r\n    private List<Kart> elindekiKartlar;\r\n\r\n    public Oyuncu(String ad) {\r\n        this.ad = ad;\r\n        this.elindekiKartlar = new ArrayList<>();\r\n    }\r\n\r\n    public String getAd() {\r\n        return ad;\r\n    }\r\n\r\n    public List<Kart> getElindekiKartlar() {\r\n        return elindekiKartlar;\r\n    }\r\n\r\n    \/\/ Oyuncunun eline kart ekler\r\n    public void kartEkle(Kart kart) {\r\n        elindekiKartlar.add(kart);\r\n    }\r\n\r\n    \/\/ Oyuncunun elinden belirtilen kart\u0131 \u00e7\u0131kar\u0131r\r\n    public Kart kartOyna(int indeks) {\r\n        if (indeks >= 0 && indeks < elindekiKartlar.size()) {\r\n            return elindekiKartlar.remove(indeks);\r\n        }\r\n        return null; \/\/ Ge\u00e7ersiz indeks durumunda null d\u00f6nd\u00fcr\u00fcr\r\n    }\r\n\r\n    \/\/ Oyuncunun elindeki kartlar\u0131 g\u00f6sterir\r\n    public void eldekiKartlariGoster() {\r\n        System.out.println(ad + \"&#039;nin eli:\");\r\n        for (int i = 0; i < elindekiKartlar.size(); i++) {\r\n            System.out.println(\"  \" + (i + 1) + \". \" + elindekiKartlar.get(i));\r\n        }\r\n    }\r\n}<\/pre>\n<p><\/code><\/p>\n<p><code>Oyuncu<\/code> s\u0131n\u0131f\u0131, oyuncunun ad\u0131n\u0131 tutan bir <code>String<\/code> ve elindeki kartlar\u0131 tutan bir <code>List<Kart><\/code> i\u00e7erir. <code>kartEkle()<\/code> metodu, desteden \u00e7ekilen bir kart\u0131 oyuncunun eline eklerken, <code>kartOyna()<\/code> metodu oyuncunun elinden belirli bir indeksteki kart\u0131 \u00e7\u0131karmas\u0131n\u0131 sa\u011flar. <code>eldekiKartlariGoster()<\/code> metodu ise, oyuncunun elindeki kartlar\u0131 konsola okunabilir bir formatta yazd\u0131rarak oyuncuya bilgi verir. Bu, oyuncunun mevcut durumunu takip etmesi i\u00e7in \u00f6nemlidir.<\/p>\n<p>\u015eimdi, bu s\u0131n\u0131flar\u0131 bir araya getirerek basit bir oyun mant\u0131\u011f\u0131 olu\u015ftural\u0131m. \u00d6rnek olarak, \"Y\u00fcksek Kart \u00c7ekme\" ad\u0131nda \u00e7ok basit bir oyun tasarlayal\u0131m. Bu oyunda, her oyuncu desteden bir kart \u00e7eker ve en y\u00fcksek de\u011fere sahip kart\u0131 \u00e7eken oyuncu kazan\u0131r. Bu, oyun d\u00f6ng\u00fcs\u00fcn\u00fc ve kartlar\u0131n nas\u0131l kar\u015f\u0131la\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 g\u00f6stermek i\u00e7in ideal bir senaryodur.<\/p>\n<p>Ana oyun d\u00f6ng\u00fcs\u00fcn\u00fc ve mant\u0131\u011f\u0131n\u0131 bir <code>Oyun<\/code> s\u0131n\u0131f\u0131nda veya do\u011frudan <code>main<\/code> metodunda y\u00f6netebiliriz. Daha organize bir yap\u0131 i\u00e7in <code>Oyun<\/code> s\u0131n\u0131f\u0131 tercih edilebilir.<\/p>\n<pre><code class=\"language-java\">import java.util.ArrayList;\r\nimport java.util.List;\r\nimport java.util.Scanner; \/\/ Kullan\u0131c\u0131 giri\u015fi i\u00e7in\r\n\r\npublic class Oyun {\r\n    private Deste deste;\r\n    private List<Oyuncu> oyuncular;\r\n    private Scanner scanner;\r\n\r\n    public Oyun() {\r\n        deste = new Deste();\r\n        oyuncular = new ArrayList<>();\r\n        scanner = new Scanner(System.in);\r\n    }\r\n\r\n    \/\/ Oyuncular\u0131 oyuna ekler\r\n    public void oyuncuEkle(Oyuncu oyuncu) {\r\n        oyuncular.add(oyuncu);\r\n    }\r\n\r\n    \/\/ Oyunun ana d\u00f6ng\u00fcs\u00fc\r\n    public void oyna() {\r\n        System.out.println(\"--- Java Kart Oyunu Ba\u015fl\u0131yor! ---\");\r\n\r\n        \/\/ Oyunculara birer kart da\u011f\u0131t\r\n        System.out.println(\"Her oyuncuya bir kart da\u011f\u0131t\u0131l\u0131yor...\");\r\n        for (Oyuncu oyuncu : oyuncular) {\r\n            Kart cekilenKart = deste.kartCek();\r\n            oyuncu.kartEkle(cekilenKart);\r\n            System.out.println(oyuncu.getAd() + \" bir kart \u00e7ekti.\");\r\n        }\r\n\r\n        System.out.println(\"\\n--- Kartlar \u00c7ekildi ---\");\r\n\r\n        \/\/ Her oyuncunun elindeki kart\u0131 g\u00f6ster\r\n        for (Oyuncu oyuncu : oyuncular) {\r\n            oyuncu.eldekiKartlariGoster();\r\n        }\r\n\r\n        \/\/ Kazanan\u0131 belirle\r\n        Oyuncu kazanan = null;\r\n        Kart enYuksekKart = null;\r\n\r\n        for (Oyuncu oyuncu : oyuncular) {\r\n            if (!oyuncu.getElindekiKartlar().isEmpty()) {\r\n                Kart mevcutKart = oyuncu.getElindekiKartlar().get(0); \/\/ Basit oyunumuzda her oyuncunun 1 kart\u0131 var\r\n                if (kazanan == null || mevcutKart.karsilastir(enYuksekKart) > 0) {\r\n                    enYuksekKart = mevcutKart;\r\n                    kazanan = oyunc;\r\n                }\r\n            }\r\n        }\r\n\r\n        System.out.println(\"\\n--- Sonu\u00e7lar ---\");\r\n        if (kazanan != null) {\r\n            System.out.println(\"Kazanan: \" + kazanan.getAd() + \" (Kart: \" + enYuksekKart + \")\");\r\n        } else {\r\n            System.out.println(\"Oyun berabere veya ge\u00e7ersiz bir durum olu\u015ftu.\");\r\n        }\r\n\r\n        System.out.println(\"\\n--- Oyun Bitti ---\");\r\n        scanner.close(); \/\/ Scanner kayna\u011f\u0131n\u0131 serbest b\u0131rak\r\n    }\r\n\r\n    public static void main(String[] args) {\r\n        Oyun kartOyunu = new Oyun();\r\n\r\n        \/\/ Oyuncular\u0131 olu\u015ftur ve ekle\r\n        kartOyunu.oyuncuEkle(new Oyuncu(\"Ali\"));\r\n        kartOyunu.oyuncuEkle(new Oyuncu(\"Ay\u015fe\"));\r\n        kartOyunu.oyuncuEkle(new Oyuncu(\"Can\"));\r\n\r\n        kartOyunu.oyna();\r\n    }\r\n}<\/pre>\n<p><\/code><\/p>\n<p><code>Oyun<\/code> s\u0131n\u0131f\u0131, bir <code>Deste<\/code> nesnesi ve <code>Oyuncu<\/code> nesnelerinin bir listesini i\u00e7erir. <code>oyuncuEkle()<\/code> metodu ile oyuna yeni oyuncular dahil edebiliriz. <code>oyna()<\/code> metodu ise oyunun temel ak\u0131\u015f\u0131n\u0131 y\u00f6netir:<br \/>\n1.  Oyunun ba\u015flang\u0131c\u0131n\u0131 duyurur.<br \/>\n2.  Her oyuncuya desteden birer kart \u00e7ektirir ve bu kartlar\u0131 oyuncunun eline ekler.<br \/>\n3.  \u00c7ekilen kartlar\u0131 konsolda g\u00f6sterir.<br \/>\n4.  Ard\u0131ndan, her oyuncunun elindeki kart\u0131 (bu basit oyunda her oyuncunun sadece bir kart\u0131 var) kar\u015f\u0131la\u015ft\u0131rarak en y\u00fcksek de\u011fere sahip kart\u0131 bulan oyuncuyu \"kazanan\" olarak ilan eder. <code>Kart<\/code> s\u0131n\u0131f\u0131ndaki <code>karsilastir()<\/code> metodu burada devreye girer.<br \/>\n5.  Oyunun sonunu duyurur ve <code>Scanner<\/code> nesnesini kapat\u0131r.<\/p>\n<p>Bu basit \"Y\u00fcksek Kart \u00c7ekme\" oyunu, <code>Kart<\/code>, <code>Deste<\/code> ve <code>Oyuncu<\/code> s\u0131n\u0131flar\u0131m\u0131z\u0131n nas\u0131l etkile\u015fime girdi\u011fini ve temel bir oyun d\u00f6ng\u00fcs\u00fcn\u00fcn nas\u0131l yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Kullan\u0131c\u0131 giri\u015fi i\u00e7in <code>Scanner<\/code> kulland\u0131k, ancak daha karma\u015f\u0131k oyunlar i\u00e7in bu k\u0131s\u0131m geni\u015fletilebilir veya bir grafik aray\u00fcz\u00fcne ta\u015f\u0131nabilir. Bu yap\u0131, daha karma\u015f\u0131k oyun kurallar\u0131n\u0131 uygulamak i\u00e7in sa\u011flam bir temel sunar.<\/p>\n<p><strong># Oyun Mant\u0131\u011f\u0131n\u0131 Daha Dinamik Hale Getirmek \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/strong><\/p>\n<p>Yukar\u0131da olu\u015fturdu\u011fumuz temel oyun mant\u0131\u011f\u0131, ba\u015flang\u0131\u00e7 i\u00e7in harika bir temel sunsa da, ger\u00e7ek d\u00fcnya kart oyunlar\u0131 genellikle \u00e7ok daha dinamik ve karma\u015f\u0131k kurallara sahiptir. Oyununuzu daha esnek, geni\u015fletilebilir ve e\u011flenceli hale getirmek i\u00e7in baz\u0131 ileri d\u00fczey konseptleri ve ipu\u00e7lar\u0131n\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<p><strong>1. Aray\u00fczlerin (Interfaces) Kullan\u0131m\u0131:<\/strong><br \/>\nOyununuzdaki farkl\u0131 varl\u0131klar\u0131n ortak davran\u0131\u015flar\u0131n\u0131 tan\u0131mlamak i\u00e7in aray\u00fczler kullanabilirsiniz. \u00d6rne\u011fin, \"oynayabilir\" veya \"hasar verebilir\" gibi ortak yetenekler i\u00e7in aray\u00fczler olu\u015fturmak, farkl\u0131 t\u00fcrdeki kartlar\u0131n veya oyuncular\u0131n ayn\u0131 kurallara uymas\u0131n\u0131 sa\u011flayabilir.<\/p>\n<pre><code class=\"language-java\">public interface Oynanabilir {\r\n    void oyna(); \/\/ Bu kart\/oyuncu nas\u0131l oynan\u0131r\r\n    boolean kuralaUygunMu(OyunDurumu durum); \/\/ Mevcut oyun durumunda bu hamle kurala uygun mu?\r\n}\r\n\/\/ Daha sonra Kart veya Oyuncu s\u0131n\u0131flar\u0131n\u0131z bu aray\u00fcz\u00fc implement edebilir.<\/pre>\n<p><\/code><br \/>\nBu yakla\u015f\u0131m, kodunuzu daha mod\u00fcler hale getirir ve yeni oyun kurallar\u0131 veya kart t\u00fcrleri ekledi\u011finizde mevcut kodu de\u011fi\u015ftirmek yerine sadece yeni s\u0131n\u0131flar eklemenizi sa\u011flar.<\/p>\n<p><strong>2. Strateji Deseni (Strategy Pattern) ile Oyun Kurallar\u0131:<\/strong><br \/>\nFarkl\u0131 kart oyunlar\u0131n\u0131n farkl\u0131 kural setleri vard\u0131r. \u00d6rne\u011fin, blackjack'te 21'e yakla\u015fmak, poker'de en iyi eli olu\u015fturmak esast\u0131r. Bu farkl\u0131 kurallar\u0131 tek bir devasa <code>if-else<\/code> blo\u011fu yerine, her kural setini ayr\u0131 bir strateji olarak modelleyebiliriz. Strateji deseni, algoritma ailelerini tan\u0131mlar, her bir algoritmay\u0131 ayr\u0131 bir s\u0131n\u0131fa koyar ve onlar\u0131 de\u011fi\u015f toku\u015f edilebilir hale getirir.<\/p>\n<pre><code class=\"language-java\">public interface OyunKurali {\r\n    Oyuncu kazananiBelirle(List<Oyuncu> oyuncular);\r\n    \/\/ Di\u011fer kural metotlar\u0131\r\n}\r\n\r\npublic class YuksekKartKurali implements OyunKurali {\r\n    @Override\r\n    public Oyuncu kazananiBelirle(List<Oyuncu> oyuncular) {\r\n        \/\/ \"Y\u00fcksek Kart \u00c7ekme\" oyununun kazanan belirleme mant\u0131\u011f\u0131 buraya gelir\r\n        \/\/ ... \u00f6nceki koddan kazanan belirleme mant\u0131\u011f\u0131n\u0131 buraya ta\u015f\u0131y\u0131n ...\r\n        return null; \/\/ Kazanan oyuncuyu d\u00f6nd\u00fcr\r\n    }\r\n}\r\n\/\/ Oyun s\u0131n\u0131f\u0131, hangi kural\u0131n uygulanaca\u011f\u0131n\u0131 dinamik olarak se\u00e7ebilir.\r\n\/\/ oyun.setOyunKurali(new YuksekKartKurali());<\/pre>\n<p><\/code><br \/>\nBu desen, oyununuzun farkl\u0131 versiyonlar\u0131n\u0131 veya modlar\u0131n\u0131 kolayca olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<p><strong>3. Hata Y\u00f6netimi (<code>try-catch<\/code>) ve Sa\u011flaml\u0131k:<\/strong><br \/>\nGer\u00e7ek bir oyunda, kullan\u0131c\u0131lar beklenmedik giri\u015fler yapabilir veya oyun ak\u0131\u015f\u0131nda mant\u0131ksal hatalar meydana gelebilir. Kullan\u0131c\u0131dan input al\u0131rken (\u00f6rne\u011fin hangi kart\u0131 oynayaca\u011f\u0131n\u0131 se\u00e7erken) <code>try-catch<\/code> bloklar\u0131 kullanarak <code>InputMismatchException<\/code> gibi hatalar\u0131 yakalamak \u00f6nemlidir. Ayr\u0131ca, destenin bo\u015falmas\u0131, ge\u00e7ersiz kart indeksleri gibi durumlar i\u00e7in de kontroller eklemek, oyununuzu daha sa\u011flam hale getirir.<\/p>\n<pre><code class=\"language-java\">try {\r\n    \/\/ Kullan\u0131c\u0131dan kart indeksi al\r\n    int secim = scanner.nextInt();\r\n    \/\/ \u0130\u015flemi yap\r\n} catch (InputMismatchException e) {\r\n    System.out.println(\"Hatal\u0131 giri\u015f! L\u00fctfen bir say\u0131 girin.\");\r\n    scanner.next(); \/\/ Hatal\u0131 giri\u015fi temizle\r\n}<\/pre>\n<p><\/code><\/p>\n<p><strong>4. Performans \u0130pu\u00e7lar\u0131:<\/strong><br \/>\nBasit bir kart oyunu i\u00e7in performans genellikle bir sorun te\u015fkil etmez. Ancak daha karma\u015f\u0131k oyunlar veya \u00e7ok say\u0131da kart\/oyuncu i\u00e7eren senaryolarda performans\u0131 d\u00fc\u015f\u00fcnmek gerekebilir.<br \/>\n*   <strong>Gereksiz Nesne Olu\u015fturmaktan Ka\u00e7\u0131nma:<\/strong> \u00d6zellikle s\u0131k tekrar eden d\u00f6ng\u00fcler i\u00e7inde s\u00fcrekli yeni nesneler olu\u015fturmaktan ka\u00e7\u0131n\u0131n.<br \/>\n*   <strong>Koleksiyonlar\u0131 Ak\u0131ll\u0131ca Kullanma:<\/strong> B\u00fcy\u00fck koleksiyonlarda s\u0131k\u00e7a eleman ekleme\/\u00e7\u0131karma yap\u0131yorsan\u0131z <code>LinkedList<\/code>'in, s\u0131k\u00e7a rastgele eri\u015fim yap\u0131yorsan\u0131z <code>ArrayList<\/code>'in avantajlar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurun.<br \/>\n*   <strong>\u0130yi Algoritmalar:<\/strong> Kartlar\u0131 kar\u0131\u015ft\u0131rma, s\u0131ralama veya arama gibi i\u015flemler i\u00e7in standart k\u00fct\u00fcphane metotlar\u0131n\u0131 kullan\u0131n (\u00f6rne\u011fin <code>Collections.shuffle()<\/code>, <code>Collections.sort()<\/code>). Bu metotlar genellikle iyi optimize edilmi\u015ftir.<\/p>\n<p>> <\/p>\n<pre><code class=\"language-html\">> <blockquote class=\"uzman-ipucu\">\r\n>   Uzman \u0130pucu: Oyununuzun geni\u015fletilebilirli\u011fini art\u0131rmak i\u00e7in, kartlar\u0131n etkilerini (hasar verme, can yenileme vb.) ayr\u0131 strateji s\u0131n\u0131flar\u0131 olarak tasarlay\u0131n. B\u00f6ylece yeni kartlar ekledi\u011finizde sadece yeni etki stratejileri yazman\u0131z yeterli olur, mevcut kodunuzu de\u011fi\u015ftirmezsiniz. Bu, a\u00e7\u0131k\/kapal\u0131 prensibine uygun bir yakla\u015f\u0131md\u0131r.\r\n> <\/blockquote>\r\n><\/pre>\n<p><\/code><br \/>\nBu ipu\u00e7lar\u0131, k\u00fc\u00e7\u00fck bir konsol uygulamas\u0131ndan ba\u015flayarak, daha b\u00fcy\u00fck ve profesyonel bir oyun projesine do\u011fru ilerlerken kod kalitenizi ve oyununuzun potansiyelini art\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Her zaman temiz, mod\u00fcler ve test edilebilir kod yazmaya \u00f6zen g\u00f6sterin.<\/p>\n<p><strong>Java Kart Oyunu Geli\u015ftirmede \u0130leri D\u00fczey Konular ve Mobil Uyumluluk<\/strong><\/p>\n<p>Temel kart oyunu mant\u0131\u011f\u0131n\u0131 olu\u015fturduktan sonra, projenizi daha ileriye ta\u015f\u0131mak i\u00e7in ke\u015ffedebilece\u011finiz bir\u00e7ok alan bulunur. Bu ileri d\u00fczey konular, oyununuzun i\u015flevselli\u011fini, kullan\u0131c\u0131 deneyimini ve hatta da\u011f\u0131t\u0131m potansiyelini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Konsol tabanl\u0131 bir oyundan, modern bir uygulamaya ge\u00e7i\u015f yaparken dikkate alman\u0131z gereken baz\u0131 \u00f6nemli noktalar \u015funlard\u0131r:<\/p>\n<p><strong>1. Grafik Aray\u00fcz (GUI) Geli\u015ftirme:<\/strong><br \/>\nKonsol uygulamalar\u0131 geli\u015ftirmenin temellerini atmak i\u00e7in harikad\u0131r, ancak g\u00f6rsel bir aray\u00fcz, oyuncu etkile\u015fimini ve oyun deneyimini bamba\u015fka bir seviyeye ta\u015f\u0131r. Java'da GUI geli\u015ftirmek i\u00e7in iki ana \u00e7er\u00e7eve bulunmaktad\u0131r:<br \/>\n*   <strong>Swing:<\/strong> Daha eski ancak hala yayg\u0131n olarak kullan\u0131lan bir k\u00fct\u00fcphanedir. Hafif bile\u015fenler sunar ve h\u0131zl\u0131ca g\u00f6rsel aray\u00fczler olu\u015fturman\u0131za olanak tan\u0131r.<br \/>\n*   <strong>JavaFX:<\/strong> Swing'den daha modern bir alternatiftir. Daha zengin grafik \u00f6zelliklerine, CSS tabanl\u0131 stil yeteneklerine ve FXML ile UI tan\u0131mlama imkan\u0131na sahiptir. \u00d6zellikle yeni projeler i\u00e7in genellikle JavaFX \u00f6nerilir.<\/p>\n<p>    Bir GUI'de, her kart\u0131 bir <code>JButton<\/code> veya <code>JLabel<\/code> \u00fczerinde resim olarak g\u00f6sterebilirsiniz. Oyuncunun eli, bir <code>JPanel<\/code> \u00fczerinde kart nesnelerinin dinamik olarak yerle\u015ftirilmesiyle temsil edilebilir. T\u0131klanabilir kartlar, oyun s\u0131ras\u0131 geldi\u011finde oyuncunun hangi kart\u0131 oynamak istedi\u011fini se\u00e7mesini sa\u011flar. \u00d6rne\u011fin, bir <code>JFrame<\/code> ana pencereniz olurken, oyuncular\u0131n elleri ve oyun alan\u0131 i\u00e7in ayr\u0131 <code>JPanel<\/code>'ler kullanabilirsiniz. Bu, oyununuzu g\u00f6rsel olarak daha \u00e7ekici ve kullan\u0131c\u0131 dostu hale getirir.<\/p>\n<p><strong>2. Oyun Durumunu Kaydetme ve Y\u00fckleme (Serile\u015ftirme):<\/strong><br \/>\nKullan\u0131c\u0131lar\u0131n oyunlar\u0131n\u0131 kaydedip daha sonra kald\u0131klar\u0131 yerden devam edebilmeleri, modern oyunlar\u0131n olmazsa olmaz \u00f6zelliklerindendir. Java'da nesne serile\u015ftirme (<code>java.io.Serializable<\/code> aray\u00fcz\u00fc), bir nesnenin durumunu disk \u00fczerine yazman\u0131za ve daha sonra tekrar y\u00fcklemenize olanak tan\u0131r.<br \/>\nBunun i\u00e7in <code>Kart<\/code>, <code>Deste<\/code>, <code>Oyuncu<\/code> ve <code>Oyun<\/code> gibi ana s\u0131n\u0131flar\u0131n\u0131z\u0131n <code>Serializable<\/code> aray\u00fcz\u00fcn\u00fc implement etmesi yeterlidir. Daha sonra <code>ObjectOutputStream<\/code> ve <code>ObjectInputStream<\/code> s\u0131n\u0131flar\u0131n\u0131 kullanarak nesnelerinizi bir dosyaya yazabilir ve dosyadan okuyabilirsiniz.<\/p>\n<pre><code class=\"language-java\">import java.io.*;\r\n\r\n\/\/ \u00d6rnek: Oyun s\u0131n\u0131f\u0131n\u0131 Serializable yapma\r\npublic class Oyun implements Serializable {\r\n    \/\/ ... mevcut kod ...\r\n\r\n    public void oyunuKaydet(String dosyaAdi) {\r\n        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(dosyaAdi))) {\r\n            oos.writeObject(this); \/\/ Oyun nesnesini kaydet\r\n            System.out.println(\"Oyun ba\u015far\u0131yla kaydedildi: \" + dosyaAdi);\r\n        } catch (IOException e) {\r\n            System.err.println(\"Oyun kaydedilirken hata olu\u015ftu: \" + e.getMessage());\r\n        }\r\n    }\r\n\r\n    public static Oyun oyunuYukle(String dosyaAdi) {\r\n        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(dosyaAdi))) {\r\n            Oyun yukluOyun = (Oyun) ois.readObject(); \/\/ Oyun nesnesini y\u00fckle\r\n            System.out.println(\"Oyun ba\u015far\u0131yla y\u00fcklendi: \" + dosyaAdi);\r\n            return yukluOyun;\r\n        } catch (IOException | ClassNotFoundException e) {\r\n            System.err.println(\"Oyun y\u00fcklenirken hata olu\u015ftu: \" + e.getMessage());\r\n            return null;\r\n        }\r\n    }\r\n}<\/pre>\n<p><\/code><br \/>\nBu sayede kullan\u0131c\u0131lar, istedikleri zaman oyunlar\u0131n\u0131 kaydedip \u00e7\u0131kabilir ve daha sonra kald\u0131klar\u0131 yerden devam edebilirler.<\/p>\n<p><strong>3. \u00c7oklu Oyuncu Deste\u011fi (A\u011f Programlama Temelleri):<\/strong><br \/>\nE\u011fer oyununuzu birden fazla ki\u015finin ayn\u0131 anda oynamas\u0131n\u0131 isterseniz, a\u011f programlama devreye girer. Java'n\u0131n <code>java.net<\/code> paketi, soket programlama (Socket Programming) ile istemci-sunucu (client-server) mimarisi \u00fczerinden a\u011f ileti\u015fimi kurman\u0131z\u0131 sa\u011flar. Bir sunucu, oyunun ana mant\u0131\u011f\u0131n\u0131 ve durumunu y\u00f6netirken, istemciler (oyuncular) sunucuya ba\u011flanarak oyunla etkile\u015fime girer. Bu, olduk\u00e7a karma\u015f\u0131k bir konudur ancak temelleri \u00f6\u011frenmek, \u00e7ok oyunculu oyunlar geli\u015ftirmenin kap\u0131lar\u0131n\u0131 aralar. Her oyuncunun hamlesi sunucuya iletilir, sunucu durumu g\u00fcnceller ve g\u00fcncel durumu t\u00fcm istemcilere geri g\u00f6nderir.<\/p>\n<p><strong>4. Mobil Uyumlu Tasar\u0131m \u0130\u00e7in \u0130pu\u00e7lar\u0131 (Web Tabanl\u0131 Oyun Senaryosu):<\/strong><br \/>\nHer ne kadar bu makale Java konsol\/masa\u00fcst\u00fc uygulamalar\u0131na odaklanm\u0131\u015f olsa da, e\u011fer kart oyununuzu gelecekte bir web uygulamas\u0131 olarak (\u00f6rne\u011fin Spring Boot ve JavaScript\/HTML\/CSS ile) geli\u015ftirmeyi d\u00fc\u015f\u00fcn\u00fcrseniz, mobil uyumluluk hayati \u00f6nem ta\u015f\u0131r. Mobil cihazlar i\u00e7in web aray\u00fczleri tasarlarken responsive (duyarl\u0131) tasar\u0131m prensiplerini uygulamal\u0131s\u0131n\u0131z.<br \/>\n*   <strong>Esnek Izgaralar ve Resimler:<\/strong> Sayfa d\u00fczenini piksel bazl\u0131 sabit geni\u015flikler yerine y\u00fczdelik de\u011ferler ve <code>flexbox<\/code> veya <code>CSS Grid<\/code> gibi modern CSS d\u00fczenleme teknikleriyle olu\u015fturun. Resimlerinizi <code>max-width: 100%; height: auto;<\/code> yaparak mobil cihazlarda ta\u015fmas\u0131n\u0131 engelleyin.<br \/>\n*   <strong>Media Queries:<\/strong> CSS <code>media query<\/code>'leri kullanarak farkl\u0131 ekran boyutlar\u0131 i\u00e7in farkl\u0131 stil kurallar\u0131 tan\u0131mlayabilirsiniz. Bu sayede, ayn\u0131 HTML yap\u0131s\u0131 farkl\u0131 cihazlarda farkl\u0131 g\u00f6r\u00fcn\u00fcmler alabilir.<\/p>\n<p>    ``<code>html<\/p>\n<pre><code class=\"language-css\">\r\n    \/* Temel stiller (masa\u00fcst\u00fc i\u00e7in varsay\u0131lan) *\/\r\n    .game-container {\r\n        display: flex;\r\n        flex-direction: row;\r\n        justify-content: space-around;\r\n        padding: 20px;\r\n    }\r\n    .player-hand {\r\n        width: 30%;\r\n        border: 1px solid #ccc;\r\n        padding: 10px;\r\n        margin: 5px;\r\n        text-align: center;\r\n    }\r\n    .card {\r\n        width: 80px;\r\n        height: 120px;\r\n        background-color: white;\r\n        border: 1px solid black;\r\n        margin: 5px;\r\n        display: inline-block;\r\n        box-shadow: 2px 2px 5px rgba(0,0,0,0.2);\r\n    }\r\n    \r\n    \/* Mobil cihazlar i\u00e7in medya sorgusu (geni\u015flik 768 pikselden azsa) *\/\r\n    @media (max-width: 768px) {\r\n        .game-container {\r\n            flex-direction: column; \/* Mobil&#039;de dikey s\u0131rala *\/\r\n            align-items: center;\r\n        }\r\n        .player-hand {\r\n            width: 90%; \/* Daha geni\u015f yer kaplas\u0131n *\/\r\n            margin-bottom: 15px;\r\n        }\r\n        .card {\r\n            width: 60px; \/* Kartlar\u0131 k\u00fc\u00e7\u00fclt *\/\r\n            height: 90px;\r\n            font-size: 0.8em;\r\n        }\r\n    }\r\n    <\/code><\/pre>\n<p>    Bu CSS kodu,<\/code>.game-container<code>elementinin masa\u00fcst\u00fcnde yatay olarak s\u0131ralanmas\u0131n\u0131 (row) sa\u011flarken, ekran geni\u015fli\u011fi 768px&#039;in alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde dikey (column) s\u0131ralanmas\u0131n\u0131 sa\u011flar. Oyuncu elleri (<\/code>.player-hand<code>) ve kartlar (<\/code>.card<code>) da mobil ekrana uyacak \u015fekilde yeniden boyutland\u0131r\u0131l\u0131r. Bu, web tabanl\u0131 bir kart oyununun mobil cihazlarda nas\u0131l daha iyi bir kullan\u0131c\u0131 deneyimi sunabilece\u011fine dair bir \u00f6rnektir.<\/p>\n<p>Bu ileri d\u00fczey konular\u0131 ara\u015ft\u0131rmak ve uygulamak, Java&#039;da oyun geli\u015ftirme becerilerinizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde geni\u015fletecek ve daha sofistike projeler \u00fcstlenmeniz i\u00e7in size g\u00fcven verecektir.<\/p>\n<p><strong>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/strong><\/p>\n<p>Bu kapsaml\u0131 rehber boyunca, Java&#039;da basit bir kart oyunu geli\u015ftirmenin temel ad\u0131mlar\u0131n\u0131 derinlemesine inceledik.<\/code>Kart<code>s\u0131n\u0131f\u0131 ile oyunun en k\u00fc\u00e7\u00fck yap\u0131 ta\u015f\u0131n\u0131 tan\u0131mlad\u0131k,<\/code>Deste<code>s\u0131n\u0131f\u0131 ile kartlar\u0131 organize edip kar\u0131\u015ft\u0131rmay\u0131 \u00f6\u011frendik ve<\/code>Oyuncu<code>s\u0131n\u0131f\u0131 ile oyunun ana karakterlerini modellendirdik. Ayr\u0131ca, basit bir \"Y\u00fcksek Kart \u00c7ekme\" oyun mant\u0131\u011f\u0131 olu\u015fturarak bu s\u0131n\u0131flar\u0131n nas\u0131l etkile\u015fimde bulundu\u011funu g\u00f6zlemledik. Nesne y\u00f6nelimli programlaman\u0131n (OOP) temel prensiplerini uygulayarak, sadece \u00e7al\u0131\u015fan bir kod de\u011fil, ayn\u0131 zamanda temiz, geni\u015fletilebilir ve anla\u015f\u0131l\u0131r bir yap\u0131 in\u015fa ettik.<\/p>\n<p>Oyun geli\u015ftirme, problem \u00e7\u00f6zme, algoritmik d\u00fc\u015f\u00fcnme ve soyut kavramlar\u0131 somutla\u015ft\u0131rma becerilerini geli\u015ftirmek i\u00e7in m\u00fckemmel bir aland\u0131r. Bu k\u00fc\u00e7\u00fck kart oyunu projesi, Java ve OOP d\u00fcnyas\u0131na sa\u011flam bir ad\u0131m atman\u0131z i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. \u00d6\u011frendi\u011finiz bu temel bilgilerle, daha karma\u015f\u0131k oyunlar tasarlayabilir, farkl\u0131 oyun kurallar\u0131 uygulayabilir ve hatta grafik aray\u00fczlerle oyunlar\u0131n\u0131z\u0131 g\u00f6rsel olarak zenginle\u015ftirebilirsiniz. Unutmay\u0131n, en iyi \u00f6\u011frenme yolu pratik yapmakt\u0131r. Bu projeyi kendi fikirlerinizle geni\u015fletmekten \u00e7ekinmeyin!<\/p>\n<p><strong># S\u0131k\u00e7a Sorulan Sorular (SSS)<\/strong><\/p>\n<p><strong>Soru 1: Bu oyunu nas\u0131l daha karma\u015f\u0131k hale getirebilirim?<\/strong><br \/>\n<strong>Cevap:<\/strong> Oyununuzu daha karma\u015f\u0131k hale getirmenin bir\u00e7ok yolu var! \u00d6rne\u011fin, Blackjack (21), Poker veya Uno gibi farkl\u0131 kart oyunlar\u0131n\u0131n kurallar\u0131n\u0131 uygulayabilirsiniz. Kartlara \u00f6zel yetenekler ekleyebilir (\u00f6rne\u011fin, \"Bu kart oynand\u0131\u011f\u0131nda, di\u011fer oyuncu bir kart \u00e7eker\"), \u00e7oklu turlu bir oyun d\u00f6ng\u00fcs\u00fc tasarlayabilir, oyuncular\u0131n puanlar\u0131n\u0131 takip edebilir veya yapay zeka (AI) rakipler ekleyebilirsiniz. Her yeni \u00f6zellik, \u00f6\u011frenme ve uygulama i\u00e7in yeni bir f\u0131rsat sunacakt\u0131r.<\/p>\n<p><strong>Soru 2: Java&#039;da ba\u015fka hangi oyunlar\u0131 geli\u015ftirebilirim?<\/strong><br \/>\n<strong>Cevap:<\/strong> Java, metin tabanl\u0131 macera oyunlar\u0131ndan, bulmaca oyunlar\u0131na, platform oyunlar\u0131ndan (\u00f6rne\u011fin, 2D platformerlar i\u00e7in LibGDX gibi k\u00fct\u00fcphanelerle) ve hatta basit strateji oyunlar\u0131na kadar geni\u015f bir yelpazede oyun geli\u015ftirmenize olanak tan\u0131r. Konsol tabanl\u0131 uygulamalarla Sudoku, Tic-Tac-Toe veya Adam Asmaca gibi oyunlarla ba\u015flayabilirsiniz.<\/p>\n<p><strong>Soru 3: Konsol yerine grafik aray\u00fcz (GUI) nas\u0131l eklerim?<\/strong><br \/>\n<strong>Cevap:<\/strong> Java&#039;da GUI geli\u015ftirmek i\u00e7in Swing veya JavaFX k\u00fct\u00fcphanelerini kullanabilirsiniz. Swing, Java ile birlikte gelen ve h\u0131zl\u0131ca formlar ve bile\u015fenler olu\u015fturman\u0131z\u0131 sa\u011flayan k\u00f6kl\u00fc bir k\u00fct\u00fcphanedir. JavaFX ise daha modern bir yakla\u015f\u0131mla, zengin grafikler, animasyonlar ve CSS ile stil deste\u011fi sunar. Bu k\u00fct\u00fcphanelerle<\/code>JFrame<code>veya<\/code>Stage<code>gibi ana pencereler olu\u015fturup, i\u00e7erisine<\/code>JButton<code>,<\/code>JLabel<code>,<\/code>JPanel<code>gibi g\u00f6rsel bile\u015fenleri ekleyerek oyununuzu g\u00f6rselle\u015ftirebilirsiniz.<\/p>\n<p><strong>Soru 4: Kart oyunlar\u0131nda g\u00fcvenlik neden \u00f6nemli?<\/strong><br \/>\n<strong>Cevap:<\/strong> \u00d6zellikle \u00e7ok oyunculu veya online kart oyunlar\u0131nda g\u00fcvenlik hayati \u00f6nem ta\u015f\u0131r. Kartlar\u0131n da\u011f\u0131t\u0131lmas\u0131, kar\u0131\u015ft\u0131r\u0131lmas\u0131 ve oynanmas\u0131 s\u00fcre\u00e7lerinin manip\u00fcle edilemez olmas\u0131, oyunun adilli\u011fini garanti eder. Rastgele say\u0131 \u00fcrete\u00e7lerinin do\u011fru ve tahmin edilemez olmas\u0131, sunucu taraf\u0131nda oyun mant\u0131\u011f\u0131n\u0131n i\u015flenmesi (istemci taraf\u0131nda de\u011fil), hileleri engellemek i\u00e7in do\u011frulama mekanizmalar\u0131 ve g\u00fcvenli ileti\u015fim protokolleri (\u00f6rne\u011fin SSL\/TLS) kullanmak \u00f6nemlidir.<\/p>\n<p><strong>Soru 5: Performans optimizasyonu i\u00e7in ne yapmal\u0131y\u0131m?<\/strong><br \/>\n<strong>Cevap:<\/strong> \u00c7o\u011fu k\u00fc\u00e7\u00fck Java kart oyunu i\u00e7in performans b\u00fcy\u00fck bir sorun olmaz. Ancak, daha b\u00fcy\u00fck projelerde veya \u00e7ok say\u0131da nesneyle \u00e7al\u0131\u015f\u0131rken \u015funlar\u0131 d\u00fc\u015f\u00fcnebilirsiniz: gereksiz nesne olu\u015fturmaktan ka\u00e7\u0131nma, do\u011fru koleksiyon t\u00fcr\u00fcn\u00fc se\u00e7me (<\/code>ArrayList<code>rastgele eri\u015fim,<\/code>LinkedList<code>s\u0131k ekleme\/\u00e7\u0131karma i\u00e7in),<\/code>StringBuilder` kullanarak string manip\u00fclasyonlar\u0131n\u0131 optimize etme ve potansiyel performans darbo\u011fazlar\u0131n\u0131 belirlemek i\u00e7in profilleme ara\u00e7lar\u0131 kullanma. Kodunuzu sade ve okunabilir tutmak, genellikle performans sorunlar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7er.<\/p>\n","protected":false},"excerpt":{"rendered":"Java&#8217;da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehberde, nesne y\u00f6nelimli programlama prensiplerini kullanarak s\u0131f\u0131rdan basit&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-30343","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek<\/title>\n<meta name=\"description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek\" \/>\n<meta property=\"og:description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-26T15:12:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-26T15:14:26+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek\",\"datePublished\":\"2025-09-26T15:12:38+00:00\",\"dateModified\":\"2025-09-26T15:14:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/\"},\"wordCount\":3635,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/\",\"name\":\"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-09-26T15:12:38+00:00\",\"dateModified\":\"2025-09-26T15:14:26+00:00\",\"description\":\"Hi\u00e7bir etiketi bulunamad\u0131.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek","description":"Hi\u00e7bir etiketi bulunamad\u0131.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek","og_description":"Hi\u00e7bir etiketi bulunamad\u0131.","og_url":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-09-26T15:12:38+00:00","article_modified_time":"2025-09-26T15:14:26+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek","datePublished":"2025-09-26T15:12:38+00:00","dateModified":"2025-09-26T15:14:26+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/"},"wordCount":3635,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/","url":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/","name":"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-09-26T15:12:38+00:00","dateModified":"2025-09-26T15:14:26+00:00","description":"Hi\u00e7bir etiketi bulunamad\u0131.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javada-kucuk-bir-kart-oyunu-gelistirmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java\u2019da k\u00fc\u00e7\u00fck bir kart oyunu geli\u015ftirmek"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=30343"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30343\/revisions"}],"predecessor-version":[{"id":30344,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30343\/revisions\/30344"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}