Arama butonu
Bu konudaki kullanıcılar: 2 misafir
9
Cevap
990
Tıklama
0
Öne Çıkarma
C ve C++ proje onerisi !
C
11 yıl
Er
Konu Sahibi

merhaba arkadaslar
C ve C++ biliyorum bu aralar proje gelistirmek istiyorum proje onerisi olan varsa yazabilir mi ? birlikte beyin firtinasi yapabiliriz :D

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



K
11 yıl
Yüzbaşı

"Yıllar önce arkadaşımla beraber eğlenceli bir sayı tahmin oyunu oynardık. Bilmiyorum, bilindik bir oyun mudur? Ama öğrendiğimden beri sık sık sıra arkaşımla oynardım. Neyse kod yazmayı öğrenince bir gün aklıma geldi şunun bir programını yazayım diye, biraz uğraşla oldu. Şimdi bu oyunu yapma sırası sizde. Oturun güzelce düşünün temel seviye programcılar için çok tecrübe katacak bir program. Oyun şu şekilde:

Bu oyun normalde iki kişiyle oynanan bir oyun. Siz bilgisayarla beraber oynayacaksınız. Bilgisayar rast gele 4 basamaklı bir sayı tutacak siz de onu tahmin etmeye çalışacaksınız.

4 basamaklı sayının özellikleri:
* 0 ile başlamayacak
* Tekrarlı rakam içermeyecek (2426 gibi - iki tane 2 kullanımış)

Peki tahmin nasıl olacak. Siz yine yukarıdaki özelliklere sahip 4 basamaklı bir sayı gireceksiniz ve bilgisayar bu sayıyı inceleyip size şu şekilde bilgi verecek :

Eğer yazdığınız 4 basamaklı sayıdan, tutulan 4 basamaklı sayıyla benzer rakam varsa; eğer basamağı uyuşuyorsa benzer rakam adedi=x olmak üzere bilgisayar +x, eğer basamağı uyuşmuyorsa -x, şeklinde sonuç bildirir. +4 ü yakalyınca sayıyı bilmiş olup oyun sonlandırılır. Şu örneği inceleyelim (bilgisayarın tuttuğu sayı 1453 olsun):

tahmin1: 5809 -> sonuc1: +0 -1 açıklama1: yalnız 5 tuttu fakat basamağı oturmadığı için - olarak yazıldı
tahmin2: 1039 -> sonuc2: +1 -1 açıklama2: 1 tutttu basamağı da tuttu +1, 3 tuttu basamağı tutmadı
tahmin3: 1498 -> sonuc3: +2 -0 açıklama3: 1 ve 4 basamağıyla beraber tuttu, iki tane olduğu için +2
tahmin4: 1435 -> sonuc4: +2 -2 açıklama4: 1 ve 4 aynı şekilde. 3 ve 5 basamağı tutmadığı için -2
tahmin5: 1453 -> sonuc5: +4 -0 açıklama5: hepsi basamğıyla beraber tuttu, oyun bitti

Daha açıklayıcı olsun diye algoritmik sırası kısaca şı şekilde:
*sayıyı kurallara uygun üret
*kullancıdan alına verinin kurallara uygunluğunu kontrol et
*değerlendirme yap
*+4 olana kadar kullanıcıdan veriyi almaya kontrol etmeye devam et

Hadi kolay gelsin (kaynak kodu çözülmediği takdirde paylaşacağım)... "


alıntıdır.





< Bu mesaj bu kişi tarafından değiştirildi keftar -- 5 Eylül 2014; 14:56:22 >
Bu mesaja 2 cevap geldi.
M
11 yıl
Yarbay

Bence bunu, bilgisayarin da tahmin yapacagi sekilde yazmak daha zevkli.



< Bu ileti mobil sürüm kullanılarak atıldı >

S
11 yıl
Teğmen

şerafettin arıkan'ın kitabında görüp,çözmeye çalışmıştım. Hatırladığım kadarıyla oyunu yapmıştım ancak bir bölümü eksik kalmıştı.Acaba kaynak kodu, pm atar mısın? Saygılarımla...


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @keftar
K
11 yıl
Yüzbaşı

