package com.mem;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Hier Programmcode einfügen
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        // zunächst unverändert lassen
        return true;
    }
}

LinearLayout1
layout_width ="match_parent"
layout_height="match_parent"
orientation="vertical"

LinearLayout2
layout_width ="wrap_content"
layout_height="wrap_content"
orientation="horizontal"

TableLayout1
layout_width ="match_parent"
layout_height="wrap_content" >

LinearLayout3
layout_width="match_parent"
layout_height="match_parent"
android:gravity="bottom|right"
android:orientation="horizontal"

<resources>
    <string name="app_name">Mem2</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">Memory2</string>
    <string name="tVAnzahlVersuche">Anzahl der Versuche:</string>
    <string name="tVAnzahl">0</string>
    <string name="bNeuesSpiel">Neues Spiel</string>
    <string name="bEnde">Ende</string>
</resources>

public class MainActivity extends Activity {
	private int Anzahl = 0;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button EndeButton = (Button) findViewById(R.id.bEnde);
		EndeButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});

		Button NeuesSpiel = (Button) findViewById(R.id.bNeuesSpiel);
		NeuesSpiel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				TextView tvAnzahl = (TextView) findViewById(R.id.tVAnzahl);
				Anzahl++;
				tvAnzahl.setText(Integer.toString(Anzahl));
			}
		});

	}

public class Karte extends Button implements OnClickListener{

private	Drawable backImage;
private	Drawable iconImage;
private Boolean  Bildseite;

	public Karte(Context view, String Bildname){
		super(view);
int resourceId =
getResources().getIdentifier("com.mem:drawable/"+Bildname,null,null);
		iconImage = getResources().getDrawable(resourceId);
		backImage = getResources().getDrawable(R.drawable.icon);
		this.setId(resourceId);
		this.setBackgroundDrawable(backImage);
		this.setOnClickListener((OnClickListener) this);
		Bildseite = false;
	}
	public boolean isAufgedeckt(){
		return Bildseite;}

	public void zeigeBildseite(){
		this.setBackgroundDrawable(iconImage);
		Bildseite = true;	}
	
	public void zeigeRückseite(){
	. . .	}

	public void umdrehen() {
	. . .}
	
	@Override
	public void onClick(View view) {
		umdrehen();
		MainActivity.inkrementAnzahl();
	}
}

TableLayout meinTablelayout = (TableLayout) findViewById(R.id.TableLayout1);

		Karte eineKarte;
		TableRow Zeile;
	
		Zeile = new TableRow(this);
		eineKarte = new Karte(this, "card01");
		Zeile.addView(eineKarte, 48, 48);
		eineKarte = new Karte(this, "card02");
		Zeile.addView(eineKarte, 48, 48);
		meinTablelayout.addView(Zeile);

		Zeile = new TableRow(this);
		eineKarte = new Karte(this, "card06");
		Zeile.addView(eineKarte, 48, 48);
		eineKarte = new Karte(this, "card07");
		Zeile.addView(eineKarte, 48, 48);
		meinTablelayout.addView(Zeile);

public static void inkrementAnzahl() {
		Anzahl++;
		tvAnzahl.setText(Integer.toString(Anzahl));
	}

public class MainActivity extends Activity {
	private final int Zeilenzahl = 6;  
	private final int Spaltenzahl = 5; //Zeilenzahl * Spaltenzahl muss gerade sein
	private final int Kartengröße = 48;
	private static MemorySpiel meinMemorySpiel;
	
	@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
meinMemorySpiel = new MemorySpiel(this, Zeilenzahl * Spaltenzahl);
ZeigeKarten();

		Button EndeButton = (Button) findViewById(R.id.bEnde);
		EndeButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
				System.exit(0); // wegen Garbage Collection
			}
		});

		Button NeuesSpiel = (Button) findViewById(R.id.bNeuesSpiel);
		NeuesSpiel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				meinMemorySpiel.neuesSpiel();
			}
		});

	}
	
