#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

Sayı Yerleştirme Oyunu

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.

Şunlar da ilginizi çekebilir

9 yorum

  • Gökalp
    23 Nisan 2014 at 20:55

    activtiy_main.xml yi bulamıyorum. Nerede?

    • MUSTAFA DEMİR
      25 Nisan 2014 at 13:00

      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.

    • MUSTAFA DEMİR
      2 Mayıs 2014 at 15:51

      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!.

  • rasim
    22 Aralık 2014 at 12:40

    forla da sorun var msg.show() dada çarpı işareti veriyor

    • MUSTAFA DEMİR
      8 Ocak 2015 at 19:39

      Hatalı kısmın üzerine gelip F2 ye basarak problemin detaylarını öğrenebilir misiniz?

  • Yusuf Çimen
    15 Mart 2016 at 12:04

    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 &lt 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

    • mustafa_demir
      15 Mart 2016 at 21:37

      1. &lt < (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();

  • Yusuf Çimen
    16 Mart 2016 at 10:38

    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

rasim için bir cevap yazın Cevabı iptal et