Geachte programmeurs,
In 704 posts van hoofdzakelijk mensen helpen, heb ik 3 topics zelf gemaakt: geachte redactie posts. Het is helaas op dit moment zo dat ik nu toch om hulp moet vragen.
Situatieschets:
BI student die, hoewel ondertussen redelijk vaardig in databases/VB.net koppelingen, en volgens mij zelf, niet zo'n ontzettend ei. Het lot wil echter: het is vakantie, en in de vakantie; wil ik wat "verder" gaan met wat ik al weet. Ideaal hiervoor leek mij een "simpel" spelletje, in de vorm van mijnenveger. Besloten is besloten (ik had ook voor een supersimpele als zeeslag kunnen gaan, maar ons bent nou eenmaal koppig, zoals de Friezen zeggen), ik had ook voor Zeeslag of Stratego kunnen gaan, maar goed, mijnenveger it is, en ambitie is er ook. Mijn hobby "koppel overal databases aan vast" moet er in komen, in de vorm van een high-score, en eventueel ook een profielen/achievement systeem. Alsof men mijnenveger zo wil spelen.
Enfin, vol goede moed wat geschetst en bedacht (niks geen UML activity diagrams of PSD's gemaakt, dat doe ik wel voor school opdrachten), en aan het coderen geslagen.
De keuze is gevallen op 2D arrays (met een duidelijke X/Y locatie, en input in de vorm van aantal mijnen, breedte en hoogte), en zo veel mogelijk "simpele" code die ik eventueel later aan beginners kan uitleggen, die het per deelprobleem aan gaan pakken. Vandaar dat vooral de "spawn nummers naast mijnen" code een gedrocht is, en een verdeling in deelproblemen:
1. Maak een knoppen-array (jaja, elementen en handlers via code leren ze ons ook niet meer tegenwoordig op het HBO, alles maar op de designer slepen, en hooguit aanpassen via code).
1.2 Maak een schaduw array voor de knoppen array (als string), met een "." voor niet-mijnen, en "#" voor mijnen
1.3 Tijdelijke schaduw-array waar de nummers die er rond mijnen zitten neergekwakt worden (als integer).
1.4 "Merge" de arrays in een derde string-array, met weergave prioriteiten: 1. Mijnen; 2. Nummers; 3. "lege vakken als ".".
1.5 maak een schaduw array die knop-statussen weergeeft; 0 voor "ingedrukt", 1 voor "niet ingedrukt", en 2 voor "vlaggetje"
2. Handler rechts klikken:
2.1 Als statuswaarde van dat vak 2 is, maak het 1 en werk de knop bij (op dit moment: naar gewoon)
2.2 Als statuswaarde van dat vak 1 is, maak het 2 en werk de knop bij (op dit moment: naar groen)
3. Handler links klikken (alles op voorwaarde dat de statuswaarde van die knop 1 is):
3.1 Als er een "#" in de merge-array staat op dat vak: Game over, laat mijnen zien (als rood)
3.2 Als er een "nummer" staat in de merge-array (test door boolean als een CInt lukt in een try..catch) > open alleen DAT vak, en laat het nummer zien.
3.3 Als er een "." in de merge-array staat op dat vak: open alle aanliggende lege vakken, en hun aanliggende nummervakken.
En bij punt 3.3 zit het probleem: hij controleert de nummers die naast het geklikte vak liggen, geeft al die nummers weer, maakt het vak zelf leeg, maar ik heb geen flauw idee wat te doen om de rest van het "vlak" ook leeg te maken.
Dingen die ik geprobeerd heb:
1. Bepaal hoe ver omhoog/omlaag tot het volgende nummer
1.1. Van hoog naar laag: bepaal hoe ver links, hoe ver rechts, en open die vakken
Dat was een "stapje", maar het probleem verscheen bij vormen die een uitstulping hebben, zoals dit:
Het algoritme zou werken voor alle vakjes, behalve het tweede hekje rechtsboven. En dat moeten we niet hebben.
Ik heb nu ongeveer 2 dagen lopen klooien met dit projectje, en op een paar stukken code van anderen na die niet helemaal combineren met mijn stuk (als in: geen idee hoe het er in te knopen, die gasten werken compleet anders), en mijn conclusie is: een BI-er met slechts basis programmeer ervaring lukt dit niet. Ik denk te bedrijfskundig, om het zo te zeggen, en mijn programmeersel is nou ook niet zo... "systematisch", om het netjes te zeggen.
In ieder geval; ik vroeg me af of er hier mensen waren die mij hier mee zouden kunnen helpen. Voor de liefhebbers: plaats relevante code, geen complete projecten
Relevante code. MMMkay, ik ben hier absoluut niet goed in, maar het volgende is het geval: de "klik" functie heeft het volgende:
'tot daar ben ik gekomen; niet verder. Ik weet wat de naastliggende vakken zijn, maar het punt is: hoe laat ik hem dit allemaal herhalen (gok zo: boolean, met een do .. until boolean = waar, maar hoe bepalen of die boolean waar is?), door dezelfde code nog een keer uit te voeren op nóg een ander leeg vak, maar NIET op lege vakken die niet "bereikbaar" zijn voor het huidige lege vak?
Het project staat vol debug code, (als in: 3 rich text fields waar ik arrays op pomp, en het is nog in windows forms in plaats van het uiteindelijke WPF, en de DB-link/score is ook nog niet verwerkt). Voor mensen die geen VS2010 hebben (en dus gezeur over het feit dat het met een nieuwere versie is gemaakt): alle code staat in Form1.vb, en zou ook in VB2005 of hoger moeten werken, zolang het form maar de volgende elementen heeft:
1. Een auto-sizing panel genaamd grpButtongrid
2. Een label genaamt lblOutput
3. Drie richtext boxes (met een monotype font) genaamd txtUitvoer, txtNumbers, txtCompilatie, allen in staat om dat monotype in een grid van 20*20 tekens weer te geven
4. Een knop genaamd "button1" die als new game knop functioneert.
5. Een numbericUp/Down genaamd nmbrNumberofMines met als minimumwaarde 1, maximumwaarde 100.
6. Twee numbericUp/Down elementen genaamd nmbrWidth en nmbrHeight; beiden met een bodemgrens van 5, en bovengrens van 20.
Bij voorbaat bedankt voor de hulp, en mijn excuses voor de lang uitgevallen startpost.
In 704 posts van hoofdzakelijk mensen helpen, heb ik 3 topics zelf gemaakt: geachte redactie posts. Het is helaas op dit moment zo dat ik nu toch om hulp moet vragen.
Situatieschets:
BI student die, hoewel ondertussen redelijk vaardig in databases/VB.net koppelingen, en volgens mij zelf, niet zo'n ontzettend ei. Het lot wil echter: het is vakantie, en in de vakantie; wil ik wat "verder" gaan met wat ik al weet. Ideaal hiervoor leek mij een "simpel" spelletje, in de vorm van mijnenveger. Besloten is besloten (ik had ook voor een supersimpele als zeeslag kunnen gaan, maar ons bent nou eenmaal koppig, zoals de Friezen zeggen), ik had ook voor Zeeslag of Stratego kunnen gaan, maar goed, mijnenveger it is, en ambitie is er ook. Mijn hobby "koppel overal databases aan vast" moet er in komen, in de vorm van een high-score, en eventueel ook een profielen/achievement systeem. Alsof men mijnenveger zo wil spelen.
Enfin, vol goede moed wat geschetst en bedacht (niks geen UML activity diagrams of PSD's gemaakt, dat doe ik wel voor school opdrachten), en aan het coderen geslagen.
De keuze is gevallen op 2D arrays (met een duidelijke X/Y locatie, en input in de vorm van aantal mijnen, breedte en hoogte), en zo veel mogelijk "simpele" code die ik eventueel later aan beginners kan uitleggen, die het per deelprobleem aan gaan pakken. Vandaar dat vooral de "spawn nummers naast mijnen" code een gedrocht is, en een verdeling in deelproblemen:
1. Maak een knoppen-array (jaja, elementen en handlers via code leren ze ons ook niet meer tegenwoordig op het HBO, alles maar op de designer slepen, en hooguit aanpassen via code).
1.2 Maak een schaduw array voor de knoppen array (als string), met een "." voor niet-mijnen, en "#" voor mijnen
1.3 Tijdelijke schaduw-array waar de nummers die er rond mijnen zitten neergekwakt worden (als integer).
1.4 "Merge" de arrays in een derde string-array, met weergave prioriteiten: 1. Mijnen; 2. Nummers; 3. "lege vakken als ".".
1.5 maak een schaduw array die knop-statussen weergeeft; 0 voor "ingedrukt", 1 voor "niet ingedrukt", en 2 voor "vlaggetje"
2. Handler rechts klikken:
2.1 Als statuswaarde van dat vak 2 is, maak het 1 en werk de knop bij (op dit moment: naar gewoon)
2.2 Als statuswaarde van dat vak 1 is, maak het 2 en werk de knop bij (op dit moment: naar groen)
3. Handler links klikken (alles op voorwaarde dat de statuswaarde van die knop 1 is):
3.1 Als er een "#" in de merge-array staat op dat vak: Game over, laat mijnen zien (als rood)
3.2 Als er een "nummer" staat in de merge-array (test door boolean als een CInt lukt in een try..catch) > open alleen DAT vak, en laat het nummer zien.
3.3 Als er een "." in de merge-array staat op dat vak: open alle aanliggende lege vakken, en hun aanliggende nummervakken.
En bij punt 3.3 zit het probleem: hij controleert de nummers die naast het geklikte vak liggen, geeft al die nummers weer, maakt het vak zelf leeg, maar ik heb geen flauw idee wat te doen om de rest van het "vlak" ook leeg te maken.
Dingen die ik geprobeerd heb:
1. Bepaal hoe ver omhoog/omlaag tot het volgende nummer
1.1. Van hoog naar laag: bepaal hoe ver links, hoe ver rechts, en open die vakken
Dat was een "stapje", maar het probleem verscheen bij vormen die een uitstulping hebben, zoals dit:
code:
1
2
3
4
| ...#...#.. ..######.. ########## .....###.. |
Het algoritme zou werken voor alle vakjes, behalve het tweede hekje rechtsboven. En dat moeten we niet hebben.
Ik heb nu ongeveer 2 dagen lopen klooien met dit projectje, en op een paar stukken code van anderen na die niet helemaal combineren met mijn stuk (als in: geen idee hoe het er in te knopen, die gasten werken compleet anders), en mijn conclusie is: een BI-er met slechts basis programmeer ervaring lukt dit niet. Ik denk te bedrijfskundig, om het zo te zeggen, en mijn programmeersel is nou ook niet zo... "systematisch", om het netjes te zeggen.
In ieder geval; ik vroeg me af of er hier mensen waren die mij hier mee zouden kunnen helpen. Voor de liefhebbers: plaats relevante code, geen complete projecten
Relevante code. MMMkay, ik ben hier absoluut niet goed in, maar het volgende is het geval: de "klik" functie heeft het volgende:
Visual Basic .NET:
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
| If e.Button = MouseButtons.Left Then .. 'De code trekt de "tag" uit de button properties, die weergegeven is in de vorm "X:Y". Dit wordt door een parsertje verwerkt naar 2 absolute integers: AnalyzeBEFORE, AnalyzeAFTER. 'Via een If-je: If strSuperarray(intTagAnalyzeBEFORE, intTagAnalyzeAFTER) = "." Then '(strSuperArray is de array waar alle waarden instaan, "." is een lege knop, door de before/after als coördinaten in te voeren) leegtevak(intTagAnalyzeBEFORE, intTagAnalyzeAFTER) 'roep ik de sub aan die de actie moet gaan uithalen. De aanliggende nummers weergeven, de knop uitzetten, en de nummers weergeven in de knoppen naast een mijn werkt. Wat niet werkt is de rest van het vak openen, en ik heb geen idee hoe ik dat moet doen!: Do If strSuperarray(horizontal, vertical) = "." Then 'als er op een leeg vak gedrukt wordt; Call staatereengetal(horizontal - 1, vertical + 1) 'ne blnNE = blnIsgetal If blnN = True Then Try aButton(horizontal - 1, vertical).Enabled = False aButton(horizontal - 1, vertical).Text = strSuperarray(horizontal - 1, vertical) intInputFilter(horizontal - 1, vertical) = 0 Catch End Try End If 'over codegedrochten gesproken: Staatereengetal is een sub die checkt of er in een vak met ingegeven coördinaten een getal staat, en een true/false boolean uitgeeft. Ik heb dus 8 booleans, voor alle aanliggende vakken één. Nadat ik alle 8 booleans bepaald heb, voer ik dmv. een if-statement code uit die de vakken opent als er een omringend nummer is. |
'tot daar ben ik gekomen; niet verder. Ik weet wat de naastliggende vakken zijn, maar het punt is: hoe laat ik hem dit allemaal herhalen (gok zo: boolean, met een do .. until boolean = waar, maar hoe bepalen of die boolean waar is?), door dezelfde code nog een keer uit te voeren op nóg een ander leeg vak, maar NIET op lege vakken die niet "bereikbaar" zijn voor het huidige lege vak?
Het project staat vol debug code, (als in: 3 rich text fields waar ik arrays op pomp, en het is nog in windows forms in plaats van het uiteindelijke WPF, en de DB-link/score is ook nog niet verwerkt). Voor mensen die geen VS2010 hebben (en dus gezeur over het feit dat het met een nieuwere versie is gemaakt): alle code staat in Form1.vb, en zou ook in VB2005 of hoger moeten werken, zolang het form maar de volgende elementen heeft:
1. Een auto-sizing panel genaamd grpButtongrid
2. Een label genaamt lblOutput
3. Drie richtext boxes (met een monotype font) genaamd txtUitvoer, txtNumbers, txtCompilatie, allen in staat om dat monotype in een grid van 20*20 tekens weer te geven
4. Een knop genaamd "button1" die als new game knop functioneert.
5. Een numbericUp/Down genaamd nmbrNumberofMines met als minimumwaarde 1, maximumwaarde 100.
6. Twee numbericUp/Down elementen genaamd nmbrWidth en nmbrHeight; beiden met een bodemgrens van 5, en bovengrens van 20.
Bij voorbaat bedankt voor de hulp, en mijn excuses voor de lang uitgevallen startpost.
[ Voor 18% gewijzigd door RobIII op 23-02-2010 22:38 ]