Son Haberler
Anasayfa / Yazılım / C# / Tic-Tac-Toe Oyunu Uygulaması – 1

Tic-Tac-Toe Oyunu Uygulaması – 1

Tic-Tac-Toe oyunu kalem ve kağıtla oynanan ve aynı zamanda Noughts and Cross olarak da bilinen, Türkçe’de de üçleme olarak adlandırdığımız oyundur. Aslında üç taş oyunu ile birebir aynı olan oyundur. Bu oyunun günümüzde ayrıca S.O.S şeklinde oynanma şekli de vardır, orada da amaç aynı çizgi üzerinde yer alan kutucuklarda yatay, dikey veya çapraz olacak şekilde S.O.S yazabilmek hedeflenmektedir. Bir nebze farklı olsa da birbirine benzer oyunlardır. Tic-Tac-Toe’da ise aynı hat üzerinde X ve O harflerini yazmaya çalışmayı hedeflemekteyiz. 3×3 boyutunda bir kare alanında oynanır.

Aşağıdaki şekilde görüleceği üzere; çapraz olarak X’leri koyan oyuncu kazanmıştır.

TicTacToe

Şimdi biz de Visual Studio’da masaüstünde kullanabileceğimiz ve oynayabileceğimiz bir Tic Tac Toe oyunu uygulaması gerçekleştireceğiz. Tic Tac Toe oyunu internet üzerinde bir çok site üzerinde online olarak oynanabilmektedir. Bunlardan bazıları;

http://playtictactoe.org/

http://www.calculatorcat.com/games/tic_tac_toe.phtml

http://www.factmonster.com/games/tictactoe.html

http://www.knowledgeadventure.com/games/tic-tac-toe/

Biz basit bir uygulama yapacağız tabi bizim amacımız bilgisayara karşı oynamak değil, iki farklı oyuncunun Tic-Tac-Toe oyununu oynaması şeklinde olacak. Oyuncular sıra ile ilgili kutucuklara tıklayacak ve kutucuklarda tıklanma süresine X ve O harfleri yazacaktır. Oyunculardan biri oyunu bitirdiğinde uygulama kazanan oyuncuyu ilan edecektir.

Şimdi genel hatları ile planımızı yapalım. Oyunu geliştirebilmek için bir class oluşturacağız. Bu class’ın adı Oyun olsun. Bütün kodlarımız bu class içinde yer alacak. Daha sonra bu class’tan yani bu sınıftan 9 adet Oyun adında nesne oluşturacağız. Bu nesneleri bir forma eklediğimizde oyunumuz tamamen hazır olacak. Şimdi bu Oyun nesnelerimizde neler olmalı onları sıralayalım:

  • Üzerine tıklandığında tıklayan oyuncunın sırasını bilecek ve buna göre kutuya X veya O yazacak,
  • Herhangi bir tıklamanın ardından, tüm kutuları kontrol ederek, kazanan var mı yok mu kontrol yapabilmesi,
  • Kazanan olduğunda kazanan kişi kim ise programın kullanıcıyı bilgilendirmesi,
  • Bir nesneye yani bir kutucuğa bir kez tıklandıktan sonra bir daha o kutucuk üzerinde işlem yapılmasına izin vermemesi,
  • Oyun bittiğinde yani kazanan olduğunda işlem yapmaması,
  • Oyun bittiğinde yeni oyun için bütün nesneleri temizleyebilmesi,

Nesnelerimizde istediğimiz şartlar bunlar olacak. Şimdi form üzerine yerleştireceğimiz nesnelerin biribirinden tek farkı 3×3 bölümlük alanda yani tabiri uygunsa eğer 3×3 ızgara üzerindeki konumları ve üzerlerindeki X veya O yazıları olacak. Bunun dışında yer alan tüm diğer özellikler tüm nesneler için ortak olacak. Ortak olan özellikleri Oyun nesnesi içinde static yapıda tanımlayabiliriz. Böylelikle bu özellikler herhangi bir nesne tarafından değiştirildiğinde bütün nesneler için değişim sağlanır.

