Slot machine Project hulp/tips gevraagd

Status
Niet open voor verdere reacties.
Ik heb het geprobeerd en dit is eruit gekomen. maar hij blijft in het begin meteen hangen in een infinite loop, hij maakt een object aan
Code:
Rolls roll1 = new Rolls();
dan gaat ie naar class Rolls, leest een paar variabelen en zodra hij bij de contructor komt gaat hij weer terug naar

Code:
Rolls roll1 = new Rolls();

enig idee wat ik fout doe?
trouwens terzijde, heel erg bedankt voor je hulp en tijd :)

edit :
contructor :
Code:
Public Rolls()
{

}
 
Laatst bewerkt:
Ik zal even kijken. moment ik edit zometeen deze post.

**EDIT 1**

heh m`n visual studio crashte er zelfs van :D.

Eerste fout:

public class Rolls is een Los object, niet 1 van het type Form1 (verander Rolls : Form1 naar simpeleweg Rolls )

De infinite loop wordt waarschijnlijk veroorzaakt door het volgende:

Code verloop:

1. Er wordt een nieuwe Form1 aangemaakt.
2. Binnen Form1 wordt een nieuw object Rolls aangemaakt.
3. Aangezien Rolls van het type Form1 is, wordt de code dat in Form1 staat ook uitgevoerd ---> ga dus weer naar 1 en hier is je infi loop


**EDIT 2**

om bij je form variabelen te komen, kan je een referentie naar de form meesturen:

[cpp]

public class Roll
{
private Form1 form;

public Roll(Form1 formReference)
{

this.form = formReference;
}

public void DoSomething()
{


Console.WriteLine("Haal waarde op uit Form1");
string valueFromForm1 = this.form.TestValue;
Console.WriteLine("TestValue from form1 = {0}", valueForm1);

}

}


public class Form1 : Form
{

private Roll rol1;
private Roll rol2;
private Roll rol3;

//maak een propertie TestValue (propertie ziet eruit als bijv: Button b = new Button(); b.Location = new Point(1,1,);
// b.Location = een property
// <----- Link voor properties : http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx ----->
public String TestValue
{
get;
set;
}

public Form1()
{
//this stuurd (zoals het al zegt) een referentie van zichzelf mee.
rol1 = new Roll(this);
rol2 = new Roll(this);
rol3 = new Roll(this);

Test();
}

private void Test()
{
//roep de methode in de class Roll DoSomething aan
rol1.DoDomething();

}
}

[/cpp]
 
Laatst bewerkt:
Eerste fout:

public class Rolls is een Los object, niet 1 van het type Form1 (verander Rolls : Form1 naar simpeleweg Rolls )
Als ik dat doe zijn alle pictureboxen, timers etc niet meer bereikbaar vanaf Rolls

De infinite loop wordt waarschijnlijk veroorzaakt door het volgende:

Code verloop:

1. Er wordt een nieuwe Form1 aangemaakt.
2. Binnen Form1 wordt een nieuw object Rolls aangemaakt.
3. Aangezien Rolls van het type Form1 is, wordt de code dat in Form1 staat ook uitgevoerd ---> ga dus weer naar 1 en hier is je infi loop
Ik heb een ander klein OO projectje gepakt en als ik daar precies hetzelfde deed werkte het wel. hij maakte een object, ging naar de class, leest de lege contructor en gaat vervolgens verder in de main. dit was een console project.
 
Ik ben hem even snel aan het herschrijven om te laten zien wat ik bedoel met jou code.

**EDIT**

Het is wel erg veel werk om het te herschrijven. Misschien is het het beste om overnieuw te beginnen. Het nadeel namelijk is dat je veel drag en drop dingen erin gedaan hebt.
Als je het OOP wil doen, moet je denken wat herhaald wordt en dus herbruikbaar is. Verder moet je nadenken over de verantwoordelijkheden.
Moet de Form1 de timer bijhouden of kan de Roll dat zelf ?
Als je de form het laat bijhouden, houdt dit in dat je handmatig per rol, een timer moet defineren. Laat je het de Roll class doen, hoef je eenmalig een timer te defineren in de roll-class.

denk hierbij aan het volgende:

- Timer
- PictureBoxes
* hoeveel picture boxes heb je nodig ? per image 1 of zijn 3 er genoeg per rol aangezien dit de enige zichtbare zijn
- Images
- De code om de rol te laten bewegen (snelheid is hierbij de enige variabel, dit kan je dus instelbaar maken)

Misschien is het handig om eerst met iets makkelijks te beginnen om het OOP wat beter onder de knieen te krijgen.
Mijn eerste OOP project was het spelletje Pong. Hiermee kan je leuk de basis van het OOP leren.

de opdracht was zoiets (hierin zitten has-a en is-a relaties) :
- Een speler heeft een paddle en houdt de score bij.
- maak 2 paddles (zo`n balkje) van het type Button
- Maak een bewegende bal van het type RadioButton.
- dit alles wordt weergeven op een form.

