Kezdőoldal » Számítástechnika » Programozás » Do-ban bekérek változót, nem...

Do-ban bekérek változót, nem engedi whileban ellenőrizni (már nem létezik)?

Figyelt kérdés

Értem én, hogy rosszul csinálom, de hogy lehetne jól. Csak akkor álljon le a program, ha jó értékeket ad meg az ember.

A vége pedig az lenne, hogy ha szomszédos mezőket adott meg végre a "játékos" akkor kicserélje azok elemeit. Ezt meg valahogy egyszerre kéne végrehajtani, mert amint az egyik megváltozik a másikra, a másikat máár saját magára fogja változtatni.

Bemásolom a kódrészt:

public static void Change(int[,] playfield)

{

do

{



Console.WriteLine("Add valid numbers for the change");

Console.WriteLine("Give the first coordniate(row) of the first jewel you want to change");

int a = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Give the second coordniate(coloumn) of the first jewel you want to change");

int b = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Give the first coordniate(row) of the second jewel you want to change");

int c = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Give the second coordniate(coloumn) of the second jewel you want to change");

int d = Convert.ToInt32(Console.ReadLine());

}


while ((a != c && b != c) || ((a == c) && (b - 1 != d) && (b + 1 != d)) || ((b == d) && (a - 1 != c) && (a + 1 != c)));



playfield[a - 1, b - 1] = playfield[c - 1, d - 1];

playfield[c - 1, d - 1] = playfield[a - 1, b - 1];



}



2018. ápr. 27. 17:36
 1/9 anonim ***** válasza:
100%

Te szentséges ég, az a kilépési feltétel.

A válasz amúgy nagyon egyszerű: a ciklus előtt deklaráld a változókat.

2018. ápr. 27. 17:44
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:

Már működik is, köszönöm.

A kilépési feltételt meg biztos le lehet írni egyszerűbben, de nekem így sikerült, hogy működjön. A cserére nincs ötleted, hogy tudnám megoldani? 2Ds tömb két elemét kéne úgy, hogy a megadott koordináták alapján ne lemásolja az egyiket a másik helyére, hanem tényleg kicserélje.

2018. ápr. 27. 17:48
 3/9 anonim ***** válasza:
100%

Temporális változóval a legegyszerűbb.

Elmented az eredeti értéket, mielőtt felülírod.

2018. ápr. 27. 17:55
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:
Borzasztó milyen alap dolgokra nem gondol az ember, ha most kezdte csak el önállóan a progot. Köszi még egyszer, mentek a zöldek.
2018. ápr. 27. 17:59
 5/9 anonim ***** válasza:

Nem próbáltam, de szerintem a szomszédos mezőket lehetne így ellenőrizni:


if( abs(a - c) == 1 || abs(b - d) == 1)


ezen felül meg ellenrőrizd, hogy a megadott indexek benne vannak e a mátrixba, (nagyob mint 0, kisebb mint a playfield nagysága)

2018. ápr. 27. 18:12
Hasznos számodra ez a válasz?
 6/9 A kérdező kommentje:

Az indexeket már csekkoltam. Inkább az a nehéz, most, hogy csak akkor jöjjön létre a csere, ha a csere után két ugyanolyan érték kerül egymás mellé. Így csekkolnám alapból(whileban):

&& playfield[a - 1, b - 1]!= playfield[a-2,b-1] && playfield[a - 1, b - 1] != playfield[a, b - 1] && playfield[a - 1, b - 1] != playfield[a-1, b ] && playfield[a - 1, b - 1] != playfield[a, b - 2] && playfield[c - 1, d - 1] != playfield[c - 2, d - 1] && playfield[c - 1, d - 1] != playfield[c, d - 1] && playfield[c - 1, d - 1] != playfield[c - 1, d] && playfield[c - 1, d - 1] != playfield[c, d - 2]);

De alapból nem jó, + nem tud csekkolni baloldalinál baloldali szomszédot, alsónál alsót stb. és olyankor outof range. Most épp erre guglizok már eg yélf órája, de nem találok igazán jó megoldást.

2018. ápr. 27. 19:28
 7/9 A kérdező kommentje:

Ez a problémám már a "playfield" generálásakor. Már kitaláltam, hogy két metódusban csinálom.

public static void FillArray(int[,] array)

{

Random rnd = new Random();


for (int i = 0; i < array.GetLength(0); i++)

{

for (int j = 0; j < array.GetLength(1); j++)

{

array[i, j] = rnd.Next(1,8);

}

}

}



És a 2.

public static void FindPairsStart (int [,]arr)

{

int exceed = 0;

Random rnd = new Random();

for (int i = 0; i < arr.GetLength(0); i++)

{

for (int j = 0; j < arr.GetLength(1); j++)

{

if (arr[i,j]==arr[i,j+1]|| arr[i, j] == arr[i+1, j ]|| arr[i, j] == arr[i, j - 1]|| arr[i, j] == arr[i-1, j ])

{

exceed = arr[i, j];

arr[i, j] = rnd.Next(1, 10 - exceed);

}

}

}

}

De ugye itt sem tudja csekkolni, mert átmegy az index -1be

2018. ápr. 27. 19:32
 8/9 anonim ***** válasza:
100%
Ha belegondolsz, fölösleges az [i,j] mezőt az [i, j-1] és [i-1,j] mezőkkel ellenőrizned, mert egy korábbi iterációban már elvégezted a két mező összehasonlítását. Gondold végig, legelső iterációban pl i,j=0, összehasonlítod a [0,0] mezőt a [0,1] (i, j+1) mezővel. A következő lépésben i=0, j=1, és összehasonlítod a [0,1] mezőt a [0,0] (i,j-1) mezővel. Fölösleges, már megcsináltad egyszer. Tehát a negatív indexes összehasonlításokat nemes egyszerűséggel kidobhatod az ablakon.
2018. ápr. 28. 15:14
Hasznos számodra ez a válasz?
 9/9 A kérdező kommentje:
Ment a zöld neked is, köszönöm!
2018. ápr. 28. 22:32

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!