Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

C# vraag (beginner)

Pagina: 1
Acties:
  • 1.010 views

Verwijderd

Topicstarter
Hallo Tweakers,

Ik ben nieuw hier op het forum, net zoals dat ik nieuw ben met het programmeren in C#. Het zou dus kunnen dat ik deze vraag ergens verkeerd post, mijn excuses alvast hiervoor!

Nu, ik ben net begonnen met C# te leren, en ik dacht laat ik mezelf eens uitdagen, en kijken hoe ver ik kom in het maken van monopolie. Afijn ik heb een bord met 40 vakjes (labels), en met wat werk krijg ik het voor elkaar om 1 speler rond te laten lopen dmv een dobbelsteen. De kleur van het label waar de speler op staat is rood, de rest is blauw. Nu heb ik 2 methods gemaakt om dit te bewerkstelligen, namelijk:


C#:
1
2
3
4
5
6
7
8
9
 
void Clearlopen()
{
label0.BackColor = Color.Blue;
label1.BackColor = Color.Blue;
label2.BackColor = Color.Blue;
...
}
 


Dit om aan het begin van de beurt alle vakjes blauw te maken, en vervolgens om het juiste vakje rood te maken:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
 
void Lopen()
{
     switch (locPlayer1)
     {
          case 1:
                   label0.BackColor = Color.Red;
                   break;
...

}
 


Nu is dit flink wat lijnen code met 40 labels, en ik heb het idee dat dit sneller moet kunnen!
Is er geen optie om een bijvoorbeeld zoiets te doen:

for (int i = 0; i < 40; i++)
{
label[i].BackColor = Color.Blue;
}

zodat zo alle 40 labels blauw zijn?

=)

[ Voor 17% gewijzigd door Verwijderd op 12-11-2014 13:21 . Reden: per ongeluk gepost ]


  • Damic
  • Registratie: September 2003
  • Laatst online: 00:41

Damic

Tijd voor Jasmijn thee

Wat is nu de vraag? Ik kan je zo een antwoord geven maar dat gaan ik niet doenLol :p

Vroeger had je label[index] , nu niet meer dat moet ik zelf zoeken hoe je dat het snelste doet.

[ Voor 43% gewijzigd door Damic op 12-11-2014 13:26 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22:20

Rannasha

Does not compute.

En wat is precies de vraag?

Overigens doe je er verstandig aan om alle 40 labels in een array te stoppen, zodat je ze makkelijker kunt benaderen. Zodra je dat gedaan hebt, zou je de functie Clearlopen() kunnen herschrijven tot:
C#:
1
2
3
4
5
6
7
void Clearlopen()
{
    for (int i = 0; i < 40; i++)
    {
        Labels[i].BackColor = Color.Blue;
    }
}


en kun je als een speler op plek i staat en j plaatsen vooruit gaat, direct het juiste element pakken:
C#:
1
Labels[(i + j) % 40].BackColor = Color.Red;


Om de zaak in een array te zetten doe je eenmalig:
C#:
1
2
3
4
5
6
7
8
9
10
Label[] Labels;

void MaakArray()
{
    Labels = new Label[40];
    
    Label[0] = label0;
    Label[1] = label1;
    ...
}


Overigens doe je er verstandig aan om een aantal dingen nog te heroverwegen:
- Naamgeving. "label" is niet een erg beschrijvende naam. Kies eerder iets als "SpelbordVakje" of iets anders dat duidelijk maakt wat de rol is van het ding.
- Scheiding van functionaliteit en layout. Zorg dat je de functionaliteit van het spel en de interface zo veel mogelijk gescheiden houdt. Hou dus de positie van de speler en andere voor het spel relevante gegevens bij in aparte variabelen en kijk, bijvoorbeeld, niet welk label rood is om te checken waar een speler zich bevindt. Nadat je de spellogica hebt afgewerkt (de speler is verplaatst), roep je een functie aan die de interface update met de nieuwe situatie.

[ Voor 46% gewijzigd door Rannasha op 12-11-2014 13:39 ]

|| Vierkant voor Wiskunde ||


  • Crahsystor
  • Registratie: Februari 2009
  • Laatst online: 22:31
Met Rannasha ^^

Verder, niet inhoudelijk over je code, is mijn advies alles in het Engels te doen. Dan hoef je niet steeds te vertalen en te wisselen tussen Engels en Nederlands. Lijkt misschien wat onbenullig, maar in mijn ervaring werkt het prettiger er mocht je vragen hebben, dan kun je met je eigen code makkelijker hulp vragen op Engelstalige fora, waar toch de meeste kennis zit.

Addicted to silent computing


Verwijderd

Topicstarter
Om de zaak in een array te zetten doe je eenmalig:
C#:
1
2
3
4
5
6
7
8
9
10
Label[] Labels;

void MaakArray()
{
    Labels = new Label[40];
    
    Label[0] = label0;
    Label[1] = label1;
    ...
}


Als ik dit doe krijg ik een lijst met errors die zegt: 'Systej.Windows.Forms.Label' is a 'type' but is used like a 'variable'. Betekent dit dat ik de code op de verkeerde plek heb staan?
Ik heb van alles eruit gegooid en ben opnieuw begonnen met mijn code, die ziet er nu zo uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }
       
        int locPlayer1 = 0;
        int dice;
        Label[] vakje;

