c# to android

  • 6 Antworten
  • Letztes Antwortdatum
M

mustangtiger24

Neues Mitglied
0
Wäre es vielleicht möglich, dass jemand mir den folgenden kurzen Code in android umschreibt. Ich beiss mir fast die Zähne aus :S

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
  class Program
  {
    static int[] Tags = new int[12] { 11, 96, 12, 33, 22, 63, 74, 52, 54, 42, 44, 85 };
    static int[] Visited = new int[12];
    static int iVisited = 0;

    static void Main(string[] args)
    {
      Console.Write(Check(11, 96));
    }


    static bool Check(int pt, int target)
    {
      Visited[iVisited++] = pt;
      if (InArray(Tags, pt + 1))
      {
        if (pt + 1 == target)
        {    
          return true;
        }
        else if (!InArray(Visited, pt + 1))
        {
          if (Check(pt + 1, target))
          {
            return true;
          }
        }
      }
      if (InArray(Tags, pt + 11))
      {
        if (pt + 11 == target)
        {
          return true;
        }
        else if (!InArray(Visited, pt + 1))
        {
          if (Check(pt + 11, target))
          {
            return true;
          }
        }
      }
      if (InArray(Tags, pt + 10))
      {
        if (pt + 10 == target)
        {
          return true;
        }
        else if (!InArray(Visited, pt + 10))
        {
          if (Check(pt + 10, target))
          {
            return true;
          }
        }
      }
      if (InArray(Tags, pt + 9))
      {
        if (pt + 9 == target)
        {
          return true;
        }
        else if (!InArray(Visited, pt + 9))
        {
          if (Check(pt + 9, target))
          {
            return true;
          }
        }
      }
      if (InArray(Tags, pt - 1))
      {
        if (pt - 1 == target)
        {
          return true;
        }
        else if (!InArray(Visited, pt - 1))
        {
          if (Check(pt - 1, target))
          {
            return true;
          }
        }
      }
      if (InArray(Tags, pt - 11))
      {
        if (pt - 11 == target)
        {
          return true;
        }
        else if (!InArray(Visited, pt - 11))
        {
          if (Check(pt - 11, target))
          {
            return true;
          }
        }
      }
      if (InArray(Tags, pt - 10))
      {
        if (pt - 10 == target)
        {
          return true;
        }
        else if (!InArray(Visited, pt - 10))
        {
          if (Check(pt - 10, target))
          {
            return true;
          }
        }
      }
      if (InArray(Tags, pt - 9))
      {
        if (pt - 9 == target)
        {
          return true;
        }
        else if (!InArray(Visited, pt - 9))
        {
          if (Check(pt - 9, target))
          {
            return true;
          }
        }
      }
      return false;
    }

    static bool InArray(int[] arr, int val)
    {
      for (int i = 0; i < arr.Length; i++)
      {
        if (arr[i] == val)
        {
          return true;
        }
      }
      return false;
    }
  }
}
 
Den code kann man doch fast 1 zu 1 übernehmen, so auf den ersten Blick.
Du musst dir nur überlegen wie du die ausgabe machen willst.

Weil eine Console hast du so nicht in Android.

Wie weit kennst du dich denn mit android aus?
 
Ich programmiere zum ersten mal android, als wage.

Ich habe für jeden ImageView einen onClickListener gesetzt:

Code:
 public void onClick(View arg0) {
		if (iTurn % 2 == 0) {
			((ImageView) arg0).setImageResource(R.drawable.play_button);
			iTurn++;
			arg0.setClickable(false);
		} else {
			((ImageView) arg0).setImageResource(R.drawable.about_us_button);
			iTurn++;
			TagsArraySand = (Object[]) arg0.getTag();
			arg0.setClickable(false);
		}

Ich hab gedacht es wäre am besten, wenn ich mit Tags arbeite (oder sind Ids besser?), also versuche ich die Tags in ein Array zu pushen. Sprich ich müsste in der C# Version noch ein weiteres Array erstellen (die Werte die in der C# Version sind wurden einfach mal provisorisch reingestellt, dass ich schauen kann ob der Code so funktioniert).

Jetzt käme die Funktion von C# ins Spiel, um zu überprüfen ob die ImageViews neben einander liegen.

Also konkret weiss ich nicht wie ich die Sache mit den Array lösen muss. Die Funktion wird nicht als "Funktion" anerkannt und InArray bzw. !InArray ist in android ja auch anders, oder?
Das ganze object und int und int[] Zeugs macht mir auch noch eine Strich durch die Rechnung.
 
Also InArray müsste auch in Java so ähnlich funktionieren.
staat bool muss es boolean heißen.

Aber ich hab noch nicht ganz verstanden was du vorhast.
Was soll denn genau passieren, wenn du auf ein Bild klickst?
Was ist iTurn?

An welcher Stelle soll dein C# Code quasi aufgerufen werden?
 
Also das Spiel soll wie folgt funktionieren:

ImageShack® - Online Photo and Video Hosting

So sieht das Layout aus. Es ist ein Player vs Player Spiel. Player1 soll von der oberen linken Ecke in die untere rechte Ecke eine zusammenhängende "Linie" schaffen (Diagonal verbunden geht auch). Player2 von oben Links nach unter Rechts. Die zwei Players können pro Zug nur ein Eis Klotz schmelzen/für sich beanspruchen. Hier kommt iTurn ins Spiel. Wenn iTurn durch zwei teilbar ist Player1 am Zuge, andernfalls Player2.

Um zu überprüfen ob nun eine zusammenhängende Linie besteht, habe ich die Check Funktion geschrieben (in C# mit meinem Betreuer meiner Arbeit zusammen).

Erstes Problem besteht nun darin, die geklickten Eis Klötze in ein Array zu pushen.
Dann soll eben die Funktion Check ins Spiel kommen.
Falls die ImageViews eine korrekte durchzogene Linie bilden, hat derjenige Spieler gewonnen.

EDIT: Ich habe den Code nun ein wenig geändert und Bool Array vor die Check Funktion genommen.
Der komplette Code sieht nun so aus. Das ganze findViewbyId, setOnClickListener und setId habe ich herausgeschnitten.

Jetzt zeigt es mir nur noch an der Stelle Fehler an, wo ich die Id Werte in den Array schieben will. (Sprich TagsArrayRock = {TagsRock}; // Pushes ID numbers into array) (Fehlermeldung: Array constants can only be used in initializers)

Wie muss ich das in android machen?



Code:
public class MeltIt_1 extends Activity implements OnClickListener {

	ImageView IV11, IV21, IV31, IV41, IV51, IV61, IV71, IV81, IV91;
	ImageView IV12, IV22, IV32, IV42, IV52, IV62, IV72, IV82, IV92;
	ImageView IV13, IV23, IV33, IV43, IV53, IV63, IV73, IV83, IV93;
	ImageView IV14, IV24, IV34, IV44, IV54, IV64, IV74, IV84, IV94;
	ImageView IV15, IV25, IV35, IV45, IV55, IV65, IV75, IV85, IV95;
	ImageView IV16, IV26, IV36, IV46, IV56, IV66, IV76, IV86, IV96;

	int ClickCounter = 0;
	int iTurn = 0;
	boolean CheckLevel = false;
	private static int[] Visited = new int[] {};
	private static int iVisited = 0;
	
	static int[] TagsArraySand = {};
	static int[] TagsArrayRock = {};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_melt_it_1);

				
	// Melts the selected ice floe.
	@Override
	public void onClick(View arg0) {
		if (iTurn % 2 == 0) {
			((ImageView) arg0).setImageResource(R.drawable.play_button);
			iTurn++;
			int TagsSand = arg0.getId();
			TagsArraySand = {TagsSand}; // Pushes ID numbers into array
			arg0.setClickable(false);
		} else {
			((ImageView) arg0).setImageResource(R.drawable.about_us_button);
			iTurn++;
			int TagsRock = arg0.getId();
			TagsArrayRock = {TagsRock}; // Pushes ID numbers into array
			arg0.setClickable(false);
		}
				
		ClickCounter += 1;
		// Opens a dialog interface if too many ice floes have been melted and
		// starts the activity new.
		if (ClickCounter == 54) {
			boolean cancelable = true;
			new AlertDialog.Builder(this).setTitle("Unentschieden!")
					.setCancelable(cancelable).show();
			finish();
			Intent intent = new Intent(MeltIt_1.this, MeltIt_2.class);
			startActivity(intent);

		}
	}
	
	
	private static boolean InArray(int[] Visited, int val)
	{
	  for (int i = 0; i < TagsArrayRock.length; i++)
	  {
		if (TagsArrayRock[i] == val)
		{
		  return true;
		}
	  }
	  return false;
	}
	
	
	public boolean Check(int pt, int target)
	{
	  Visited[iVisited++] = pt;
	  if (InArray(TagsArrayRock, pt + 1))
	  {
		if (pt + 1 == target)
		{
		  return true;
		}
		else if (!InArray(Visited, pt + 1))
		{
		  if (Check(pt + 1, target))
		  {
			return true;
		  }
		}
	  }
	  if (InArray(TagsArrayRock, pt + 11))
	  {
		if (pt + 11 == target)
		{
		  return true;
		}
		else if (!InArray(Visited, pt + 1))
		{
		  if (Check(pt + 11, target))
		  {
			return true;
		  }
		}
	  }
	  if (InArray(TagsArrayRock, pt + 10))
	  {
		if (pt + 10 == target)
		{
		  return true;
		}
		else if (!InArray(Visited, pt + 10))
		{
		  if (Check(pt + 10, target))
		  {
			return true;
		  }
		}
	  }
	  if (InArray(TagsArrayRock, pt + 9))
	  {
		if (pt + 9 == target)
		{
		  return true;
		}
		else if (!InArray(Visited, pt + 9))
		{
		  if (Check(pt + 9, target))
		  {
			return true;
		  }
		}
	  }
	  if (InArray(TagsArrayRock, pt - 1))
	  {
		if (pt - 1 == target)
		{
		  return true;
		}
		else if (!InArray(Visited, pt - 1))
		{
		  if (Check(pt - 1, target))
		  {
			return true;
		  }
		}
	  }
	  if (InArray(TagsArrayRock, pt - 11))
	  {
		if (pt - 11 == target)
		{
		  return true;
		}
		else if (!InArray(Visited, pt - 11))
		{
		  if (Check(pt - 11, target))
		  {
			return true;
		  }
		}
	  }
	  if (InArray(TagsArrayRock, pt - 10))
	  {
		if (pt - 10 == target)
		{
		  return true;
		}
		else if (!InArray(Visited, pt - 10))
		{
		  if (Check(pt - 10, target))
		  {
			return true;
		  }
		}
	  }
	  if (InArray(TagsArrayRock, pt - 9))
	  {
		if (pt - 9 == target)
		{
		  return true;
		}
		else if (!InArray(Visited, pt - 9))
		{
		  if (Check(pt - 9, target))
		  {
			return true;
		  }
		}
	  }
	  return false;
	}


  }
 
In Java (und C# soviel ich weiss auch) werden die geschweiften Klammern bei Arrays nur zum initialisieren benutzt.

Wenn du also ein Array deklarierst und gleich noch mit Werten füllen willst, so wie du es bereits in deinem ersten Beitrag benutzt hast:

Code:
static int[] Tags = new int[12] { 11, 96, 12, 33, 22, 63, 74, 52, 54, 42, 44, 85};

Willst du später das Array manipulieren, machst du das über den Array-Index. Willst du also das dritte Element im Array ändern, machst du das so:

Code:
Tags[2] = 99;

Eine Methode, etwas ans Ende eines Arrays zu pushen, gibt es so nicht. Du musst dir also selber merken, wo du etwas im Array speichern willst.

Ausserdem haben Arrays in Java eine fixe Länge, du musst also von Beginn an definieren, wie gross das Array ist.

Deine folgenden Arrays haben also alle eine Länge von 0, und die bleibt fix:

Code:
private static int[] Visited = new int[] {};
static int[] TagsArraySand = {};
static int[] TagsArrayRock = {};

Wenn du also etwas wie dynamische Arrays haben willst, müsstest du so etwas wie ArrayLists benutzen. So könntest du dann dynamisch Elemente in die Liste hinzufügen, ohne dich um die Grösse zu kümmern:

List<Integer> myArrayList = new ArrayList<Integer>();
myArrayList.add(17);
myArrayList.add(123);
myArrayList.add(0);

Damit müsstest du dann aber natürlich deine ganze check-Methode anpassen.
 
Das funktioniert auch nicht du musst ja auch sagen an welcher stelle du das ins array packen willst.

Du kannst aber eine ArrayList benutzen.
die hat eine add() methode
ArrayList (Java Platform SE 6)
Damit bist du flexibler als mit den arrays

EDIT:
Zoopa war schneller ;)
 

Ähnliche Themen

M
Antworten
21
Aufrufe
1.197
swa00
swa00
Mr-Fisch
Antworten
5
Aufrufe
906
migi01
migi01
Mr-Fisch
Antworten
8
Aufrufe
962
Mr-Fisch
Mr-Fisch
M
Antworten
9
Aufrufe
739
mkuz24
M
A
Antworten
5
Aufrufe
669
swa00
swa00
Zurück
Oben Unten