Sa Arkadaşlar İnşaat mühendisliği okuyan bir arkadaşın projesi hoca bi ödev vermiş ödevin konusu şu 2 kişilik bir oyun tasarlandı oyunda eksik verilen kod fonksiyonları var bizden bu fonksiyonların tamamlanması isteniyor.
Detaylı açıklama aşşağıda verildi.
Kod: Kodu kopyalamak için üzerine çift tıklayın!
Aşağıda tanımlanmış olan oyun programını istenen şekilde tamamlayınız. Program 3x3 ebadındaki bir tahta üzerinde iki oyuncudan kutucuklar seçmesini isteyerek yarışmalarını istemektedir. Oyuncular her hamlede boş kutulardan istediklerini seçebilmektedir. Amaç diğer oyuncudan önce yatay, dikey veya çapraz bir satırın bütün kutucuklarını almaktır. Bunu ilk başaran oyunu kazanır. Bunu için hem savunma hem atak hamleleri düşünülmelidir. Program iki oyuncunun oynayacağı şekilde yazılmıştır. Sizden istenen oyunu bilgisayara karşı oynanabilecek hale getirmenizdir. Bunu yapacak taslak programda mevcuttur. Yapmanız gereken programdaki boş bırakılan üç adet fonksiyonu doğru bir şekilde tamamlamanızdır. Bu fonksiyonlar:
Kazanma(): bilgisayara bir kazanma hamlesi bulduracak fonksiyondur.
Engelleme(): bilgisayarın rakibin kazanma hamlesini algılayıp engellemesini sağlayacak fonksiyondur.
Otomatik_hamle_seçme(): üstteki iki durum mevcut değilse, bilgisayara avantajlı bir hamle üretecek fonksiyondur.
Programı çalıştırıp, iki kişilik oyu seçtiğinizde, program size verilen hali ile iki gerçek oyuncu için doğru bir şekilde çalışacaktır. Bilgisayara karşı oynamak için bahsedilen üç fonksiyonun tamamlanması gereklidir.
#include <iostream>
#include <time.h>
using namespace std;
//hamlelerin kaydedileceği dizi
char pozisyonlar[10] = {'o','1','2','3','4','5','6','7','8','9'};
//bir hamleyi kaydeden fonksiyon, birinci kullanıcının aşdığı kutular X diğeri 0 ile gösteriliyor
void hamle_kayit(int i, char c)
{
pozisyonlar[i] = c;
}
//verilen bir i hamlesninin geçerli olup olmadığını kontrol eden fonksiyon, eğer 1. kutu daha önce alınmışsa tekrar seçilemez
int hamle_gecerlimi(int i)
{
if(i<=9 && i>=1 && pozisyonlar[i]!='X' && pozisyonlar[i]!='0')
return 1;
else
return 0;
}
/*her hamleden sonra, oyuncunun kazanıp kazanmadığını bu fonksiyon ile kontrol ediyoruz. örneğin eğer 1. 2. ve 3. kutuların hepsi X ise
1. oyuncu kazanıyor, bütün ihtimalleri kontrol ediyoruz*/
int kazanma_kontrolu()
{
if (pozisyonlar[1] == pozisyonlar[2] && pozisyonlar[2] == pozisyonlar[3])
return 1;
else if (pozisyonlar[4] == pozisyonlar[5] && pozisyonlar[5] == pozisyonlar[6])
return 1;
else if (pozisyonlar[7] == pozisyonlar[8] && pozisyonlar[8] == pozisyonlar[9])
return 1;
else if (pozisyonlar[1] == pozisyonlar[4] && pozisyonlar[4] == pozisyonlar[7])
return 1;
else if (pozisyonlar[2] == pozisyonlar[5] && pozisyonlar[5] == pozisyonlar[8])
return 1;
else if (pozisyonlar[3] == pozisyonlar[6] && pozisyonlar[6] == pozisyonlar[9])
return 1;
else if (pozisyonlar[1] == pozisyonlar[5] && pozisyonlar[5] == pozisyonlar[9])
return 1;
else if (pozisyonlar[3] == pozisyonlar[5] && pozisyonlar[5] == pozisyonlar[7])
return 1;
else if (pozisyonlar[1] != '1' && pozisyonlar[2] != '2' && pozisyonlar[3] != '3'
&& pozisyonlar[4] != '4' && pozisyonlar[5] != '5' && pozisyonlar[6] != '6'
&& pozisyonlar[7] != '7' && pozisyonlar[8] != '8' && pozisyonlar[9] != '9')
return 0;
else
return -1;
}
//oyun tahtasını çizen fonksiyon. her hamleden sonra oyun tahtasını bu fonksiyonu çağırarak tekrar gösteriyoruz
void tahta()
{
system("cls");
cout << "Player 1 (X) - Player 2 (O)" << endl << endl;
cout << endl;
cout << " | | " << endl;
cout << " " << pozisyonlar[1] << " | " << pozisyonlar[2] << " | " << pozisyonlar[3] << endl;
cout << "_____|_____|_____" << endl;
cout << " | | " << endl;
cout << " " << pozisyonlar[4] << " | " << pozisyonlar[5] << " | " << pozisyonlar[6] << endl;
cout << "_____|_____|_____" << endl;
cout << " | | " << endl;
cout << " " << pozisyonlar[7] << " | " << pozisyonlar[8] << " | " << pozisyonlar[9] << endl;
cout << " | | " << endl << endl;
}
int kazanma()
{
//burada bilgisayarın o ana kadar koydugu işaretlere bakarak, sıradaki hamle ile kazanabileceği durumları kontrol edeceksiniz.
//eğer böyle bir durum var ise o hamleyi geri döndüreceksiniz
//geri döndüreceğiniz bu değer, bilgisayarın sıradaki hamlesi olacak ve bilgisayar bu hamle ile oyunu kazanacak
return -1;
}
int engelleme()
{
//burada bilgisayarın eğer kazanma hamlesi yok ise, rakibin kazanma hamlesini kontrol edeceksiniz
//eğer rakip bir hamle ile oyunu kazanacak durumda ise, bilgisayarın sıradaki hamlesi olmak üzere, rakibin o hamlesini geri döndüreceksiniz
//bu bilgisayarın sıradaki hamlesi olacak ve bilgisayar rakibin kazanmasını engellemiş olacak
return -1;
}
int otomatik_hamle_secme()
{
//burada üstteki iki durumun olmaması durumunda bilgisayarın sıradaki hamlesini belirleyeceksiniz
//eğer bilgisayarı kazandıracak bir hamle yoksa ve rakip de kazanma hamlesine sahip değilse o zaman bilgisayara avantaj sağlayacak bir hamle
//dondıreceksiniz. Bu bilgisayarın sıradaki hamlesi olacak ve bilgisayara avantaj sağlamaya çalışacaksınız.
//burayı nasıl en etkili şekilde yapacağınızı düşünmeniz gereklidir. örneğim eğer bilgisayar 1. kutucuğu almış ise ve aynı zamanda 2. ve 3. kutular boş ise
// o zaman 2. kutucuğu alarak bilgisayara sıra tekrar geldiğinde bir kazanma hamlesi sağlamış olacaksınız.
return 5;
}
int main()
{
srand (time(NULL));
int player, i=-1, hamle;
int oyun_tipi=0;
//Tek kişilik veya iki kişilik oyun seçme
while(oyun_tipi!=1 && oyun_tipi!=2)
{
system("cls");
cout<<"\t1. iki oyuncu\n\t2. Bilgisayara karsi\n";
cout<<"\tSecim yapin (1 veya 2):";
std::cin>>oyun_tipi;
}
char mark;
//ilk hamle yapacak oyuncu rastgele seçiliyor
player= rand() % 2+1;
while(i==-1)
{
tahta();
if(oyun_tipi==2 && player==2) //bu if ifadesi 2. oyuncunun bilgisayarmı gerçek kişimi olduğunu kontrol ediyor eğer bilgisayar ise bahsedilen sizin yazacağınız fonksiyonlar kullanılarak en uygun hamle seçilecek
{
hamle=kazanma();
if(hamle==-1)
hamle=engelleme();
if(hamle==-1)
hamle=otomatik_hamle_secme();
}
else
{
cout << "Player " << player << ", bir sayi gir: ";
std::cin >> hamle;
}
while(!hamle_gecerlimi(hamle))//hamlenin geçerli olup olmadığı kontrol ediliyor
{
tahta();
std::cout<<"\Gecersiz hamle girdiniz. Tekrar deneyin\n";
cout << "Player " << player << ", bir sayi gir: ";
std::cin >> hamle;
}
if(player == 1)
mark='X';
else mark='&';
hamle_kayit(hamle,mark);//girilen hamle kaydediliyor
i=kazanma_kontrolu(); //girilen hamle ile oyuncunun oynu kazanıp kazanmadığı kontrol ediliyor
if(i==-1)
{
if(player==1)//sonraki hamle için oyuncu değiştiriliyor
player=2;
else
player=1;
}
}
tahta();//tahta güncelleniyor
if(i==1)//kazanan oyuncu ekranda gösteriliyor
cout<<"==>\aPlayer "<<player<<" kazandi ";
else
cout<<"==>\aBerabere";
return 0;
}