Als je wilt kan je dat eerst doen en wil ik je daar ook wel mee helpen.
 
Laatst bewerkt:
Het is inderdaad veel werk en zeer verwarrend, ik ga morgen van scratch beginnen en kijken hoe het gaat, maar ik ken mezelf... het wordt toch weer stukken code kopieren / plakken want alles opnieuw maken is teveel werk gewoon. eerst een plan maken en goed bedenken welke classes / methods / objecten ik nodig heb.
Ook ga ik even uitleg vragen over inheritence want dat zit er nog niet helemaal in bij mij.

Op school heb ik een paar OOP projectjes gemaakt maar dat was alleen in Console, een stuk makkelijker dan form projecten.
Ik geef morgen weer een update hoe het gaat ;)

update : het gaat de goede kant op denk ik, probleem is nog steeds dat ik form elementen niet kan bereiken via andere class. Hierdoor kom ik niet verder, nog even googlelen naar een oplossing ;)

update 2 : oke ik heb een goede manier gevonden :D
Code:
Roll roll1 = new Roll(1, 25); // 1 staat voor welke roll het is, 25 staat voor spinnerSpeed
Roll roll1 = new Roll(2, 15);
Roll roll1 = new Roll(2, 5);

roll1.makeRoll(picBox11, picBox12, picBox13, picBox14);
roll2.makeRoll(picBox21, picBox22, picBox23, picBox24);
roll3.makeRoll(picBox31, picBox32, picBox33, picBox34);
Code:
class Rolls
{
    public void makeRoll(picBox1, picBox2, picBox3, picBox4)
   {
            picBoxCollection[0] = picBox1;
            picBoxCollection[1] = picBox2;
            picBoxCollection[2] = picBox3;
            picBoxCollection[3] = picBox4;
   }
}

nu hoef ik de laatste 4 regels maar 1 x te schrijven ipv 3 x :)
 
Laatst bewerkt:
Kijk dan gaat het de goede kant op =)

om je Form variabelen trouwens te benaderen kan je een referentie van zichzelf mee sturen (Roll x = new Roll(this)). dit heb ik hierboven gedemonstreerd dacht ik.
Verder zul je wel problemen krijgen met het benaderen van je drag-en-drop elementen aangezien die standaard op private/protected staan dacht ik (dit is wel in te stellen bij de properties).
Dit is een van de redenen waarom ik geen fan van drag-en-drop ben :)
 
Gaat inderdaad goed :) Hier zijn de project files.

het is me zowaar gelukt om het om te zetten naar OO, logisch nagedacht en kijken welke variabelen ik in welke class nodig had etc. de code zal niet 100% efficient zijn en het zal me niks verbazen als er structuur fouten in zitten maar het werkt ;).
er zitten nog een paar kleine foutjes in (onderste 2 plaatjes van rechtse spinner doet raar). en moet nog een oplossing vinden om de spinners om de beurt te laten stoppen, ik denk dat ik dan toch 3 timers moet hebben (1 voor elke timer).

drag 'n drop is niet echt het leukste om te doen... moest ook veel stukjes code erbij schrijven of bepaalde onderdelen verplaatsen. ook omdat ik nu maar 1x code gebruik ipv 3x dezelfde.

heb ook weer een 'OOOOH daar is dat dus goed voor' moment gehad toen ik met propperties aan de gang ging, altijd leuk :p
 
