Eren GENÇTÜRK

Merhaba arkadaşlar.

Osmangazi Üniversitesi Object Oriented Programming dersi için yaptığım proje.

Proje için gerekli olanları aşağıdaki gibi hoca bize verdi.Kodlamaya proposals kısmının altından devam edeceğim.

Bu Kısım fazla önemli değil ingilizce zaten fazla bir şey anladığım da yok.

Specification:
This is a board game. A sample user interface is given in Fig. 1.
Fig. 1. Sample user interface of the Find the Same, Get the Fame…
The game has the following rules:
• The game board contains 5×5 columns of letters where each column consists of 10 letters. The
columns will be formed with the letters (A – Z), randomly. The player only sees the top of these
columns. The top items will be closed by default.
• The player plays by entering the coordinates of two columns. This means that the player requests
comparison of the letters at the top of these columns. These two letters will be shown to the player
for a short time and will be closed again, if they are not the same. Otherwise, these two letters will
be removed from the top of the columns and the player will gain 5 points.
• The game will continue until all the letters are removed or more importantly, if no two of the
remaining top letters are the same, i.e., there is no possible improvement. In the second case, all
columns will be filled with new random letters from scratch.
• The player can request to terminate the game by pressing ‘Q’.
• There will be a “Top Ten High Scores” file which holds the points and duration information of the
highest scores where the score is computed by dividing points to duration. When the game ends,
the score of the player will be checked with the scores in this file and inserted if deserved.
• The game can be played by one or two players. When the program starts, single/multiplayer game
choice should be presented to the user. In a multiplayer game, when one player enters her/his
guess for the same cards and s/he is successful, her/his turn will continue, otherwise the next
player will do the guessing. The durations and the points of the players should be counted
separately.
Requirements:
At least, the following classes will be used in the project:
• Stack
• Controller/Manager
• Player
The Stack class should have the default stack implementation without any extra variable or function
definitions. The Player class will be responsible for user input controls with error checks.
The Controller class should control the game rules, manage the screen output and scores.

Proje 5-6 gün ve her gün 4-5 saatlik bir çalışma sonucu ortaya çıktı.Kodlama yaparken neyin lazım olacağını hangi fonksiyonların kullanılacağını bir kağıda sırası ile yazdım. Öncelikle bir plan oluşturmak neyi nerde nasıl yapabileceğimizin fizibilite çalişması yaparak not etmek bize çok fayda sağlayacagı için bu şekilde başlamayı tercih ettim.Bir söz vardır:”Planlamaya ayrilan bir dakika, Uygulamada bir saat kazandirir.“.Mantık bu :) .

Neyse ilk olarak matrix in constructorunu tanımladım ve default olarak tanımlanan matrixin içini ‘-’ ler ile doldurdum default matrixde.Columns ve Rows ların get ve set fonsiyonlarını yazarak kodlamaya devam ettim.Daha sonra herhangibir matrixin içerisini ‘-’ ler ile dolduracağımız MatrixEmpty fonksiyonunu yazdık matrix classında.Yazdığım MatrixFill fonksiyonu ile de matrix in içine random upper harf atadık.MatrixShow ise matrix imimizi göstermek istediğimiz yerde matrixi gösteren fonksiyon.

Matrix fonksiyonunu yazarken karşılaştığım sorunlardan biri random harf üretme idi.Bu problemi ASCII kodu kullanarak ürettiğim sayıları aralık olarak uppercase harflerin ASCII kod sayılarını baz aldık ve daha sonra bunları char a çevirdik.

Game class’ı her nekadar kısa ve önemsiz gözükse de önemli bir işleve sahip.Game class’ı  kullanıcıdan kordinantları almaya yarıyor. Overload ettiğimiz >> ve << ile de kordinant isteme ve girme noktasında görsellik ve kolaylık sağlıyor bize.

Daha sonra ControllerManager class’ı ile devam ettim kodlamaya.ControllerManager’de  Start_Menu ile başladım kodlamaya. Start_Menu fonksiyonu ile başlangıç ekranında nelerin görüneceğini yazdım.Start_Menu de switch case yapısını kullanarak kullanıcının seçim yapmasını sağladım.

ControllerManager class’ı fonksiyonlarından biri ControlForCordinantes. Bu fonksiyonda girilen kordinantların 0 ile 4 arasında olmasını kontrol ediyoruz. ControlNotSameMember fonksiyonu ile de oyunun bitip bitmediğini kontrol ediyoruz.Burada ControlNotSameMember fonksiyonunu yazarken bayağı uğraş verdim.Ilk başta netin nasıl olacagına kara veremedim sonra vector kullanarak bunu çözebileceğimi anladım.Vector kullanırken burada daha sonraki classda göreceğimiz kullanıcının bildiği harflerin yerine ‘-’ ekleme ile bilinen harfleri matrixten çıkarıyoruz yerine ‘-’ ekliyoruz ve arta kalan harfleri vector tarzda arraya ekliyoruz.Burada vector kullanma sebebim ise bilinen harf sayısı sürekli değişeceği için esnek bir yapı olması.Vectore eklediğimiz harfleri çift for kullanarak baştan sona kontrol ediyor ve aynı harfin var olup olmadığını denetliyoruz.

