Java'da ArrayIndexOutOfBoundsException Hatası

mustafaf94

Hectopat
Katılım
18 Mart 2014
Mesajlar
238
Daha fazla  
Cinsiyet
Erkek
Merhabalar, Ben Java'da 2048 oyunu yapmaya çalışıyorum ve başlıkta belirttiğim şekilde bir hata alıyorum.
Bu hatanın sebebi nedir ve ya nasıl çözülür açıklayabilecek olan var mı acaba?
Şimdiden teşekkürler. İyi akşamlar.
 
Bir sorunum daha var:) kodun bir kısmı istediğim gibi çalışmıyor ve nasıl düzeltirim bilemedim. 4 girdiğimde her şeyin sola kayması gerekirken en alt satırda bir sıkıntı oluyor çünkü for döngüsünde en alt satırı bir kere hareket ettirdikten sonra geçiyor. Benim o satıra bir kere daha dönmem laızm for döngüsünde fakat nasıl yapacağımı bilmiyorum. Bahsettiğim kod şu şekilde.


public static void main(String[] args) {
int[][] dizi={
{ 0 , 0 , 2 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 2 , 0 , 0 },
{ 4 , 0 , 0 , 0 , 0 , 4 },
{ 0 , 0 , 0 , 2 , 0 , 0 },
{ 2 , 0 , 0 , 0 , 2 , 0 },
{ 0 , 0 , 2 , 4 , 0 , 2 },
};
for(int i=0;i<dizi.length;i++) {
for(int j=0;j<dizi.length;j++)
System.out.print(" "+dizi[j]);
System.out.println();
}dongu(dizi);
}
public static void dongu (int x[][]){
Scanner input=new Scanner(System.in);
while(true){
System.out.println("2:DOWN - 4:LEFT - 6:RİGHT - 8:UP");
System.out.println("Please choose a direction and enter direction number: ");
int a=input.nextInt();
switch(a){
case 2:
kaydır2(x);
break;
case 4:
kaydır4(x);
break;
case 6:
kaydır6(x);
break;
case 8:
kaydır8(x);
break;
default:
System.out.println("This is not direction number.Please enter 2,4,6 or 8 to specify the direction you choose.");
dongu(x);
}
for(int i=0;i<x.length;i++) {
for(int j=0;j<x.length;j++)
System.out.print(" "+x[j]);
System.out.println();
}
}
}
public static void kaydır2 (int x[][]) {
for(int m=x.length-1 ; 0<m ; m--){
for(int n=0 ; n<x[m].length; n++){
if(x[m][n]==0 && x[m-1][n]!=0){
x[m][n]=x[m-1][n];
x[m-1][n]=0;
}
else
continue;
}
}
for(int m=0 ; m<x.length-1; m++){
for(int n=0 ; n<x[m].length; n++){
if( x[m+1][n]==0 && x[m][n]!=0){
x[m+1][n]=x[m][n];
x[m][n]=0;
}
else
continue;
}
}
}
public static void kaydır4 (int x[][]) {
for(int j=0 ; j<x.length ; j++){
for(int k=0 ; k<x[j].length-1 ; k++){
if(x[j][k]==0 && x[j][k+1]!=0){
x[j][k]=x[j][k+1];
x[j][k+1]=0;
}
else
continue;
}
}
for(int j=0 ; j<x.length ; j++){
for(int k=x[j].length-1; 0<k ;k--){
if(x[j][k-1]==0 && x[j][k]!=0){
x[j][k-1]=x[j][k];
x[j][k]=0;
}
else
continue;
}
}
}
public static void kaydır6(int x[][]){
for(int j=0 ; j<x.length ; j++){
for(int k=x[j].length-1; 0<k ;k--){
if(x[j][k]==0 && x[j][k-1]!=0){
x[j][k]=x[j][k-1];
x[j][k-1]=0;
}
else
continue;
}
}
for(int j=0 ; j<x.length; j++){
for(int k=0 ; k<x[j].length-1 ; k++){
if(x[j][k+1]==0 && x[j][k]!=0){
x[j][k+1]=x[j][k];
x[j][k]=0;
}
else
continue;
}
}
}
public static void kaydır8(int x[][]){
for(int j=x.length-1 ; 0<j ; j--){
for(int k=0 ; k<x[j].length ; k++){
if(x[j-1][k]==0 && x[j][k]!=0){
x[j-1][k]=x[j][k];
x[j][k]=0;
}
else
continue;
}
}
for(int j=0 ; j<x.length-1 ; j++){
for(int k=0; k<x.length ;k++){
if(x[j][k]==0 && x[j+1][k]!=0){
x[j][k]=x[j+1][k];
x[j+1][k]=0;
}
else
continue;
}
}
}
 