// Vakverdeling
        void MaakArray()
        {
            vakjes = new Label[40];

            Label[0] = Start;
            Label[1] = Dorpstraat;
            Label[2] = AF1;
            Label[3] = Brink;
            Label[4] = IB200;
            Label[5] = StationZuid;
            Label[6] = Steenstraat;
            Label[7] = Kans1;
            Label[8] = Ketelstraat;
            Label[9] = Velperplein;
            Label[10] = Jailvisit;
            Label[11] = Barteljorisstraat;
            Label[12] = Nuts1;
            Label[13] = Zijlweg;
            Label[14] = Houtstraat;
            Label[15] = StationWest;
            Label[16] = Neude;
            Label[17] = AF2;
            Label[18] = Biltstraat;
            Label[19] = Vreeburg;
            Label[20] = VrijParkeren;
            Label[21] = AKerkhof;
            Label[22] = AF2;
            Label[23] = Grootemarkt;
            Label[24] = Heerestraat;
            Label[25] = StationNoord;
            Label[26] = Spui;
            Label[27] = Plein;
            Label[28] = Nuts2;
            Label[29] = Langepoten;
            Label[30] = ToJail;
            Label[31] = Hofplein;
            Label[32] = Blaak;
            Label[33] = AF3;
            Label[34] = Coolsingel;
            Label[35] = StationOost;
            Label[36] = Kans3;
            Label[37] = Leidschestraat;
            Label[38] = EB100;
            Label[39] = Kalverstraat;
            Label[40] = Jail;

        }

       
        private void btnRoll_Click(object sender, EventArgs e)
        {

            Random RND = new Random();
            dice = RND.Next(1, 7);
            txtRoll.Text = (dice.ToString());
           
            locPlayer1 += dice;
            if (locPlayer1 > 39)
            {
                locPlayer1 -= 40;
            }
           
            txtlocPlayer1.Text = locPlayer1.ToString();


        }
        }


    }


vanwaar deze error?

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22:20

Rannasha

Does not compute.

Oh, ik heb een typo gemaakt. Er hoort te staan:
code:
1
Labels[0] = label0;

en zo voort voor de overige labels.

In jouw voorbeeld wordt dit dus:
code:
1
vakjes[0] = Start;


Om nog even verder door te hameren op naamgeving. Ik kies er zelf voor om in de naam van een component (label, knop, invulveld) altijd een paar letters op te nemen die aangeven welk soort component het is. Bijvoorbeeld lblStart voor het "Start"-label. Als je later een knop toevoegt die logischerwijs bij het label hoort, kun je die de naam btnStart (button) geven.

Hoewel dergelijke zaken niet strict noodzakelijk zijn, wordt het zonder een duidelijk systeem van naamgeving na een tijdje erg lastig om de wat grotere projecten nog te kunnen doorgronden.

edit: Zoals hieronder al wordt gezegd: Let erop dat je nu "vakje" en "vakjes" hebt gebruikt voor hetzelfde ding en dat gaat niet werken natuurlijk.

[ Voor 92% gewijzigd door Rannasha op 12-11-2014 14:49 ]

|| Vierkant voor Wiskunde ||


  • GBCHEATER
  • Registratie: Juni 2003
  • Laatst online: 17-09-2024
