C# Problema ordinamento array!

Stato
Discussione chiusa ad ulteriori risposte.

ONE OK ROCK

Utente Diamond
11 Agosto 2013
5,865
266
1,153
1,949
Salve,
In pratica stavo facendo un giochino in cui ci sono due player e dovo passano lasciano un quadrato con il loro colore, in pratica se passi sopra ad uno del tuo avversario lo ricolori col tuo colore..
In pratica ho fatto 2 array che rappresentano le caselle colorate dei due giocatori, qualcuno mi puo dire un modo per far si che quando player1 ricolora il quadrato di player2, nell'array di player2 vengano tolte quelle coordinate e riordinato?

solo degli spunti riguardo il modo di farlo e mi serve il metodo per riordinarlo, array.sort non è presente tra i metodi (sarà perchè è un array di rectangleò boh)

Grazie :>

Inviato dal mio XT910 utilizzando Tapatalk
 
Ordinarlo in base a cosa?
In base a quale è stato il primo quadrato colorato , il secondo e cosi via?

Sent from my LG-D802 using Tapatalk
 
Ciao sono Thejuster.
Io fossi in te eviterei l'uso degli array.

Utilizzerei una lista per andare più sul sicuro.
Poi esistono milioni di modi per fare la stessa cosa che hai fatto tu utilizzando gli array.

Un metodo veloce ed infallibile è l'uso appunto delle liste Distinct o un controllo crociato
se conosci il lambada expression è ancora meglio.

Codice:
public struct _player
{
public int playerx;
public int playery;
public int player;
}

List<_player> Player = new List<_player>();


per la pulizia della lista

Codice:
Player = Player.Distinct().ToList<_player>();

in questo modo se c'è un dato doppio verrà automaticamente escluso dalla lista.
questo anche per non appesantire la memoria.


Altrimenti ancora più semplice ti crei due liste.

Player1 e Player2

Codice:
if(Player1.X == Player2.X && Player1.Y == Player2.Y)
{
 //Posizione uguale rilevata

}

Io eviterei di utilizzare gli array per questo genere di cose.
Terrei gli array per operazioni diverse
 
Ciao sono Thejuster.
Io fossi in te eviterei l'uso degli array.

Utilizzerei una lista per andare più sul sicuro.
Poi esistono milioni di modi per fare la stessa cosa che hai fatto tu utilizzando gli array.

Un metodo veloce ed infallibile è l'uso appunto delle liste Distinct o un controllo crociato
se conosci il lambada expression è ancora meglio.

Codice:
public struct _player
{
public int playerx;
public int playery;
public int player;
}

List<_player> Player = new List<_player>();


per la pulizia della lista

Codice:
Player = Player.Distinct().ToList<_player>();

in questo modo se c'è un dato doppio verrà automaticamente escluso dalla lista.
questo anche per non appesantire la memoria.


Altrimenti ancora più semplice ti crei due liste.

Player1 e Player2

Codice:
if(Player1.X == Player2.X && Player1.Y == Player2.Y)
{
//Posizione uguale rilevata

}

Io eviterei di utilizzare gli array per questo genere di cose.
Terrei gli array per operazioni diverse

il lambda lo escluderei siccome ancora non l'ho fatto, per la seconda non ho capito il codice, cioè fai due liste e poi Player1.X etc che vuol significare?
Io dovrei confrontare se le coordinate in cui è posizionato sono presenti nelle due liste, se è presente nella sua lista ignora semplicemente il passaggio e non lo aggiunge alla lista, se è presente nella lista dell'avversario lo elimina da li e lo aggiunge alla propria.
Spiegato a parole diciamo che non capisco molto bene, se mi fai diciamo uno "schizzo" qua su if poi me lo elaboro!

Singh riordinarlo in senso da eliminare i doppi valori e riordinarlo eliminando i Rectangle senza valori
 
Non programmo in C# ma è un topic che mi ha suscitato un po' di interesse... Ma, praticamente, hai bisogno solo sovrascrivere la casella? O tenere anche informazioni su di essa (di chi è e così via)?
Perché nel primo caso, se ho ben capito cosa intendi fare, usare array separati o liste è parecchio dispendioso.
Ho postato qui http://pastebin.com/J26HXxwk
Perché il forum mi dava un errore tipo DDos boh.

Prova il mio sorgente dovrebbe funzionare sicuramente
Questo codice ci porta (in accordo alla documentazione MSDN) a una complessità algoritmica a O(3n). Certo, è sempre lineare però pesantuccia per un cosa del genere.

Ammesso che la griglia sia gestita come una matrice, non è molto più conveniente lasciare a lei il compito di memorizzare il colore di una determinata casella? E cambiarlo al passaggio?
 
La mia ignoranza non ha limiti, non ho capito quel che vuoi fare :\

Comunque mi sono venute un paio di idee in mente, quando ho tempo le testo!

Inviato dal mio XT910 utilizzando Tapatalk
 