Döngü parametrelerinde sıkıntı var. Uzunluk 4 olduğuna göre:

Kod:
int k=0 ; k<x[j].length-1 ; k++
k = 0,1,2,3 değerlerini kapsar.

Kod:
int k=x[j].length-1; 0<k ;k--
Oysa bu k=3,2,1 değerlerini kapsar. 0 değeri için işlem yapmaz.

Kod:
int k=x[j].length-1; 0<=k ;k--
Olmalı.
 
Array 6x6 'lık bir array ve sanırım ben iyi açıklayamadım. Kod gayet düzgün çalışıyor fakat 4 girdiğinizde en alt satırdaki 2yi kaydır2 methodunun ilk for döngüsünden dolayı bir kere kaydırıyor. 2. for döngüsünden dolayı da bir sefer kaydırıyor. fakat Aynı şeyi 4 için yapmıyor çünkü 2. for döngüsüne solunda 2 olduğı için kaydıramıyor . Benim bu döngüleri birden fazla kez çalıştırmam gerek sanırım. En azından bu bir çözüm olur diye düşünüyorum fakat nasıl yapacağım onu bilmiyorum. Gerçi şu anda aklıma gelen bir fikirle aynı methodu 2 defa çağırsam olur bence ama bu seferde farklı durumlarda 3 defa kaydırmam da gerekebilir.
Daha mantıklı bir yolu vardır belki diye buraya sordum.
Şimdiden Teşekkürler
 
The method read(byte[]) in the type InputStream is not applicable for the arguments (int)
Bu hatayı nasıl çözeceğime dair bir yardım edebilir misiniz lütfen?
 
Oyunu bitirdim sayılır. Sadece oyunu bitirme kısmı kaldı. Fakat kullanıcı yön 2-4-6-8 yerine harf girdiğinde hata verdirtmem lazım. Bunu da ascii sayesinde yaparım dedim ama değeri okumada böyle bir hata alıyorum.
Bir sorum daha var aslında. Oyunu bitirmenin mantığı nedir? Aklımda bir yol var ama hem biraz saçma geldi hem de yorucu gibi.
 
Oyunun bitip bitmediğinin kontrolünü hareket yapıldıktan hemen sonra yeni sayıyı rastgele panoya yerleştirirken yapacaksınız. Eğer boş kare kalmadıysa oyun bitmiş demektir.

Kod:
        private Random rnd = new Random();
        private Tuple<int, int> GetRandomEmptyTile()
        {
            var emptyIndices = (from cell in CellsIterator() where cell.IsEmpty() select new Tuple<int, int>(cell.X, cell.Y)).ToList();

            if (emptyIndices.Count == 0)
            {
                //Burada oyun bitmiş demektir.
                return null;
            }

            var next = rnd.Next(0, emptyIndices.Count - 1);
            return emptyIndices[next];
        }

Bu arada bitirmekten kastınız en yüksek skor yapmak ise bunun için videolara bakın. 4x4 için çok uzun sürüyor. 6x6 için çok çok uzun sürer.
Ben 2048'de 4096'ya ulaştım ama 32768'e ulaşanlar var.
 
Uyarı! Bu konu 11 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı