Minesweeper-App stürzt beim Start ab

TDS95

TDS95

Neues Mitglied
5
Hallo,

ich versuche zurzeit ein kleines Minesweeper-Spiel zu programmieren.
Doch wenn ich dann versuche die App zu starten stürzt sie direkt mit der Meldung "Leider wurde Minesweeper beendet." ab.

Könnte sich vielleicht mal jemand meinen Source Code angucken und mir sagen was ich falsch gemacht habe?

Mein Source Code:
MinesweeperActivity.java
Code:
package com.tds.minesweeper;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MinesweeperActivity extends Activity {
    /** Called when the activity is first created. */
    // @Override
    private boolean bomb[];
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //single onClickListener
        final Button button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[1]) {
                    lost();
                } else {
                    button1.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });
        
        final Button button2 = (Button) findViewById(R.id.button2);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[2]) {
                    lost();
                } else {
                    button2.setBackgroundColor(Color.RED);
                    button2.setText("X");
                }
            }
        });
        
        final Button button3 = (Button) findViewById(R.id.button3);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[3]) {
                    lost();
                } else {
                    button3.setBackgroundColor(Color.RED);
                    button3.setText("X");
                }
            }
        });
        
        final Button button4 = (Button) findViewById(R.id.button4);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[4]) {
                    lost();
                } else {
                    button4.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });
        
        final Button button5 = (Button) findViewById(R.id.button5);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[5]) {
                    lost();
                } else {
                    button5.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });
        
        final Button button6 = (Button) findViewById(R.id.button6);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[6]) {
                    lost();
                } else {
                    button6.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });
        
        final Button button7 = (Button) findViewById(R.id.button7);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[7]) {
                    lost();
                } else {
                    button7.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });
        
        final Button button8 = (Button) findViewById(R.id.button8);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[8]) {
                    lost();
                } else {
                    button8.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });
        
        final Button button9 = (Button) findViewById(R.id.button9);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[9]){
                    lost();
                } else 
                {
                    button9.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });
        
        bomb();
    };
    
    /*public void onStart(Bundle savedInstanceState) {
        super.onStart();
        bomb();
    }*/
    
    public void bomb() {
        int count=0;
        for (int i = 1; i <= 9; i++) {
            if (count<3 && Math.random()>0.5)
            {bomb[i]=true;} else {bomb[i]=false;}
        }
        // for-Schleife Ende
        
    }
    
    private void lost() {

         AlertDialog.Builder helpBuilder = new AlertDialog.Builder(this);
         helpBuilder.setTitle("Verloren!");
         helpBuilder.setMessage("Du hast verloren.");
         helpBuilder.setPositiveButton("Ok",
           new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
             // Do nothing but close the dialog
            }
           });

         // Remember, create doesn't show the dialog
         AlertDialog helpDialog = helpBuilder.create();
         helpDialog.show();
        }
}
main.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >







    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1.05" >



        <Button
            android:id="@+id/button5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="." />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/button5"
            android:layout_alignLeft="@+id/button5"
            android:text="." />



        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/button2"
            android:layout_toLeftOf="@+id/button2"
            android:text="." />



        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/button2"
            android:layout_alignBottom="@+id/button2"
            android:layout_toRightOf="@+id/button5"
            android:text="." />


        <Button
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/button5"
            android:layout_alignBottom="@+id/button5"
            android:layout_toLeftOf="@+id/button5"
            android:text="." />



        <Button
            android:id="@+id/button6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/button2"
            android:layout_toRightOf="@+id/button5"
            android:text="." />



        <Button
            android:id="@+id/button7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button4"
            android:layout_below="@+id/button5"
            android:text="." />



        <Button
            android:id="@+id/button8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button5"
            android:layout_below="@+id/button5"
            android:text="." />


        <Button
            android:id="@+id/button9"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button6"
            android:layout_below="@+id/button6"
            android:text="." />

    </RelativeLayout>

</LinearLayout>
Vielen Dank im Vorraus
 
Eclipse gibt dir auch fehlermeldungen :)

Die wären gut.


LG
 
In der MinesweeperActivity.java zeigt mir Eclipse überhaupt keine Fehler an.
In der main.xml sagt Eclipse nur das ich @string/ statt einem festen String verwenden soll.

Lg
 
Ist die Activity im Manifest eingetragen?

Ansonsten sollte dir Logcat schon eine Fehlermeldung zeigen oder lass die App mal im Debugger step-by-step laufen.
 
Dann mach das auch mal und ich würde deine Buttons nicht in der onCreate drin behalten.

Mach deine Buttons zu einer Methode.

Z.B dein erster:

Code:
private void ButtonListener() {
        Button button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if (bomb[1]) {
                    lost();
                } else {
                    button1.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });

}

und dann einfach in den onCreate bereich ButtonListener();
usw....



LG
 
Zuletzt bearbeitet:
Mal ne Frage warum setzt du die ClickListener alle für den button1? Copy&Paste?

Ändere das mal und schau obs an dem liegt. Evtl. hauts ihn da bei der Initialisierung durcheinander.
Muss aber sagen, dass ich noch nie ne Android App gemacht hab, also keine Ahnung ;)

Ps: Du startest zweimal bomb(). Relativ sinnlos, mh?
 
Zuletzt bearbeitet:
steerben schrieb:
Mal ne Frage warum setzt du die ClickListener alle für den button1? Copy&Paste?


Stimmt ist mir eben auch nicht aufgefallen :D Das sollte er aufjedefall ändern.



LG
 
Ist die Activity im Manifest eingetragen?

Ansonsten sollte dir Logcat schon eine Fehlermeldung zeigen oder lass die App mal im Debugger step-by-step laufen.
Activity ist im Manifest eingetragen.
Logcat:
06-26 23:08:18.539: D/AndroidRuntime(31594): Shutting down VM
06-26 23:08:18.539: W/dalvikvm(31594): threadid=1: thread exiting with uncaught exception (group=0x40a221f8)
06-26 23:08:18.579: E/AndroidRuntime(31594): FATAL EXCEPTION: main
06-26 23:08:18.579: E/AndroidRuntime(31594): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tds.minesweeper/com.tds.minesweeper.MinesweeperActivity}: java.lang.NullPointerException
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.app.ActivityThread.access$600(ActivityThread.java:132)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.os.Handler.dispatchMessage(Handler.java:99)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.os.Looper.loop(Looper.java:137)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.app.ActivityThread.main(ActivityThread.java:4575)
06-26 23:08:18.579: E/AndroidRuntime(31594): at java.lang.reflect.Method.invokeNative(Native Method)
06-26 23:08:18.579: E/AndroidRuntime(31594): at java.lang.reflect.Method.invoke(Method.java:511)
06-26 23:08:18.579: E/AndroidRuntime(31594): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
06-26 23:08:18.579: E/AndroidRuntime(31594): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
06-26 23:08:18.579: E/AndroidRuntime(31594): at dalvik.system.NativeStart.main(Native Method)
06-26 23:08:18.579: E/AndroidRuntime(31594): Caused by: java.lang.NullPointerException
06-26 23:08:18.579: E/AndroidRuntime(31594): at com.tds.minesweeper.MinesweeperActivity.bomb(MinesweeperActivity.java:141)
06-26 23:08:18.579: E/AndroidRuntime(31594): at com.tds.minesweeper.MinesweeperActivity.onCreate(MinesweeperActivity.java:129)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.app.Activity.performCreate(Activity.java:4465)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-26 23:08:18.579: E/AndroidRuntime(31594): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033)
06-26 23:08:18.579: E/AndroidRuntime(31594): ... 11 more
06-26 23:08:26.739: I/Process(31594): Sending signal. PID: 31594 SIG: 9
Dann mach das auch mal und ich würde deine Buttons nicht in der onCreate drin behalten.

Mach deine Buttons zu einer Methode.
Werde ich machen.

Mal ne Frage warum setzt du die ClickListener alle für den button1? Copy&Paste?
Jetzt wo du's sagt.
Werde ich auch ändern.

Lg
 
Zu spät, die Logcat ist schon da ;)

Der ursprüngliche Beitrag von 23:17 Uhr wurde um 23:19 Uhr ergänzt:

Irgendwas hat er mit deiner Bombe. Warum fängst du mit i bei 1 an und nicht bei 0?
 
;)

@TDS95 Berichte dann bitte ob alles geht oder nicht, wenn du alles geändert hast :)


LG
 
Initialisierst du den bomb-Array eigentlich mal? Seh nur, dass du drauf zugreifst und reinschreibst und wie neandertaler schon sagt fängst du nicht bei 0 an, sondern bei 1. Das ist aber in dem Fall eh egal, weil du nirgendwo die Größe des Arrays festlegst, oder?
Und da zeigt Eclipse keinen Fehler?