#include <conio.h> 
#include <iostream>
#include <time.h>
#include <string>
using namespace std;
class Oyun
{
public:
void rastgele();
int farkli();
void sayiAl();
bool esitmi();
bool sart(Oyun);
bool sifir();
bool farklimi();
void degerlendir();
char sayi[4];
string tahmin;
private:
char rast;
};
int main()
{
Oyun A;
srand(time(0));
A.rastgele();
A.sayiAl();
if(A.sart(A)==false && A.esitmi())
A.degerlendir();
while(A.sart(A) || A.esitmi())
{
if(A.sifir())
cout<<"sayi 0 ile baslamayacak!!"<<endl;
if(A.farklimi())
cout<<"sayilar birbirinden farkli olacak!!"<<endl;
A.sayiAl();
if(A.sart(A)==false && A.esitmi())
A.degerlendir();
}
A.degerlendir();
cout<<"tebrikler bildiniz!!!";
getch();
}
void Oyun::rastgele()
{
for(int i=0; i<4; i++)
{
c:

rast=rand()%10+48;
sayi[i]=rast;
if(sayi[0]=='0')
goto c;
if(sayi[i]==sayi[i-1] || sayi[i]==sayi[i-2] || sayi[i]==sayi[i-3])
goto c;

}
}
void Oyun::sayiAl()
{
cout<<"sayiyi tahmin et"<<endl;
cin>>tahmin;
}
bool Oyun::sart(Oyun A)
{
if(A.sifir() || A.farklimi())
return true;
else
return false;
}
bool Oyun::esitmi()
{
int sayac=0;
for(int i=0; i<4; i++)
if(sayi[i]==tahmin[i])
sayac++;
if(sayac==4)
return false;
else
return true;
}
bool Oyun::sifir()
{
if(tahmin[0]=='0')
return true;
else true;
}
bool Oyun::farklimi()
{
int k=0;
for(int i=0; i<3; i++)
for(int j=i+1; j<4; j++)
if(tahmin[i]==tahmin[j])
k++;
if(k!=0)
return true;
else
return false;
}
void Oyun::degerlendir()
{
int arti=0,eksi=0;
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
{ if(i==j)
{ if(sayi[i]==tahmin[j])
arti++;
}
if(i!=j)
{ if(sayi[i]==tahmin[j])
eksi++;
}
}
cout<<"+"<<arti<<" -"<<eksi<<endl;
}


alıntırdır.





< Bu mesaj bu kişi tarafından değiştirildi keftar -- 5 Eylül 2014; 22:28:54 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @sparcoysn
S
11 yıl
Teğmen

Henüz C++ bilmiyorum acaba C ile yazılmışı yok mu?


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @keftar
K
11 yıl
Yüzbaşı

o zaman c++ öğrenme zamanın geldi

yazılan kodun c'den farkı printf yerine cout scanf yerine cin yazılmış.

ama normal c ile c++ arasında bundan daha fazla farklılıklar tabi

syntax'ları benzerdir genel olarak ama programlama mantıkları -temelde aynı olmakla birlikte- birbirinden farklıdır.



C
11 yıl
Er
Konu Sahibi

bu oyun beni biraz zorlar gibi geldi bana ama cok tesekkur ederim



B
11 yıl
Teğmen

Hocam ne iyi etmişsinizde yazmışsınız bende android öğreniyorum bugün javada bilgilerimi tazelemek için ufak çaplı proje bakıyordum ki sizin projenize denk geldim. Yaklaşık 1 saatimi aldı ama yaparken cidden eğlendim. Yarın işim olduğu için ve saat geç olduğundan görselliğini falan ayarlayamadım ama geliştirilebilir birşey size şöyle sunayım.

Arkadaş c veya c++ ile istemiş ben android üzerinde geliştirdim.

Sağ kısımda ki logcatte rasgele sayı görülüyor kırmızı olarak. Burda işin biraz hilesine kaçtım size gösterme amacıyla :) .


< Resime gitmek için tıklayın >

< Resime gitmek için tıklayın >

Kodu da vereyim;

 


package com.example.sayioyunudonanim;



import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {


String sayiKarakterleri,SsabitSayi;
String girilenSayi;
int sabitSayi;
EditText sayiEditText;
Button denemeButton;
TextView puanDurumu;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

sayiEditText=(EditText) findViewById(R.id.sayiEditText);
Button deneButton=(Button) findViewById(R.id.deneButton);
puanDurumu=(TextView) findViewById(R.id.puanlamaTextView);
suzgectenGecir();

deneButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
girilenSayiDon();

}
});


}

public int rasgeleSayiUret(){


int rasgeleSayi=0;


rasgeleSayi=1234+(int)(Math.random()*8765);

return rasgeleSayi;
}

public void suzgectenGecir(){
int c=rasgeleSayiUret();
sayiKarakterleri=String.valueOf(c);
char [] sayiKarBol;
sayiKarBol=sayiKarakterleri.toCharArray();
boolean suzgec=false;

while(!suzgec){
Log.e("tag", String.valueOf(c));
sabitSayi=c;

for(int i=0 ; i<3;i++){

for(int y=i+1;y<4;y++){


if(sayiKarBol[i]==sayiKarBol[y]){

suzgectenGecir();


}
else{
suzgec=true;

}

}

}
}

}