Şimdi Visual Studio’da yeni bir proje oluşturuyoruz, açılan pencerede Class Library seçiyoruz. Ben Class Library adını ClassTicTacToeOyun veriyorum.

2016012520

VisualStudio yeni bir namespace ve bu namespace içinde de Class1 adında boş bir sınıf oluşturdu. Üste de gerekli namespace kütüphanelerini ekledi. Kodlarımız şu anda aşağıdaki gibi:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassTicTacToeOyun
{
public class Class1
{
}
}

Visual Studio Class1 adını taşıyan bu classı doğrudan Object class’ından türetmektedir. Yani Class1 sınıfı (class’ı) Object class’ının bir alt sınıfı olup, Object class’ının tüm özelliklerini ve tüm metotlarını taşımaktadır. Bu arada ben yazımda class ve sınıf tabirlerini kullanıyorum ikisi de direkt olarak doğrudan aynı anlama gelir. Sürekli aynı ifade tekrar etmesin diye bazen class bazen sınıf demeyi tercih ediyorum. Tabi şimdi bizim oyunumuzda Object sınıfının tüm özellikleri yeterli olmayacak. Sınıfımızın en azından form üzerine yerleştirilen kontrollerinin Buton, Textbox gibi kontroller sahip olduğu tüm özellikleri sahip olması gerekmekte. Bu nedenle sınıfımızın atasını yani temel sınıf -base class mantığı ile bahsedersek, diğer kontrollerin ortak atası olan UserControl sınıfı olarak belirtmemiz gerekecektir. Dolayısı ile şimdi aşağıdaki şekilde değişiklikler yapmamız gerekecek. Aşağıdaki ekran görüntüsüne aşağıdaki şekilde erişebiliriz:

Solution explorer alanında aşağıda görüleceği üzere, Class View alanına geçiyoruz. 2016012521

Mevcut durumda classımız şu şekilde görünmekte:

2016012522

Şimdi burada Class1 yazan sınıf adını TicTacToe olarak, ata sınıfınıda Object yazan ata sınıfını da UserControl olarak değiştiriyoruz. Aşağıda göreceğiniz şekilde değiştirme işlemimiz gerçekleştirildi.

Şimdi kodlarımız şu anda aşağıdaki gibi:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassTicTacToeOyun
{
public class TicTacToe : UserControl
{
}
}

Yeri gelmişken Object sınıfı yani Object Class nedir açıklayalım. Object Class .NET Framework sınıf hiyerarşisinde yer almaktadır ve hiyerarşinin kökünü oluşturur. Yani aslında diğer bütün class’ların atasıdır denilebilir. Bu yüzden yukarıda ata deyimi kullandım. Bir class’ta sahip olması gereken minimum özelliklerin hepsine sahiptir.

User Control class’ının çalışabilmesi için System.Windows.Forms ve aynı zamanda temel grafik işlemlerinin ve metin biçimlendirmeleri için de System.Drawing namespace kütüphanelerini uygulamamıza ekleyerek devam edelim. Bunu yapabilmek için solution explorer penceresinde ClassTicTacToeOyun classı altında yer alan References alanında sağ tıklayalım ve Add Reference diyelim.

2016012524

Açılan pencerede referenslar yüklendikten sonra System.Drawing ve System.Windows.Forms seçerek OK diyelim. Aşağıdaki resimde göreceğiniz üzere System.Drawing seçili. Biraz daha aşağıda ben System.Windows.Forms’u da seçtim. OK dedim.

2016012525

Aşağıda da görüleceği üzere System.Windows.Forms ve Sytem.Drawing referansları References alanına eklendiler. Şimdilik yazımızı burada sonlandıralım. Bir sonraki yazıda devam edebilmek dileği ile.

2016012526

 

 

 

 

 

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir