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.
- Kullanıcıdan basamak sayısı uzunluğunu seçmesini ister.
- Kod rakamları birbirinden farklı olan, kullanıcının tahmin etmesi istenen sayıyı üretir.
- Kullanıcıdan tahmin girişlerini alır.
- Kullanıcı belirlediği basamak sayısından farklı bir tahmin girerse yeniden tahmin alır.
- Bilgisayar alınan tahminle kendi sayısını karşılaştırır.
- Karşılaştırma sonucuna göre uygun cevap (+1, +2-2, 0 vs. gibi) verilir.
- 3., 4., 5. ve 6. maddeyi kullanıcı doğru sayıyı girene kadar tekrarlar.
- 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
bunu PYTHON a uyarlayabilir miyiz?
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.
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.
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!
Merhabalar emeğinize elinize sağlık. Bunu Excel Vba da nasıl oluşturabiliriz?
Merhaba Furkan, teşekkürler.
Maalesef Excel Vba konusunda yardımcı olacak bilgiye sahip değilim.
Bu oyunun kodunu c programlama dilinde de yazabilir misiniz?
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.