YazılımYazılım Projeleri

Sayı Tahmin Oyunu

Merhabalar,

Bu yazımda Sayı Tahmin Oyunu‘ndan bahsedeceğim ve devamında Java programlama dili ile kodunu yazacağım.

Öncelikle bu oyunun nasıl oynandığına bir göz atalım.

    • Bilgisayar rakamları birbirinden farklı ve ilk basamağı 0 olmayan bir sayı tutar.
    • Tahminde bulunursunuz.
    • Bilgisayar tahmininiz ile kendi sayısını şu şekilde
      karşılaştırır:
      İki rakam eşleşiyorsa ama sıra noları farklı ise –>  -1
      İki rakam eşleşiyorsa ve sıra noları da aynı ise –> +1
      Örneğin: 1687 ve 2346 karşılaştırması -1 üretir çünkü 6 rakamı 1.sayıda 2.sırada, 2.sayıda
      4.sırada bulunmaktadır.
      Örneğin: 1687 ve 2690 karşılaştırması +1 üretir çünkü 6 rakamı 1.sayıda 2.sırada, 2.sayıda da
      2.sırada bulunmaktadır.
    • Örnek oynanış şekli:

Oyun 4 basamaklı oynanıyor olsun.
– Bilgisayar 1234 sayısını tutmuş olsun.
– Tahmininiz: 5678
– Bilgisayarın cevabı: 0
– Tahmininiz: 4321
– Bilgisayarın cevabı: -4
– Tahmininiz: 1243
– Bilgisayarın cevabı: +2-2
– Tahmininiz:1234
– Bilgisayarın cevabı: TEBRİKLER +4!

Şimdi kodun algoritmasını güzel bir şekilde kurmak için yapmamız gereken adımlara bakalım.

  1. Kullanıcıdan basamak sayısı uzunluğunu seçmesini ister.
  2. Kod rakamları birbirinden farklı olan, kullanıcının tahmin etmesi istenen sayıyı üretir.
  3. Kullanıcıdan tahmin girişlerini alır.
  4. Kullanıcı belirlediği basamak sayısından farklı bir tahmin girerse yeniden tahmin alır.
  5. Bilgisayar alınan tahminle kendi sayısını karşılaştırır.
  6. Karşılaştırma sonucuna göre uygun cevap (+1, +2-2, 0 vs. gibi) verilir.
  7. 3., 4., 5. ve 6. maddeyi kullanıcı doğru sayıyı girene kadar tekrarlar.
  8. Kullanıcı doğru sayıyı girdikten sonra tebriklerini sunar.

Algoritmayı kafamızda oluşturduğumuza göre kodlamaya başlayabiliriz.

Aşağıda öncelikle kodun açıklamalı versiyonunu ardından okunabilirliği arttırmak için açıklamasız versiyonunu bulacaksınız.

 