Volgens mij compileert het sowieso niet. Je maakt een private variabele aan vakje, vervolgens geef je een waarde aan vakjes in de functie MaarArray.

Daarnaast moet je de naam van de variabele aanspreken, dus iets als vakjes[0] = start;

  • Stoffel
  • Registratie: Mei 2001
  • Laatst online: 14-11 13:35

Stoffel

Engineering the impossible

Waarom zou je zelf een Array aanleggen van je labels? Ik neem aan dat je Windows Forms gebruikt toch? Dan heeft je form, of de andere container waar je labels in zitten, zelf al een control collection. Daar kun je doorheen loopen en de labels eruit vissen:

C#:
1
2
3
4
5
6
7
8
        private void ResetLabels()
        {
            foreach (var control in this.Controls)
            {
                if (control is Label)
                    (control as Label).BackColor = Color.Blue;
            }
        }


In het bovenstaande voorbeeld is 'this' dus een verwijzing naar de form waar je in zit. Daar zou ook de naam van een Panel ofzo kunnen staan.

[ Voor 12% gewijzigd door Stoffel op 12-11-2014 14:56 ]


  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Rannasha schreef op woensdag 12 november 2014 @ 14:42:
Oh, ik heb een typo gemaakt. Er hoort te staan:
code:
1
Labels[0] = label0;

...

Om nog even verder door te hameren op naamgeving. Ik kies er zelf voor om in de naam van een component (label, knop, invulveld) altijd een paar letters op te nemen die aangeven welk soort component het is. Bijvoorbeeld lblStart voor het "Start"-label. Als je later een knop toevoegt die logischerwijs bij het label hoort, kun je die de naam btnStart (button) geven.
...
http://stackoverflow.com/...n?answertab=votes#tab-top

Wel even als sidenote, in het geval van labels en buttons ontkom je er haast niet aan omdat je onderscheid moet maken tussen de label en de button die beide over hetzelfde object gaan.
Maar als je bijvoorbeeld String sNaam =""; gaat doen schiet je je doel imho voorbij.

[ Voor 3% gewijzigd door Afvalzak op 12-11-2014 14:58 ]

Last.fm | Code Talks


  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 18-11 17:31
Stoffel schreef op woensdag 12 november 2014 @ 14:52:
Waarom zou je zelf een Array aanleggen van je labels? Ik neem aan dat je Windows Forms gebruikt toch? Dan heeft je form, of de andere container waar je labels in zitten, zelf al een control collection. Daar kun je doorheen loopen en de labels eruit vissen:

C#:
1
2
3
4
5
6
7
8
        private void ResetLabels()
        {
            foreach (var control in this.Controls)
            {
                if (control is Label)
                    (control as Label).BackColor = Color.Blue;
            }
        }
In bovenstaande code ga je nat als je nog meer labels in je form hebt staan.
In TS's situatie zou ik ook voor een array kiezen.

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22:20

Rannasha

Does not compute.

Stoffel schreef op woensdag 12 november 2014 @ 14:52:
Waarom zou je zelf een Array aanleggen van je labels? Ik neem aan dat je Windows Forms gebruikt toch? Dan heeft je form, of de andere container waar je labels in zitten, zelf al een control collection. Daar kun je doorheen loopen en de labels eruit vissen:

C#:
1
2
3
4
5
6
7
8
        private void ResetLabels()
        {
            foreach (var control in this.Controls)
            {
                if (control is Label)
                    (control as Label).BackColor = Color.Blue;
            }
        }
Dat kan ook, maar je moet toch al een array of een vergelijkbare structuur hebben voor zaken als het lopen tussen vakjes. Dan kun je deze meteen gebruiken voor het resetten van alle labels. Dit komt de leesbaarheid ten goede, want het is meteen duidelijk welke set labels blauw gemaakt wordt.

In het bovenstaande voorbeeld is 'this' dus een verwijzing naar de form waar je in zit. Daar zou ook de naam van een Panel ofzo kunnen staan.
Afvalzak schreef op woensdag 12 november 2014 @ 14:57:
[...]

http://stackoverflow.com/...n?answertab=votes#tab-top