Salve,
In pratica stavo facendo un giochino in cui ci sono due player e dovo passano lasciano un quadrato con il loro colore, in pratica se passi sopra ad uno del tuo avversario lo ricolori col tuo colore..
In pratica ho fatto 2 array che rappresentano le caselle colorate dei due giocatori, qualcuno mi puo dire un modo per far si che quando player1 ricolora il quadrato di player2, nell'array di player2 vengano tolte quelle coordinate e riordinato?

solo degli spunti riguardo il modo di farlo e mi serve il metodo per riordinarlo, array.sort non è presente tra i metodi (sarà perchè è un array di rectangleò boh)

Grazie :>

Inviato dal mio XT910 utilizzando Tapatalk

Postare il sorgente sarebbe d'aiuto , in ogni caso se hai definito un array puoi usare tranquillamente il metodo statico Sort

Codice:
Array.Sort<T>(T vet[],Comparision<T> comparer)

T , indica un parametro di tipo generico nel tuo caso sarà di tipo Rectangle.
Il secondo parametro è un comparatore che ti permette di ordinare in un determinato ordine adoperando questa classe.
Codice:
  class Ordinatore : Comparer<Rectangle> //Eredito la classe astratta Comparer e ne ridefinisco il metodo Compare

    {
     

        public override int Compare(Rectangle x, Rectangle y)
        {
            //qui eseguo la comparazione tra i due oggetti , il valore restituito può essere 0 nel caso i colori siano uguali
            >0 nel caso in cui x risulti maggiore di y.
            <0 nel caso in cui x risulti minore di y.

        }

In generale questo si usa per ordinare un vettore. Poi non so perché hai usato un tipo rectangle quindi non posso svilupparti il codice per la comparazione... ma fornirti solo un idea generale.
 
Postare il sorgente sarebbe d'aiuto , in ogni caso se hai definito un array puoi usare tranquillamente il metodo statico Sort

Codice:
Array.Sort<T>(T vet[],Comparision<T> comparer)

T , indica un parametro di tipo generico nel tuo caso sarà di tipo Rectangle.
Il secondo parametro è un comparatore che ti permette di ordinare in un determinato ordine adoperando questa classe.
Codice:
  class Ordinatore : Comparer<Rectangle> //Eredito la classe astratta Comparer e ne ridefinisco il metodo Compare

    {
    

        public override int Compare(Rectangle x, Rectangle y)
        {
            //qui eseguo la comparazione tra i due oggetti , il valore restituito può essere 0 nel caso i colori siano uguali
            >0 nel caso in cui x risulti maggiore di y.
            <0 nel caso in cui x risulti minore di y.

        }

In generale questo si usa per ordinare un vettore. Poi non so perché hai usato un tipo rectangle quindi non posso svilupparti il codice per la comparazione... ma fornirti solo un idea generale.
Ho usato il rectangle per il FillRectangle, in pratica il gioco apparte i player non ha nulla, nemmeno la griglia, ho semplicemente messo che allo spostamento (si muove di tot alla volta sempre per non fare quadrati storti, uno che finsice sull'altro) il cubetto i colorasse, comunque grazie del codice ora vedo di sfruttare questo codice!
 
Ho usato il rectangle per il FillRectangle, in pratica il gioco apparte i player non ha nulla, nemmeno la griglia, ho semplicemente messo che allo spostamento (si muove di tot alla volta sempre per non fare quadrati storti, uno che finsice sull'altro) il cubetto i colorasse, comunque grazie del codice ora vedo di sfruttare questo codice!

ah ora mi è chiaro. Ma invece di aggiornare i singoli giocatori fai come ha detto Scanetatore... fallo fare alla griglia.
Ti crei una classe griglia che permette di interagire con la matrice("percorso"). Definisci il metodo muovi e ogni movimento di un giocatore controlla se è colorata o meno la casella.
 
  • Mi piace
Reazioni: Scanetatore
ah ora mi è chiaro. Ma invece di aggiornare i singoli giocatori fai come ha detto Scanetatore... fallo fare alla griglia.
Ti crei una classe griglia che permette di interagire con la matrice("percorso"). Definisci il metodo muovi e ogni movimento di un giocatore controlla se è colorata o meno la casella.
Non ho capito bene ç_ç
Comunque il gioco è contenuto in un while nel metodo che richiamo alla pressione di un tasto (il tasto di start diciamo)
 
Non ho capito bene ç_ç
Comunque il gioco è contenuto in un while nel metodo che richiamo alla pressione di un tasto (il tasto di start diciamo)
lo devi suddividere come minimo nelle seguenti classi :

-Player.cs
-GameEngine (Gestisce la griglia , consigliabile come matrice o come un array di struct o come meglio credi e gestisce anche il colore e se il player è passato)

e un thread separato che si occupa della grafica.
Anche se lasci il while è meglio che ti crei il modello di giocatore e Mappa .
Ecco perchè prima ti avevo chiesto il codice per capire anche dall'analisi che avevi fatto come intendevi strutturare il codice ^^
 
Stato
Discussione chiusa ad ulteriori risposte.