edit:
public void bomb() {
bomb = new boolean[9];
int count=0;
for (int i = 0; i <= 8; i++) {
if (count<3 && Math.random()>0.5)
{bomb=true;} else {bomb=false;}
}
// for-Schleife Ende

}


zusätzlich änderst du nie deinen count?
den musst du schon inkrementieren, wenn du höchstens 3 bomben haben willst.
also nochmal:

public void bomb() {
bomb = new boolean[9];
int count=0;
for (int i = 0; i <= 8; i++) {
if (count<3 && Math.random()>0.5)
{bomb=true; count++;} else {bomb=false;}
}
// for-Schleife Ende

}


außerdem würd ich nicht
boolean bomb[] sondern
boolean[] bomb schreiben

edit2: im logcat siehst du ne NullPointerException. Was sagt uns das? Du greifst auf ein Objekt zu, welches nicht initialisiert wurde.

edit3: @shelly22: ob die buttons jetzt in ne extra methode reingeschoben werden oder nicht spielt wohl keine bedeutung. klar, wenn man ein großes programm hat und mehrere teile in der oncreate methode hat. aber hier einfach den kompletten onCreate teil nehmen und in ne andere methode auslagern macht imho keinen sinn.
 
Zuletzt bearbeitet:
steerben schrieb:
Initialisierst du den bomb-Array eigentlich mal? Seh nur, dass du drauf zugreifst und reinschreibst und wie neandertaler schon sagt fängst du nicht bei 0 an, sondern bei 1. Das ist aber in dem Fall eh egal, weil du nirgendwo die Größe des Arrays festlegst, oder?
Und da zeigt Eclipse keinen Fehler?
Den bomb-Array initialisiere ich vor der onCreate()-Methode:
Code:
public class MinesweeperActivity extends Activity {
    /** Called when the activity is first created. */
    // @Override
    [COLOR=Red]private boolean bomb[];[/COLOR]
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
Und ich sehe gerade das es eigentlich so aussehen müsste, oder?
Code:
private bomb = new boolean[];
steerben schrieb:
zusätzlich änderst du nie deinen count?
den musst du schon inkrementieren, wenn du höchstens 3 bomben haben willst.
Da hast du recht, ist mir gar nicht aufgefallen.

steerben schrieb:
außerdem würd ich nicht
boolean bomb[] sondern
boolean[] bomb schreiben
Macht doch keinen Unterschied oder?

steerben schrieb:
im logcat siehst du ne NullPointerException. Was sagt uns das? Du greifst auf ein Objekt zu, welches nicht initialisiert wurde.
Ich werde aus dem Logcat nicht ganz schlau,
an den rot markierten Stellen sehe ich halt das es eine FATAL EXCEPTION und eine Null Pointer Exception gibt, ich kann da aber nicht raus lesen wo genau im Code, müsste da nicht eigentlich eine Zeilenangabe stehen?
Code:
06-26 23:08:18.539: D/AndroidRuntime(31594): Shutting down VM
[COLOR=Red]06-26 23:08:18.539: W/dalvikvm(31594): threadid=1: thread exiting with uncaught exception (group=0x40a221f8)[/COLOR]
[COLOR=Red]06-26 23:08:18.579: E/AndroidRuntime(31594): FATAL EXCEPTION: main[/COLOR]
06-26 23:08:18.579: E/AndroidRuntime(31594): [COLOR=Red]java.lang.RuntimeException:  Unable to start activity  ComponentInfo{com.tds.minesweeper/com.tds.minesweeper.MinesweeperActivity}:  java.lang.NullPointerException[/COLOR]
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.app.ActivityThread.performLaunchActivity(A  ctivityThread.java:2079)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.app.ActivityThread.handleLaunchActivity(Ac  tivityThread.java:2104)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.app.ActivityThread.access$600(ActivityThre  ad.java:132)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.app.ActivityThread$H.handleMessage(Activit  yThread.java:1157)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.os.Handler.dispatchMessage(Handler.java:99  )
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.os.Looper.loop(Looper.java:137)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.app.ActivityThread.main(ActivityThread.jav  a:4575)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at java.lang.reflect.Method.invokeNative(Native Method)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at java.lang.reflect.Method.invoke(Method.java:511)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at  com.android.internal.os.ZygoteInit$MethodAndArgsCa   ller.run(ZygoteInit.java:789)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at com.android.internal.os.ZygoteInit.main(ZygoteInit  .java:556)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at dalvik.system.NativeStart.main(Native Method)
[COLOR=Red]06-26 23:08:18.579: E/AndroidRuntime(31594): Caused by: java.lang.NullPointerException[/COLOR]
06-26 23:08:18.579: E/AndroidRuntime(31594):     at com.tds.minesweeper.MinesweeperActivity.bomb(Mines  weeperActivity.java:141)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at  com.tds.minesweeper.MinesweeperActivity.onCreate(M   inesweeperActivity.java:129)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.app.Activity.performCreate(Activity.java:4  465)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at  android.app.Instrumentation.callActivityOnCreate(I   nstrumentation.java:1049)
06-26 23:08:18.579: E/AndroidRuntime(31594):     at android.app.ActivityThread.performLaunchActivity(A  ctivityThread.java:2033)
06-26 23:08:18.579: E/AndroidRuntime(31594):     ... 11 more
06-26 23:08:26.739: I/Process(31594): Sending signal. PID: 31594 SIG: 9
 
Du definierst nur deinen Array, initialisiert ihn aber nicht. Das heißt deine Referenz zeigt auf Null. Ein Array muss immer eine feste, fixe Größe haben. Deswegen musst du ihm bei der Initialisierung auch in den eckigen Klammern eine Größe mitgeben.

Deswegen würde ich das ganze auch
boolean[] bomb
schreiben um gleich zu sehen, dass es sich hierbei um ein Array vom Typ boolean handelt. So ist das ganze meiner Meinung nach übersichtlicher und leichter nachvollziehbar auch wenn man es anders schreiben kann.

Du kannst deinen Array natürlich auch gleich in der Zeile initialisieren wo du ihn definierst, aber wie gesagt, du musst die Größe mit angeben.

boolean[] bomb = new boolean[9];

Gesendet von meinem GT-I9100 mit Tapatalk 2
 
Wobei das dann boolean[8] wäre und du von 0 anfängst und bei 8 aufhörst.
 
Nein. Ein Array der Größe 9 hat die Indices 0 bis 8.

Gesendet von meinem GT-I9100 mit Tapatalk 2
 
Achso, ja upps, stimmt, verwechsel das immer. Aber du musst bei deinen Schleifen auf jeden Fall bei 0 anfangen und nicht bei 1.
 
Mit meinem Code dürfte es normalerweise funktionieren.

Gesendet von meinem GT-I9100 mit Tapatalk 2
 
Nachdem ich jetzt die Änderungen vorgenommen habe startet das Spiel und scheint auch zu funktionieren. Mein Code sieht jetzt so aus (Änderungen rot markiert):
Code:
package com.tds.minesweeper;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MinesweeperActivity extends Activity {
    /** Called when the activity is first created. */
    // @Override
    [COLOR=Red]private boolean bomb[] = new boolean[9];[/COLOR]
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //single onClickListener
        final Button button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[0][/COLOR]) {
                    lost();
                } else {
                    button1.setBackgroundColor(Color.RED);
                    button1.setText("X");
                }
            }
        });
        
        final Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[1][/COLOR]) {
                    lost();
                } else {
                    button2.setBackgroundColor(Color.RED);
                    button2.setText("X");
                }
            }
        });
        
        final Button button3 = (Button) findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[2][/COLOR]) {
                    lost();
                } else {
                    button3.setBackgroundColor(Color.RED);
                    button3.setText("X");
                }
            }
        });
        
        final Button button4 = (Button) findViewById(R.id.button4);
        button4.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[3][/COLOR]) {
                    lost();
                } else {
                    button4.setBackgroundColor(Color.RED);
                    button4.setText("X");
                }
            }
        });
        
        final Button button5 = (Button) findViewById(R.id.button5);
        button5.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[4][/COLOR]) {
                    lost();
                } else {
                    button5.setBackgroundColor(Color.RED);
                    button5.setText("X");
                }
            }
        });
        
        final Button button6 = (Button) findViewById(R.id.button6);
        button6.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[5][/COLOR]) {
                    lost();
                } else {
                    button6.setBackgroundColor(Color.RED);
                    button6.setText("X");
                }
            }
        });
        
        final Button button7 = (Button) findViewById(R.id.button7);
        button7.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[6][/COLOR]) {
                    lost();
                } else {
                    button7.setBackgroundColor(Color.RED);
                    button7.setText("X");
                }
            }
        });
        
        final Button button8 = (Button) findViewById(R.id.button8);
        button8.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[7][/COLOR]) {
                    lost();
                } else {
                    button8.setBackgroundColor(Color.RED);
                    button8.setText("X");
                }
            }
        });
        
        final Button button9 = (Button) findViewById(R.id.button9);
        button9.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                if ([COLOR=Red]bomb[8][/COLOR]){
                    lost();
                } else 
                {
                    button9.setBackgroundColor(Color.RED);
                    button9.setText("X");
                }
            }
        });
        
        bomb();
    };
    
    public void bomb() {
        int count=0;
        for (int i = 0; i <= 9; i++) {
            if (count<3 && Math.random()>0.5)
            {bomb[i]=true;[COLOR=Red] i++;[/COLOR]} else {bomb[i]=false;}
        }
        // for-Schleife Ende
        
    }
    
    private void lost() {

         AlertDialog.Builder helpBuilder = new AlertDialog.Builder(this);
         helpBuilder.setTitle("Verloren!");
         helpBuilder.setMessage("Du hast verloren.");
         helpBuilder.setPositiveButton("Ok",
           new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
             // Do nothing but close the dialog
            }
           });

         // Remember, create doesn't show the dialog
         AlertDialog helpDialog = helpBuilder.create();
         helpDialog.show();
        }
}
Meine Änderungen:
- Indices korrigiert
- Array korrekt instanziiert
- Coppy & Paste Fehler korrigiert