Ek olarak classtaki Wait fonksiyonu ile de kullandığımız herhangibir yerde proğramı  fonksiyona göderdiğimiz int değer kadar saniye bekleme sağlıyor.

Son olarak Player class’ını yazdım.Kodlamada en çok uğraştıran kısım olan Player class’ı tek ve çok kullanıcı ile oyunun oynanmasını sağlayan, kullanıcının aldığı puan süreyi ismi ile txt dosyasına kaydeden fonksiyonların kodları içeriyor.

Oyunda ve kodlamada en önemli kısım SinglePlayer kısmı.Bu fonksiyonda goto ve if yapısını çok kullandım.Goto yapısı her ne kadar kodlamada elverişli olmasada aklıma gelen tek çözüm yöntemi idi.

İf yapısı ile şartları kontrol ediyor ve şartlar ugun değil ise goto ile ya başa gidiyor yada sona gidiyorduk.Kullanımı sakıncalı fakat kolaydı.

Başlangıcta kullanıcıdan ismini girmesini istiyoruz ve oyuna devam ediyoruz.Başta 3 matrix tanımladım bunun sebebi  1 matrixi random harflerle üretip hafızada tutuyoruz.Oyuncunun bildiği harferi 2. Ürettiğimiz boş matrix e atıyoruz. 3. Matrix ise aracı olarak kulanıyoruz eğer harfler benzer bulunmamış ise harflerin sadece ekranda görünüp sonra tekrar eski haline gelmesi için bilinenlerin hafızada tutulmasını sağlamak amacı ile kullanıyorum.Bunun daha basit yöntemi olacağını biliyorum fakat uzun uğraşlar ile ancak bukadarını yapabildim.Kodlamada en sıkıntılı yer burası idi.

İlk olarak girilen kordinantların doğrulugunu kontrol ediyoruz yani daha önce bilinen harlerin olduğu koordinantmı yoksa ucuk bir koordinantmı diye sonra ise if yapılarında ControllerManager class’ının fonksiyonlarını kullanarak tek tek kontrollerden geçiriyoruz girilen koordinantlarda bulunan harfleri. Şartlara göre kullanıcıya puan ve süre ekleniyor.

MultiPlayer kısmında ise SinglePlayerdeki kodların aynısını kullandım.Ek olarak sadece sıranın hangi kullanıcıda olduğunu beliremek için player1 ve player2 için MultiControl sayısı ekledim.Bu MultiControl sayısı ilk başta her iki oyuncu için 0 ile başlıyor ve 1. Oyuncu oyunu oynamaya başlıyor. Eğer 1. Oyuncu doğru veya yanlış tahminde bulunmuş ise MultiControl sayısı 1. Oyuncu için 1 arttırılıyor. Kontorlu ise 1. Oyuncunun  MultiControl sayısı 2. Oyuncunun MultiControl sayısına eşit ise 1. Oyuncunun sırası geldiğini anlıyoruz fakat ise 1. Oyuncunun  MultiControl sayısı 2. Oyuncunun MultiControl sayısından buyuk ise sıranın 2. Oyuncuda olduğunu anlıyoruz.

Son olarak bu classta TopTenPlayer ve MultiTopTenPlayer ile oyuncuların scorlarını sürelerini isimlerini txt dosyasına kaydetmesini sağladım ve consol oyunu içerisinde kullanıcının scorları görebilmesi için ShowTopTenPlayer ve ShowMultiTopTenPlayer i kodladım. Oyunun kurallarını gösteren Game_Rules ile de oyunun kurallarının ne olduğunu belirttim.

Oyunun kodlaması bunlardan ibaret. GamePlay.cpp de türetilen ControllerManager tarzda türetilen Cstrt nin fonksiyonu olan Start_Menu ile oynu başlatıyoruz ve artık oyun oynanmaya hazır oluyor.

Proje’nin Solution’u (Visual Studio 2010 ile yazılmıştır): Solution

Proje’nin Kaynak Kodları: Source Codes

Kodlara Bakmak için aşşagıdaki linkleride Kulanabilirsiniz:

ControllerManager.cpp : http://pastie.org/private/sr1xxq6cjd3vfl9kzq2pg

ControllerManager.h : http://pastie.org/private/r1xghfhwocxf1mjnmfdpig

Game.cpp : http://pastie.org/private/r2ncliuw1qr0jel4ffoq

Game.h : http://pastie.org/private/se1ct4imstgh6b65gfuwow

Matrix.cpp : http://pastie.org/private/lgxcou0ah6reemgdrumcxa

Matrix.h : http://pastie.org/private/bqax9bsmndyw06ivyvwdg

Player.cpp : http://pastie.org/private/t9x390ull4xqo2tk2f3gqq

Player.h : http://pastie.org/private/h1dbwptyxgwxqf8wnlwtmg

GaePlay.cpp : http://pastie.org/private/kqdlj0anycvea2oln7ktg

Saygılarımla…

Eren GENÇTÜRK

www.erengencturk.com.tr

© 2010 bilyaz.com , Programlama Makaleleri, Yazılım Makaleleri , Örnek Kodlar , Eğitim Videoları , C#,ASP.NET,SQL,PHP Suffusion WordPress theme by Sayontan Sinha