private void zeigeKarten() {
TableLayout meinTableLayout=(TableLayout) findViewById(R.id.TableLayout1);
		int KartenNr = 0;
		for (int ZeilenNr = 0; ZeilenNr < Zeilenzahl; ZeilenNr++) {
			TableRow Zeile = new TableRow(this);
			for (int SpaltenNr = 0; SpaltenNr < Spaltenzahl; SpaltenNr++) {
				Karte eineKarte = meinMemorySpiel.getKarte(KartenNr);
				Zeile.addView(eineKarte, Kartengröße, Kartengröße);
				KartenNr++;
			}
			meinTableLayout.addView(Zeile);
		}
	}
	. . .
}

public class MemorySpiel {
	private final static int Verzögerung = 1500; // Millisekunden
	private static ArrayList<Karte> meineKarten = new ArrayList<Karte>();
	private static Karte ersteKarte; 
	private static Karte zweiteKarte; 
	private static int AnzahlVersuche;
	private static TextView tvAnzahl;
	
	public MemorySpiel(MainActivity memoryActivity, int Kartenzahl) {
		tvAnzahl = (TextView) memoryActivity.findViewById(R.id.tVAnzahl);
		String  Kartenname;
		for (int i = 1; i <= 2; i++) {
			Integer KartenNr = 1;
			for (int j = 1; j <= Kartenzahl / 2; j++) {
				if (KartenNr < 10)					
					Kartenname = "card0" + KartenNr.toString();	
				else
					Kartenname = "card" + KartenNr.toString();	
				Karte k = new Karte(memoryActivity, Kartenname);	
				meineKarten.add(k);
				KartenNr++;
			}
		}
		neuesSpiel();		
	}

	public void neuesSpiel(){
		ersteKarte = null;
		zweiteKarte = null;
		AnzahlVersuche = 0;
		tvAnzahl.setText(Integer.toString(AnzahlVersuche));
		Collections.shuffle(meineKarten); // in java.util
		for (int i = 0; i < meineKarten.size(); i++)  {
			meineKarten.get(i).zeigeRückseite();
			meineKarten.get(i).setVisibility(View.VISIBLE);			
		}
	}

	public Karte getKarte(int KartenNr) {
		return meineKarten.get(KartenNr);
	}

public static boolean zweiAufgedeckt() {
		return ersteKarte != null && zweiteKarte != null;
	}

	private static void abräumen() {
		ersteKarte.setVisibility(View.INVISIBLE);
		zweiteKarte.setVisibility(View.INVISIBLE);
	}

	private static void zudecken() {
		ersteKarte.zeigeRückseite();
		zweiteKarte.zeigeRückseite();
	}

public static void prüfeZweiKarten(Karte eineKarte) {
		Handler handler = new Handler();
		if (ersteKarte == null)
			ersteKarte = eineKarte;
		else {
			zweiteKarte = eineKarte;
			handler.postDelayed(new Runnable() {
				public void run() {
					if (ersteKarte.getId() == zweiteKarte.getId())
						abräumen();
					else
						zudecken();
					ersteKarte = null;
					zweiteKarte = null;
					AnzahlVersuche++;
					tvAnzahl.setText(Integer.toString(AnzahlVersuche));
				}
			}, Verzögerung);
		}
	}	

final static Runnable myRunnable = new Runnable() {

		public void run() {
			if (ersteKarte.getId() == zweiteKarte.getId())
				abräumen();
			else
				zudecken();
			ersteKarte = null;
			zweiteKarte = null;
			AnzahlVersuche++;
			tvAnzahl.setText(Integer.toString(AnzahlVersuche));
		}
	};
	
	public static void meineMemoryAktion(Karte eineKarte) {
		if (!zweiAufgedeckt()) {
			eineKarte.umdrehen();
			if (ersteKarte == null)
				ersteKarte = eineKarte;
			else {
				zweiteKarte = eineKarte;
				meinHandler.postDelayed(myRunnable, Verzögerung); }
		}
	}