Damit wäre das Problem gelöst, jetzt möchte ich allerdings anzeigen wie viele Bomben sich um den Button herum befinden, es soll also angezeigt werden wie viele Button drum herum "true" also Bomben sind.

Ich könnte jetzt für jeden Button eine einzelne Abfragemethode erstellen wie z.B.:
Code:
Button1:

if(button[1]) {
      b++;
} else if(button[3]) {
      b++;
} else if(button[4]) {
      b++
}
Heißt, wenn Button1 gedrückt wird, wird überprüft ob Button2, Button4 und Button5 "true" sind.
Allerdings wäre das zimelich aufwendig und wenn ich das Feld vergrößere auf sagen wir mal 10x10 Buttons wären das 100 Methoden die ich alle einzeln schreiben müsste. Hat vielleicht jemand eine Idee wie ich das einfacher hinkriegen könnte?

Lg und vielen Dank im Vorraus
 
Ich denke du solltest deinen Ansatz mit den Buttons überdenken selbst bei einem relativ kleinen Spielfeld mit 10x10 Feldern kommst du auf 100 Buttons. Du kannst die Buttons auf einem Canvas zeichnen statt die GUI Buttons zu nehmen, der 'Button' der gedrückt werden soll ermittelst du über einen touch event. Zum speichern der Bombenposition nimmst du ein boolean Array. Das durchläufst du jedesmal wenn ein Feld angeklickt wird und zählst die benachbarten Bomben.
 
Code:
    public void bomb() {
        int count=0;
        for (int i = 0; i <= 9; i++) {
            if (count<3 && Math.random()>0.5)
            {bomb[i]=true; i++;} else {bomb[i]=false;}
        }
        // for-Schleife Ende
        
    }

warum i++; in den eckigen klammern und nicht count++; wie ich es geschrieben hab? Überleg mal was du da machst.

funktionieren tut das ganze insofern (also überall steht dann entweder true oder false drin), da die einzelnen boolean werte im array nach der initalisierung ohnehin alle standardmäßig auf true oder false (weiß ich jetzt grad nicht) gesetzt werden.


generell ist dein ansatz das spiel zu erstellen für den anfang schon ok, aber du siehst halt, dass du schnell probleme hast, wenn du nicht gewisse sachen so machst wie sie strider vorschlägt.
alle sachen von hand selbst setzen ist halt sehr umständlich.
 

Ähnliche Themen

S
Antworten
8
Aufrufe
481
swa00
swa00
Laser5001
  • Laser5001
Antworten
2
Aufrufe
869
Laser5001
Laser5001
R
  • Robby1950
2
Antworten
23
Aufrufe
953
Robby1950
R
Zurück
Oben Unten