Açıklamalı Versiyon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class GuessGame {

     public static void main(String[] args) {
          runGame();
     }

     public static int[] randomNumber(int lengthOfNumber, int[] array) {
          /*
          * Random sayının üretildiği metot. İlk rakamın 0'dan başlamaması
          * gerektiği için öncelikle dizimizi while döngüsü ile kontrol ediyoruz.
          * Eğer dizimizin ilk elemanı 0 değil ise döngüden çıkıyor ve dizimizi
          * return ediyoruz. İlk for döngümüzün içinde dizimizi basamak sayısı
          * kadar döndürüp 0-9 aralığında random değer ataması yapıyoruz. İkinci
          * for döngümüzde ise rakamların birbirinden farklı olmasını kontrol
          * ediyoruz ve bu kontrol işleminin dizinin hep ilk elemanından başlaması
          * için j değerini döngüden çıkmadan önce sürekli sıfırlıyoruz.
          */

          Random r = new Random();

          int number, randomArray[] = new int[lengthOfNumber];

          while (randomArray[0] == 0) {

               for (int i = 0; i < randomArray.length; i++) {
                    number = r.nextInt(10);

                    for (int j = 0; j < randomArray.length; j++) {
                         if (randomArray[j] == number) {
                              number = r.nextInt(10);
                              j = 0;
                         }
                    }
                    randomArray[i] = number;
               }
          }
          return randomArray;
     }

     public static void writeArray(int[] array) {
          /* Dizinin ekrana yazdırıldığı metot */

          for (int i : array) {
               System.out.print(i);
          }
     }


     public static int[] decompose(int lengthOfNumber, int number, int[] array) {
          /*  Kullanıcın girdiği sayının basamaklarına ayrıldığı metot. Buradaki
           *  while döngüsü sayı 0'dan büyük olduğu sürece devam edecek.
           *  Devamındaki for döngüsünde ise sayının sürekli 10'a modu alınıp
           *  devamında 10'a bölünerek dizinin son elemanından ilk elemanına kadar
           *  atama işlemi yapılır. */

         
          while (number > 0) {
               for (int i = 0; i < lengthOfNumber; i++) {
                    int numberForArray = 0;
                    numberForArray = number % 10;
                    array[lengthOfNumber - i - 1] = numberForArray;
                    number = number / 10;
               }
          }
          return array;
     }

     public static String runGame() {
          /* Kullanıcıdan basamak sayısını belirlemesi istenir. */
          Scanner kb = new Scanner(System.in);
          System.out.print("Lütfen kaç basamak olacağını giriniz : ");
          int lengthOfNumber = kb.nextInt();

          /*
          * İlk başta belirlediğimiz basamak sayısına göre iki tane dizi
          * yaratıyoruz.
          * Bilgisayarın belirlediğimiz basamak sayısına göre random değerle
          * ürettiği sayıyı bu dizi içinde tutacağız = computerArray
          * Kullanıcın girdiği sayıyı bu dizi içinde tutacağız = myArray
          */

          int[] computerArray = new int[lengthOfNumber];
          int[] myArray = new int[lengthOfNumber];

          computerArray = randomNumber(lengthOfNumber, computerArray);

          System.out.print("Bilgisayarın tuttuğu sayı: ");
          writeArray(computerArray);

          String str = null;
          while (!Arrays.equals(computerArray, myArray)) {
               /*
               * İki rakam eşleşiyorsa ve sıra noları aynı ise countForSameOrder
               * integer'ı ile bu değeri tutuyoruz. İleride bu değeri tahmine göre
               * arttırabiliriz.
               */

               int countForSameOrder = 0;
               /*
               * İki rakam eşleşiyorsa ama sıra noları farklı ise
               * countForDifferentOrder integer'ı ile bu değeri tutuyoruz. İleride
               * bu değeri tahmine göre azaltabiliriz.
               */

               int countForDifferentOrder = 0;
               System.out.println();
               
               /*
               * Bu kısımda kullanıcın ilk başta belirlediği basamak sayısına göre
               * tahmin girmesi istenir. lengthOfGuess değişkeni ile kullanıcının tahmnin
               * ettiği sayının basamak uzunluğu tutulur.
               */

               System.out.print("Lütfen " + lengthOfNumber + " basamaklı tahmininizi girin: ");
               int guess = kb.nextInt();
               int lenghtOfGuess = Integer.valueOf(guess).toString().length();

               /*
               * Bu while döngüsünde kullanıcı ilk başta belirlediği basamak sayısı  
               * uzunluğundan farklı bir tahmin girerse, doğru basamak sayısında  
               * tahmin giresiye kadar tahmin istemeye devam edilir.
               */

               while (lenghtOfGuess != lengthOfNumber) {
                    System.out.print(
                                "Lütfen belirlediğiniz basamak sayısında tahmininizi giriniz ("
                                + lengthOfNumber + " basamaklı) :");

                    guess = kb.nextInt();
                    lenghtOfGuess = Integer.valueOf(guess).toString().length();

               }
               
               /*
               * Burada decompose(ayrıştırma) metodu çağırılır ve kullanıcının
               * girdiği sayı basamaklarına ayrılır.
               */

               decompose(lengthOfNumber, guess, myArray);

               /*
               * writeArray metodu çağırılarak kullanıcın girdiği sayı ekrana yazdırılır.
               */

               writeArray(myArray);

               for (int i = 0; i < lengthOfNumber; i++) {
                    for (int j = 0; j < lengthOfNumber; j++) {
                         if (computerArray[i] == myArray[j] && i == j)

                              /*
                              * İki rakam eşleşiyorsa ve sıra noları aynı ise +1
                              * arttıyoruz.
                              */

                              countForSameOrder++;

                         if (computerArray[i] == myArray[j] && i != j)

                              /*
                              * İki rakam eşleşiyorsa ama sıra noları farklı ise -1
                              * azaltıyoruz.
                              */

                              countForDifferentOrder--;
                    }
               }

               System.out.println();

               /*
               * Bilgisayarın ürettiği random sayı ve kullanıcının tahmini aynı
               * ise sonuç +basamaksayısı olur. Buradaki if koşulunda sonucu
               * kontrol ediyoruz ve sonuç +basamaksayısı ise tebrikler yazısını ekrana
               * bastırıyoruz. Else kısmında ise sonucun +basamaksayısı'na
               * eşit olmadığı anlardaki sonucu bastırıyoruz.
               */

               if (countForSameOrder == lengthOfNumber) {
                    str = "TEBRİKLER +" + lengthOfNumber + "!";
                    System.out.println(str);
               } else {
                    str = (countForSameOrder + " " + countForDifferentOrder);
                    System.out.println(str);
               }
          }
          kb.close();
          return str;
     }
}

 

 