Wel even als sidenote, in het geval van labels en buttons ontkom je er haast niet aan omdat je onderscheid moet maken tussen de label en de button die beide over hetzelfde object gaan.
Maar als je bijvoorbeeld String sNaam =""; gaat doen schiet je je doel imho voorbij.
Ik gebruik het dan ook enkel voor UI componenten. Andere variabelen zoals integers, strings en willekeurige objecten zijn doorgaans wel te herkennen als je de juiste naam kiest, zonder dat je het type expliciet in de naam op hoeft te nemen.

[ Voor 25% gewijzigd door Rannasha op 12-11-2014 15:01 ]

|| Vierkant voor Wiskunde ||


  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Rannasha schreef op woensdag 12 november 2014 @ 14:59:
[...]


Ik gebruik het dan ook enkel voor UI componenten. Andere variabelen zoals integers, strings en willekeurige objecten zijn doorgaans wel te herkennen als je de juiste naam kiest, zonder dat je het type expliciet in de naam op hoeft te nemen.
Dat dacht ik al te lezen maar ik wilde het wel even duidelijk maken zodat TS het niet verkeerd aanleert ;)

[ Voor 32% gewijzigd door Afvalzak op 12-11-2014 15:02 ]

Last.fm | Code Talks


Verwijderd

Topicstarter
[/quote]

edit: Zoals hieronder al wordt gezegd: Let erop dat je nu "vakje" en "vakjes" hebt gebruikt voor hetzelfde ding en dat gaat niet werken natuurlijk.
[/quote]

Aha inderdaad. Nu heb ik dit aangepast,

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int locPlayer1 = 0;
        int dice;
        Label[] vakje;

// Vakverdeling
        void MaakArray()
        {
            vakje = new Label[40];

            vakje[0] = Start;
            vakje[1] = Dorpstraat;
            vakje[2] = AF1;
            vakje[3] = Brink;
....
..
}

void Clearlopen()
{
       for (int i = 0; i <40; i++)
       vakje[i].BackColor = Color.Blue;
}

 private void btnRoll_Click(object sender, EventArgs e)
        {
            Clearlopen();
            Random RND = new Random();
            dice = RND.Next(1, 7);
            txtRoll.Text = (dice.ToString());
           
            locPlayer1 += dice;
            if (locPlayer1 > 39)
            {
                locPlayer1 -= 40;
            }
           
            txtlocPlayer1.Text = locPlayer1.ToString();


Geeft nu nog steeds een error op de lijn:
C#:
1
vakje[i].BackColor = Color.Blue;

?

[ Voor 1% gewijzigd door Verwijderd op 12-11-2014 15:10 . Reden: typfout ]


  • GBCHEATER
  • Registratie: Juni 2003
  • Laatst online: 17-09-2024
Ik zie nu dat je de tekst hebt aangepast.. Maar wat is de foutmelding op regel

code:
1
vakje[i].BackColor = Color.Blue;

[ Voor 46% gewijzigd door GBCHEATER op 12-11-2014 15:11 ]


Verwijderd

Topicstarter
GBCHEATER schreef op woensdag 12 november 2014 @ 15:10:
Maar in MaakArray staat nu toch nog steeds vakjes en je spreekt ze nog steeds aan met Label\[0] ipv vakje\[0].

Wat is de foutmelding op regel

code:
1
vakje[i].BackColor = Color.Blue;
klopt, sorry, te snel gepost, in de code had ik het wel al aangepast (net zoals dat ik overigens van Label[] vakje[] had gemaakt.

De foutmelding die ik krijg is: NullReferenceException was Unhandled. Object reference not set to an instance of an object.

  • GBCHEATER
  • Registratie: Juni 2003
  • Laatst online: 17-09-2024
Waar roep je MaakArray() aan?

Verwijderd

Topicstarter
Ah, daar zat het probleem. Ik heb deze erbij gezet, hij wordt nu aangeroepen!

Ik ben me ervan bewust dat deze manier problemen op gaat leveren zodra er meerdere spelers zijn, maar mijn insteek met monopolie maken is alle problemen een voor een te tackelen en zo de taal uit te vogelen!

Bij deze dus heel erg bedankt voor de hulp, het hoe en wat rond arrays is mij een stuk duidelijker geworden!
Nu eens nadenken over de volgende problemen!

Mvg,
Robbert

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ga je dan weer even onder je originele account verder? ;)
(Check je mail over een paar minuten; ik ga even wat knopjes indrukken :P )

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.