public int sabitSayiDon(){
return sabitSayi;
}

public void girilenSayiDon(){
int arttir = 0, azalt=0;
girilenSayi=String.valueOf(sayiEditText.getText());
char [] girilenSayiBol , sabitSayiBol;
girilenSayiBol=girilenSayi.toCharArray();
SsabitSayi=String.valueOf(sabitSayi);
sabitSayiBol=SsabitSayi.toCharArray();

Log.e("tag", String.valueOf(sabitSayi));

if(Integer.valueOf(girilenSayi)<1000){

Toast.makeText(this, "Girdiginiz Sayi 1000'den kucuk olamaz!",Toast.LENGTH_LONG).show();

}
else{
for(int i=0;i<4;i++){


for(int y=0;y<4;y++){

if(sabitSayiBol[i]==girilenSayiBol[y]){
if(i==y){
arttir++;
}
else{
azalt--;
}

}

}

}

puanDurumu.setText(puanDurumu.getText()+"Tahminin: "+girilenSayi+" D.Basamak:"+arttir+" Y.Basamak: "+azalt+"|| ");

if(arttir==4){


Toast.makeText(this, "Tebrikler Sayiyi Dogru Tahmin Ettiniz!", Toast.LENGTH_LONG).show();
}

}
}

}






< Bu mesaj bu kişi tarafından değiştirildi BayGold -- 8 Eylül 2014; 1:58:09 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @keftar
G
11 yıl
Yarbay

O c++ kodunu yazan daha döngü kuramamış ki. Kodda class oldumu oop yazdığını zannediyor bi kısım zevat. Ben genel amaçlı versiyonunu yazdım. İster konsolda, ister pencereli, grafikli olarak geliştirilebilir. I/O kullanıcıya bırakıldı. Kaç basamaklı olacağını da seçebilirsiniz, 4 olması şart değil.

tahmin.h
 
#ifndef TAHMIN_H
#define TAHMIN_H
#include <random>

class SoyutTahmin
{
public:
SoyutTahmin(int);
void yenidenUret();
bool degerlendir(int);

private:
void kontrolEt(const std::string &);
virtual bool sonuc(int, int) = 0;

char tut_sayi[10];
std::default_random_engine uretec;
std::uniform_int_distribution<> rast_rakam;

protected:
const int basamak;
};

#endif // TAHMIN_H


tahmin.cpp
 
#include "tahmin.h"
#include <algorithm>

SoyutTahmin::SoyutTahmin(int _bas) : rast_rakam(1, _bas - 1), basamak(_bas)
{
std::random_device bas_deger;
uretec.seed(bas_deger());

for(int i = 0; i < 10; ++i)
tut_sayi[i] = i + '0';
yenidenUret();
}

void SoyutTahmin::yenidenUret()
{
std::shuffle(tut_sayi, tut_sayi + 10, uretec);
if(tut_sayi[0] == '0')
std::swap(tut_sayi[0], tut_sayi[rast_rakam(uretec)]);
}

bool SoyutTahmin::degerlendir(int tahmin)
{
std::string str = std::to_string(tahmin);
kontrolEt(str);

const char *sayi = str.c_str();
char *son = tut_sayi + basamak;
int poz = 0, neg = 0;

for(int i = 0; i < basamak; ++i) {
if(std::find(tut_sayi, son, sayi[i]) != son) {
if(sayi[i] == tut_sayi[i])
++poz;
else
++neg;
}
}
return sonuc(poz, neg);
}

void SoyutTahmin::kontrolEt(const std::string &str)
{
auto bak = [&str] (char kr)-> bool {
return std::count(str.begin(), str.end(), kr) > 1;
};
if(basamak != str.length() || std::any_of(str.begin(), str.end(), bak))
throw basamak;
}


main.cpp
 
#include <iostream>
#include "tahmin.h"

class Tahmin : public SoyutTahmin
{
public:
Tahmin(int _bas = 4) : SoyutTahmin(_bas) { }

private:
bool sonuc(int poz, int neg)
{
std::cout << "+" << poz << " -" << neg << std::endl;
return poz == basamak;
}
};

int main()
{
std::cout << "Sayıyı tahmin edin\n";
Tahmin oyun;
int sayi;
bool bitti = false;

do {
std::cin >> sayi;
try {
bitti = oyun.degerlendir(sayi);
}
catch(int a) {
std::cout << "Hatalı giriş! Kurallara uygun sayı girin.\n";
continue;
}
}
while(!bitti);

std::cout << "Oyun bitti.\n";
return 0;
}





< Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 8 Eylül 2014; 7:22:28 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.