Açıklamasız Versiyon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class GuessGame {

     public static void main(String[] args) {
          runGame();
     }

     public static int[] randomNumber(int lengthOfNumber, int[] array) {

          Random r = new Random();

          int number, randomArray[] = new int[lengthOfNumber];

          while (randomArray[0] == 0) {

               for (int i = 0; i < randomArray.length; i++) {
                    number = r.nextInt(10);

                    for (int j = 0; j < randomArray.length; j++) {
                         if (randomArray[j] == number) {
                              number = r.nextInt(10);
                              j = 0;
                         }
                    }
                    randomArray[i] = number;
               }
          }
          return randomArray;
     }

     public static void writeArray(int[] array) {
         
          for (int i : array) {
               System.out.print(i);
          }
     }

     public static int[] decompose(int lengthOfNumber, int number, int[] array) {

          while (number > 0) {
               for (int i = 0; i < lengthOfNumber; i++) {
                    int numberForArray = 0;
                    numberForArray = number % 10;
                    array[lengthOfNumber - i - 1] = numberForArray;
                    number = number / 10;
               }
          }
          return array;
     }

     public static String runGame() {
         
          Scanner kb = new Scanner(System.in);
          System.out.print("Lütfen kaç basamak olacağını giriniz : ");
          int lengthOfNumber = kb.nextInt();

          int[] computerArray = new int[lengthOfNumber];
          int[] myArray = new int[lengthOfNumber];

          computerArray = randomNumber(lengthOfNumber, computerArray);

          System.out.print("Bilgisayarın tuttuğu sayı: ");
          writeArray(computerArray);

          String str = null;
          while (!Arrays.equals(computerArray, myArray)) {
               int countForSameOrder = 0;
               int countForDifferentOrder = 0;
               System.out.println();

               System.out.print("Lütfen " + lengthOfNumber + " basamaklı tahmininizi girin: ");
               int guess = kb.nextInt();
               int lenghtOfGuess = Integer.valueOf(guess).toString().length();

               while (lenghtOfGuess != lengthOfNumber) {
                    System.out.print(
                                "Lütfen belirlediğiniz basamak sayısında tahmininizi giriniz ("
                                + lengthOfNumber + " basamaklı) :");

                    guess = kb.nextInt();
                    lenghtOfGuess = Integer.valueOf(guess).toString().length();

               }

               decompose(lengthOfNumber, guess, myArray);

               writeArray(myArray);

               for (int i = 0; i < lengthOfNumber; i++) {
                    for (int j = 0; j < lengthOfNumber; j++) {
                         if (computerArray[i] == myArray[j] && i == j)

                              countForSameOrder++;

                         if (computerArray[i] == myArray[j] && i != j)

                              countForDifferentOrder--;
                    }
               }

               System.out.println();

               if (countForSameOrder == lengthOfNumber) {
                    str = "TEBRİKLER +" + lengthOfNumber + "!";
                    System.out.println(str);
               } else {
                    str = (countForSameOrder + " " + countForDifferentOrder);
                    System.out.println(str);
               }
          }
          kb.close();
          return str;
     }
}

 
 
Son olarak yazdığımız kodun nasıl çalıştığına aşağıdan göz atabilirsiniz. Herkese iyi çalışmalar dilerim.

Sayı Tahmin Oyunu” üzerine 8 yorum

    1. Selam Gocmen,

      Tabii ki aynı algoritmayı kullanarak Pyton’da da yazmak mümkün.
      Örneğin, Pyhton için de random.randrange() methodunu kullanabilirsin.
      Çalışma mantığını anladıktan sonra çok zor olmayacaktır uyarlaman.

      1. Merhaba. Bilgisayarin tuttugu rakami bulan programi visual studio ile hazirlamistim. Bunun tersini de yapmaya çalışıyorum. Yani bizim tuttugumuz rakami bilgisayarin bulmasini sağlamak. Burada bircok olasılığı yazip verilen ipucuyu eslestirmek gerekiyor. O nedenle programi tamamlayamadim. Algoritma olarak daha basit bir mantik var midir? En kötü 7. seferde sayının bulunması gerekiyor.

        1. Selam Özhan,

          Program aslında bir kullanıcıdan aldığı sayı ile programın tuttuğu sayının karşılaştırmasını yapıyor. While döngüsü, döngünün ne zaman sonlanacağını bilmediğimiz durumlarda kullanılır. Senin case’inde limit 7 olarak belirlenmiş ve burada ‘while’ yerine ‘for’ döngüsününü kullanman gerekir. Karşılaştırmayı da tersi olacak şekilde yapıp, oyunu 7. tahminden sonra sonlandırabilirsin. Oyunun kuralı sabit kalacağı için olasılıklar açışından ekstra efor sarfetmen gerekmeyecektir. Kullanıcıdan alınan sayı üstünde yapılan işlemlerinin aynısını programın ürettiği sayı için de rahatlıkla kullanabilirsin. Umarım faydalı olur senin için. Bol şans!

    1. Merhaba Furkan, teşekkürler.
      Maalesef Excel Vba konusunda yardımcı olacak bilgiye sahip değilim.

    1. Selam Ayşe,

      C ve Java programlama dillerinin temelinde OOP(Object-Oriented Programming) yatar.
      Dolayısıyla algoritmayı anladıktan sonra geriye uygun syntax’a çevirmek zor olmayacaktır.

Bir cevap yazın

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