Laatst bewerkt:
Ziet er idd een stuk beter uit =)

Voor je probleem kan je het volgende doen:

Thread of timer aanmaken en dan vervolgens in je Roll class een update methode maken. Deze update zorgt voor de beweging van de roll.
Wanneer er een pull gedaan wordt, kan je bijvoorbeeld een random waarde in de desbetreffende roll classes zetten (roll1.SetRandomStopValue ofzo), waarvan de update methode gebruik maakt.
Als dan de treshold van de "stop" bereikt wordt kan dit afgevagen worden en wordt de rolbeweging getaakt todat er een nieuwe waarde in de setrandomvalue gezet wordt

bijv:

Code:
if(currentValue != randomValue)
{
   ///voer rolbeweging uit.
   currentValue += andereWaarde;
}

Verder is er denk ik nog wel ruimte voor verbetering in makeRoll (kan het mis hebben aangezien ik er vluchtig overheen gelezen heb).
Je zou die switch denk ik wel weg kunnen werken en dat generieker maken.

Tot slot, je hebt nu resources gebruikt alleen moet je nu wel de kracht van de resources gebruiken.

ipv Image i = Image.FromFile(@"path/to/file/plaatje.png");
kan nu: Image i = Resources.plaatje;

Het is niet erg van belang lijkt me dat de plaatjes in een andere volgorde per roll gemaakt worden lijkt me ?
 
Dedankt voor de tip, zal het morgen proberen (te laat nu :p).

Over die resources zat ik laatst ook nog te denken, had het nog even snel opgezocht maar niks gevonden, dus bedankt dat je het zegt:D.

En ja, het is erg belangrijk dat elke rol een andere volgorde heeft. Want stel je hebt 3x BAR op een rij. dan heb je ook meteen 3 keer 3 andere plaatjes op een rij.
Ik snap wel dat je vind dat het korter kan maar heb nog niet iets kunnen bedenken.

Wat ik me nu ook bedenk, makeRoll wordt nu elke keer uitgevoerd als je op 'pull' klikt. dat is niet nodig. Die hele method kan 1 keer worden uitgevoerd in form_load o.i.d en dan de variabelen rollStartPos aan elke roll object geven.

edit : morgen ook nog iets anders voor startpositie maken, waarschijnlijk iets dat hij het plaatje wat er standaard staat gebruikt.

het Probleem dat de 2 onderste plaatjes van roll3 raar doen opgelost

Code:
for (int i = 0; i <= 4; i++) // 4 stond eerst op 2
{
     rollStartPos[i] = i;
}

typfoutje denk ik:eek:
 
Laatst bewerkt:
In principe kun je natuurlijk wel de plaatjes gewoon in een standaard volgorde in een lijst zetten. Vervolgens de lijstvolgorde aanpassen voordat je het plaatje compileerd.

Ik zou bijvoorbeeld ook een klasse "roll" maken. In je huidige rolls klasse heb je toch weer 3 afzonderlijke items in 1 klasse gepakt. Netter zou zijn om een "rolls / rollscollectie" class te hebben met daarin 3x een "roll" klasse ding vang je automatisch dingen als iedere keer je collectie aanmaken meteen af. Dat is echter iets voor een volgende keer misschien :)

Qua timing kun je ook een totale rolduur stellen. Je kunt dan aan de hand van het verwachte eindpunt uitrekenenen hoe snel en hoeveel updates elke roll moet krijgen. De voorgestelde threads zijn ook een goed idee. Maar indien je met threading aan de gang gaat zou ik ook de output en de updates naar het hoofdformulier vanuit de thread pushen. Dit is echter niet zo heel eenvoudig.
 
Ik heb een raar probleem : heb me harde schijf leeg gemaakt en frisse windows 7 erop. als ik nu naar me slotmachine project kijk is alles verpest :p als ik hem laat draaien dan komen er allemaal zwarte strepen tussen de plaatjes, de plaatjes zelf zijn ook verschoven of groter geworden.

ik kan wel alles aanpassen zodat het er weer goed uit ziet maar dan lost ik niet het probleem op. (tenzij de opmaak gewoon reset is)

videokaart driver is geïnstalleerd, .NET 4 en visual C# zijn geïnstalleerd.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan