#14 – Sayı Yerleştirme Oyunu
Merhaba,
bu yazımızda Sayı Yerleştirme Oyunu’nu yapacağız
Oyunun Senaryosu
Oyundaki amaç 1’den 15’e kadar olan sayıları ardışık şekilde sıralamaktır. Oyuncu boş olan bölümün sağında solunda altında veya üstündeki bir sayıya dokunduğunda dokunulan sayı boş kısma geçer, oyun bu şekilde bitene kadar devam eder. Oyuncu sayıları ardışık dizdiğinde oyunun bittiğini bildiren bir Toast mesajıyla karşılaşır.
Oyuna Başlamadan Önce Bilinmesinde Yarar Olan Bilgiler
Sayı yerleştirme oyununun yapımına başlamadan önce GridView ile ilgili bilgilerinizi tazeleyebilirsiniz çünkü bu oyundaki yükümüzü o sırtlanacak : Android Layouts: Grid View

Oyundan bir görüntü
[wpdm_file id=1]
Oyun yapımına başlayalım.
Gridview Arayüzümüz (activity_main.xml)
Arayüzümüz sayılarımızın yerleşeceği bir adet GridView içeriyor.
<GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:columnWidth="30dp" android:numColumns="4" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:stretchMode="columnWidth" android:background="#ddd" android:gravity="center" />
Sayılar ve Sayıların Gridview’e İliştirilmesi
1’den 15’e kadar olan sayıları String tipindeki bir array içerisinde tutuyoruz, sayıları ekrana yansıtmak için GridView kullanacağız.
GridView grid; String[] numbers = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "" }; int bosPos = 15, rasgele;
Sayıları GridView‘e iliştirmek için de ArrayAdapter kullanmamız gerekiyor.
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, numbers); grid.setAdapter(adapter);
Sayıların Grid’e Rasgele Yerleşmesi
Sayıların rasgele yerleşmesi için Random sınıfından yararlanıyoruz. Aşağıdaki uygulamada Random sınıfından 15 defa rasgele sayı üretmesini istiyoruz. Üretilen rasgele sayıyı; numbers dizisindeki elemanların yerlerini değiştirmede kullanıyoruz.
rnd = new Random(); for (int i = 0; i < 15; i++) { rasgele = rnd.nextInt(16); gecici = numbers[rasgele]; numbers[rasgele] = numbers[i]; numbers[i] = gecici; if (numbers[i] == "") bosPos = i; }
Tıklandığında Sayının Yer Değiştirmesi
GridView‘in elemanlarına tıklandığında, tıklanan sayının boş olan kısma gitmesini sağlıyoruz ve oyun bitti mi diye kontrol ediyoruz.
Aşağıdaki if bloğuna dikkat edilmeli, eğer o olmasaydı uçan sayılarla karşılaşırdık, oyun hemencecik biterdi, deneyin derim :).
grid.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View v, int pos, long id) { // hızlı bitirmek için bu if bloğunu kaldırın :-), bir deneyin derim. if ((bosPos == (pos + 1)) || (bosPos == (pos - 1)) || (bosPos == (pos - 4)) || (bosPos == (pos + 4))) { numbers[bosPos] = (String) ((TextView) v).getText(); numbers[pos] = ""; bosPos = pos; ((ArrayAdapter) grid.getAdapter()) .notifyDataSetChanged(); oyunBittiMi(); } } private void oyunBittiMi() { for (int i = 0; i < 15; i++) { if (!Integer.toString(i + 1).equals( (String) grid.getItemAtPosition(i).toString())) return; } Toast msg = Toast.makeText(getApplicationContext(), "TEBRİKLER OYUN BİTTİ!!!!", Toast.LENGTH_SHORT); msg.show(); } });
Proje Dosyalarının Tam İçeriği
activity_main.xml :
<GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:columnWidth="30dp" android:numColumns="4" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:stretchMode="columnWidth" android:background="#ddd" android:gravity="center" />
MainActivity.java :
package com.example.sayiyerlestirmece; import java.util.Random; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.GridView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { GridView grid; String[] numbers = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "" }; int bosPos = 15, rasgele; String gecici; Random rnd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); grid = (GridView) findViewById(R.id.gridview); // 15 sayıyının yerlerini rasgele degistir. rnd = new Random(); for (int i = 0; i < 15; i++) { rasgele = rnd.nextInt(16); gecici = numbers[rasgele]; numbers[rasgele] = numbers[i]; numbers[i] = gecici; if (numbers[i] == "") bosPos = i; } ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, numbers); grid.setAdapter(adapter); grid.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View v, int pos, long id) { // hızlı bitirmek için bu if bloğunu kaldırın :-), bir deneyin derim. if ((bosPos == (pos + 1)) || (bosPos == (pos - 1)) || (bosPos == (pos - 4)) || (bosPos == (pos + 4))) { numbers[bosPos] = (String) ((TextView) v).getText(); numbers[pos] = ""; bosPos = pos; ((ArrayAdapter) grid.getAdapter()) .notifyDataSetChanged(); oyunBittiMi(); } } private void oyunBittiMi() { for (int i = 0; i < 15; i++) { if (!Integer.toString(i + 1).equals( (String) grid.getItemAtPosition(i).toString())) return; } Toast msg = Toast.makeText(getApplicationContext(), "TEBRİKLER OYUN BİTTİ!!!!", Toast.LENGTH_SHORT); msg.show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
Kaynak Kod
Yeni bir oyunda buluşmak dileğiyle, kalın sağlıcakla.
activtiy_main.xml yi bulamıyorum. Nerede?
merhaba Gökalp bey,
activity_main.xml dosyası içeriği hem makale içinde verilmiş hem de Kaynak kodları içinde verilmiştir.
İyi Çalışmalar.
AndroidEvreni Soru&Cevap forumu açılmıştır. Artık foruma kayıt olarak sorularınızı sormaya, sorularınızın forum kullanıcıları tarafından cevaplanmasına ve sizin de sorulara cevap verebilmenize olanak sağlıyoruz!. Sizi AndroidEvreni Soru&Cevap Forumuna Davet Ediyoruz!.
forla da sorun var msg.show() dada çarpı işareti veriyor
Hatalı kısmın üzerine gelip F2 ye basarak problemin detaylarını öğrenebilir misiniz?
hocam anlamadığım bi kaçta ne husus var şöyleki ;
1 for (int i = 0; i < 15; i++) bu nasıl bir döngü burda < ve sonraki 15 nedir.
2 if ((bosPos == (pos + 1)) || (bosPos == (pos – 1))
|| (bosPos == (pos – 4)) || (bosPos == (pos + 4))) burdaki if yapısında pos nedir nerden cıktı böyle bi tanım yapmadık.
3 numbers[bosPos] = (String) ((TextView) v).getText(); burda bi TextView i nerde tanımladık ne layoutumuzda var nede javaya gösterdik ben bu husus ları anlamadım
1. < < (küçüktür) simgesinin yerine çıkmıştır. Kaynak kodu indirince düzgün olduğunu fark edeceksin. 2. pos grid view içerisinde kaçıncı sıradaki elemana dokunulduğunu tutar. Aşağıdaki tanımlamaya dikkat et. public void onItemClick(AdapterView arg0, View v, int pos,…
3. GridView içerisine eklenen numaralara dokunulduğunda hangi numaraya dokunulmuş ise 2. cevapdaki v o numarayı gösterir. İçerisinde ne yazıldığını algılamak için v nin bir textview olduğunu ve bunun hangi text’i içerdiğini alıyorsun.
numbers[bosPos] = (String) ((TextView) v).getText();
Açıklamalar için çok teşekkür ederim bi soru sorabilirmiyim ?
şöyleki GridView nimizdeki string dizi den aldımız elemanları yerleştirirken yerleştirdiğimiz itemlar ın yada alanların tam ortasında yer alması için nasıl bir yol izlemeyiz