Slot machine Project hulp/tips gevraagd

Status
Niet open voor verdere reacties.

joost54

Gebruiker
Lid geworden
5 okt 2011
Berichten
21
Beste mensen,

Ik ben bezig met een projectje (just for fun) en dat is een slot machine, zitten al en aantal dingen in zoals winkans die in te stellen is (1-100%). 3 textboxen die dus een 'plaatje' moeten voorstellen : BAR BAR GRAPE.

nu heb ik al in me hoofd zitten hoe ik bepaalde elementen zou kunnen maken en ik zit vooral bij de volgende dingen te twijfelen hoe ik het moet doen;

spinnen van de 3 rollen effect : zoals je weet zitten er 3 rollen in een slot machine met daarom plaatjes, als je er 3 naast elkaar hebt krijg je de bijbehorende punten daarvoor.
het eerste idee was om een image te hebben met alle plaatjes erop verticaal onder elkaar, als ik deze dan in mijn programma laat scrollen heb ik het effect al. probleem hiermee is dat ik dan een manier moet vinden om het juiste plaatje te 'detecteren'.

en een iets simpeler probleem, ik moet een soort hendel realiseren maar het enige wat ik kan verzinnen is een button aanmaken, die een achtergrond geven van een hendel die omhoog staat, dan als je klikt verandert de achtergrond naar een geanimeerde hendel die omlaag gaat, en dan verandert het plaatje naar een hendel die omlaag staat. same voor omhoog.
tenzei je een animatie van een .gif bijv. die als achtergrond is voor button kan pauzeren is dat denk ik de enige oplossing.

ohja en nog iets wat waarschijnlijk ik gewoon niet weet maar vrij simpel is op te lossen : ik heb Form1.cs en Rolls.cs.
Rolls.cs overerft van Form1.cs.
in Form1.cs heb ik een protected bool staan
Code:
protected bool win;
, die bool heb ik in Rolls class op true gezet
Code:
public void Win()
        {
            win = true;
                           // base.win = true; werkt ook niet
            this.picked = TrippleCombo[r.Next(0, 8)];

        }
alleen als de code deze method heeft gedaan en hij gaat terug naar Form1.cs dan is de bool 'win' niet veranderd.
Ik zou graag wat tips/ideeen/etc willen over deze 2 dingen:)

discaimer : ben sinds kort pas met OOP begonnen dus newb fouten inbegrepen:)
 
Laatst bewerkt:
Ik ken C# niet maar zitten de bool win en de functie Win elkaar niet in de weg ondanks dat de functie een void is?
 
Nee, de bool Win is met een hoofdletter en de method win niet

ik heb een beetje zitten klooien en ik ben er met breakpoints achter gekomen dat win false wordt zodra Win() is uitgevoerd en de code terug in Form1.cs is. er gaat dus iets mis met polymorphisme en inheritence maar ik kom er nog niet uit
 
Laatst bewerkt:
"win" stel je nu in voor lokaal gebruik in je eigen class. afhankelijk hoe je het gedefinieerd hebt werkt this.win=true mogelijk wel, maar kan ik vanaf hier niet garanderen :p

Qua graphics is er veel mogelijk. Er zijn ook vele trucs die je kunt gebruiken om zoiets aan te sturen. Het is echt onmogelijk om hier alle mogelijkheden te benoemen, maar de gesuggereerde GIF voor de arm is een optie. Je kunt ook de "click" op het form zelf afvangen zonder er een button onder te doen. Als er op de locatie van de arm wordt geclicked speel je de animatie en laat de rollen draaien. Een geavanceerdere techniek, die vaak voor volledig grafische forms gebruikt wordt, is een "click-map". Hierbij kun je button-clicks makkelijk ophalen bij zeer complexe vormen. Voor je eigen gebruik is een gewone rechthoek waarschijnlijk voldoende.

Een verticale image is inderdaad de meest handige manier om de wielen te animeren. Ik snap alleen je verwachte probleem niet helemaal. Zolang alle deel-plaatjes dezelfde hoogte hebben kun je altijd het juiste deel tonen door hoogte x plaatjes-nummer te nemen.

Stel je hebt een kolom van 5 plaatjes, ieder 20 pixels hoog. Als je plaatje "3" wil tonen pak je pixels 41-60. Plaatje 1 is pixels 1-20, etc.
 
@wapier, Jou idee voor de rollen is iets anders dan die van mij maar jou idee is waarschijnlijk beter. ik had in gedachte om 1 plaatje met alle plaatjes erop onder elkaar en dat ene plaatje verticaal laten scrollen. in ieder geval, ik ga ermee aan de slag en laat het wel weten ;)
 
Jouw idee kan ook hoor, uiteindelijk komt het op hetzelfde neer, zolang je in je hoofd hebt dat je een resource hebt waar je vrij in kan knippen en plakken.
 
Ik heb een makkelijk te maken idee bedacht voor een mooi en controleerbaar spin systeem.
ik ga het niet helemaal uitleggen dus hier een illustratie (excel ftw) :

2chapog.png

edit : zat een fout in plaatje

Elke PicBox is 165x165 pixels

edit : pff maak domme fouten, grijze gebied in tekening moet je even wegdenken want dat hoort er niet in. de hele tekening is 1 spinner in alle 8 fasen.
elke keer als er 4 pictureboxen omhoog 'schieten' verschuift elk plaatje 2 pictureboxen naar beneden. als dit in een mooie snelheid gaat denk (met nadruk op denk!!) ik dat het er mooi uitziet.

voor afwerking kan ik nog een soort schaduw of ronding effect op de bovenste en onderste pictureboxen maken zodat het echt lijkt of dat ze rond zijn.
 
Laatst bewerkt:
na een tijdje klooien en knutselen is het idee wat ik had gelukt :)

je kan hier de .exe downloaden als je geintereseerd bent.

zoals je kunt zien (of niet) gaat de linkse spinner het snelst en de rechtse het sloomst. omdat de linkse een stuk sneller gaat 'flikkert' hij nogal, ik weet het probleem maar nog niet de oplossing.

het probleem zit als volgt : er is een teller int voor elke spinner, bij elke tick van de timer wordt er 9 (9 voor de eerste spinner, 7 voor de tweede spinner, 5 voor de derde spinner) bij de teller opgeteld. alle timer hebben een interval van 1.
alle pictureboxen worden omhoog gezet als de teller op 165 staat. ( 165 staat voor het aantal pixels dat alle textboxen van 1 spinner naar beneden moeten )

ik zet dus steeds 9 erbij, dat betekent dat als de teller na een tijd op 162 staat, komt er 9 bij en staat hij op 171.

dit alles betekent dat de pictureboxen niet de volle 165 pixels naar beneden gaan en dus dat flikkerent effect geeft.
de derde spinner heeft hier geen last van omdat er steeds 5 bijkomt, dat komt excact uit op 165 en vanaf daar start de loop weer opnieuw.

mogenlijke oplossingen : een snellere timer of een makkelijker getal nemen dan 165 (bijv. 200 want 200 is door veel meer getallen deelbaar. dan kan ik 5, 10, 20 gebruiken bijvoorbeeld)

ja lang verhaal maar anders snapt niemand het, het zit allemaal in me hoofd maar alles uitleggen is lastig :p ik hoop dat ik zo het probleem een beetje goed uitgelegd heb.
 
Laatst bewerkt:
Ik krijg een:

System.IO.FileNotFoundException: C:\Users\Joost\Documents\Visual Studio 2010\Projects\OO programmeren\SlotMachine\apple.png
 
oh ja, vergeten de plaatjes mee te sturen -.-

Klik!

btw : path is ook veranderd dus zolang de map 'plaatjes' en de .exe in dezelfde map staan werkt het.
 
Laatst bewerkt:
In jouw geval is het beter om afbeeldingen en andere externe resources te embedden in je programma met behulp van My.Resources en de Resource editor.
 
Hoe kan ik uitlezen welke image in een imagebox staat? bijv. dat ik de naam van de image krijg o.i.d om images van elkaar te onderscheiden.
 
Ik heb ook nog even gekeken aangezien ik het wel een leuk idee vond om mee te stoeien.

Ik heb het draaien van de slots op een andere manier gedaan door simpelweg 1 plaatje te gebruiken en die op een Panel te tekenen.
(om je plaatjes om te zetten naar 1 afbeelding (alles onder elkaar) : http://dl.dropbox.com/u/3380837/ConsoleApplication4.rar )


de applicatie zelf: http://dl.dropbox.com/u/3380837/SlotMachine.rar

Misschien geeft het je wat ideeen / inspiratie maar wees gewaarschuwd. Ik heb het snel gemaakt (in een 1.5 uur ofzo gemaakt). Je zei dat je bezig was om OOP te oefenen dan kan ik je aanraden deze code niet 1 op 1 te gebruiken aangezien het kwa OO niet super netjes in elkaar zit. Verder zitten er nog wat foutjes in (eerste plaatje wordt niet getoond).

Verder wens ik je succes met je project =)
 
Ziet er goed uit! kan helaas de code niet bekijken (in VB?) want VB staat niet op me pc (kijk vanavond wel als ik tijd heb;)) ben erg geïnteresseerd hoe je het met 1 picturebox hebt gedaan, dus dat vindt ik vanavond wel uit :thumb:.

het grootste probleem wat ik tegenkwam is dat ik geen form elementen (zoals picturebox etc) kan bereiken via een andere class. dus ik heb het hele spin systeem in Form1.cs moeten zetten.
Maar er komen nog een hoop dingen in die zoals punten tellen etc. wat ik wel in OO kan doen.

edit :Hier is de meest recente versie van mij voor de geïnteresseerde.
 
Laatst bewerkt:
Nee de code is gewoon c# vs2010.
raar dat je het dan niet kan openen, uiteindelijk gaat het om de code niet de exe :p probeer het anders nog eens vanavond.
Verder maak ik geen gebruik van pictureboxes.
Deze manier is gemaakt met behulp van een dubblebuffered panel waarop simpelweg een deel van een plaatje getekend wordt


**EDIT**
Ziet er goed uit :D ben benieuwd naar je code ^^
 
Laatst bewerkt:
Hier zijn alle project files als je de code wilt zien.

de 2 classen rolls en credits worden later gebruikt, ik wou het hele spinners gebeuren ook OO hebben maar ik zou niet weten hoe.:shocked:
 
Ah ok.

Met classen rolls en credits gaat het iig straks mis.

Wat je daar doet is het over laten erven van Form1.
Dit houdt dus effectief in, dat in de classes roll en credits, alle code staat was ook in Form1 staat + de code wat je daadwerkelijk in rolls en credits hebt staan.

de overerving: Roll : Form1 is dus feitelijk een toevoeging op reeds bestaande (eigengemaakt of in een library) classen en heeft een Is-a relatie.

http://en.wikipedia.org/wiki/Is-a <-- ook has-a relatie op te vinden. niet duidelijk ? google is your friend :D

Dit is dus fout aangezien het niet de bedoeling is dat je wat code toevoegt op een reeds bestaand iets. Wat jij wilt is een has-a relatie.
Dat is een losstaand onderdeel dat gebruikt kan worden in andere class.

Ma over je huidige code:

Om te herkennen wanneer je OOP kan gebruiken kan je de volgende vuistregel gebruiken :

-als je meerdere keren hetzelfde doet, maak er een method van of een class. Dit zal in de meeste gevallen kloppen, maar niet altijd.

ter indicatie:

jij doet in je form.cs het volgende :

[cpp]

int[] img1 = { 0, 0, 1, 2, 3 };
int[] img2 = { 0, 4, 5, 6, 7 };
int[] img3 = { 0, 7, 0, 1, 2 };

Image[] images1 = new Image[8];
Image[] images2 = new Image[8];
Image[] images3 = new Image[8];

static List<string> image_list_1 = new List<string>();
static List<string> image_list_2 = new List<string>();
static List<string> image_list_3 = new List<string>();

string[] test1 = { @"plaatjes\apple.png", @"plaatjes\cherry.png", @"plaatjes\melon.png", @"plaatjes\bar.png", @"plaatjes\berry.png", @"plaatjes\lemon.png", @"plaatjes\banana.png", @"plaatjes\orange.png" };
string[] test2 = { @"plaatjes\bar.png", @"plaatjes\orange.png", @"plaatjes\lemon.png", @"plaatjes\berry.png", @"plaatjes\banana.png", @"plaatjes\cherry.png", @"plaatjes\apple.png", @"plaatjes\melon.png" };
string[] test3 = { @"plaatjes\melon.png", @"plaatjes\bar.png", @"plaatjes\apple.png", @"plaatjes\orange.png", @"plaatjes\berry.png", @"plaatjes\lemon.png", @"plaatjes\banana.png", @"plaatjes\cherry.png" };

[/code]

je doet dus meerdere keren hetzelfde. Dit zie je dus ook terug in je code (copy in timer methods).

Als je hier een appart object van maakt dat bijv. een string van paths naar plaatjes, als constructor parameter accepteerd, scheeld het je al een hoop code.


Vragen zijn uiteraard altijd welkom =)
 
Met classen rolls en credits gaat het iig straks mis.

Wat je daar doet is het over laten erven van Form1.
Dit houdt dus effectief in, dat in de classes roll en credits, alle code staat was ook in Form1 staat + de code wat je daadwerkelijk in rolls en credits hebt staan.

Misschien heb ik het verkeerd begrepen maar mij is altijd verteld dat als class B van class A overerft betekent het dat class B alle protected variablen meekrijgt van class A maar niet de hele code zoals jij zei.

je doet dus meerdere keren hetzelfde. Dit zie je dus ook terug in je code (copy in timer methods).

Als je hier een appart object van maakt dat bijv. een string van paths naar plaatjes, als constructor parameter accepteerd, scheeld het je al een hoop code.

sorry maar ik snap niet helemaal wat je hiermee bedoeld, en dat ik meerdere keren dezelfde code gebruikt vindt ik ook maar niks maar variabelen zijn elke keer anders (bijv. spinner3Pixels, spinner2Pixels)

wat ik wel kan doen is de timer_tick events laten staan en daar een object maken naar bijbehorende class en ook alle parameters meegeven die nodig zijn. dan alle dingen die ik nodig heb in de code (zoals timers pictureboxen etc) op public zet in de properties window. Ik weet alleen niet of dit wel echt OO is, ben nog steeds aan het leren dus snap nog niet het hele concept :p.

edit : kreeg net een ingeving : gewoon 1 variabel gebruiken en die voor elk object gebruiken (lol soms denk ik niet goed na) probleem is wel dat sommige variablen andere waardes hebben. moet ook even kijken wat het meest logisch is om mee te sturen en wat ik private in de class kan laten.
 
Laatst bewerkt:
Dat was bij wijze van :)

Kan zijn dat ik het niet helemaal goed uitleg hoor, snap het wel allemaal alleen ik twijfel zelf over mijn didactisch vermogen :p

klopt idd wat jij zei alleen niet helemaal.


Als je een has-a relatie legt ( CustomButton : Button ) dan worden alle public en protected variabelen en methodes beschikbaar binnen de classe CustomButton.

Voorbeeld:

in je main classe (een lege Form1), ga ik 2 buttons plaatsten (is uit losse pols dus kan fouten bevatten is alleen ter ilustratitie van OOP). De eerste button is een standaard butten en de 2e een "eigen" button.


[cpp]


//dit is een is-a relatie ( custombutton is een button. dit houdt in dat alle functionaliteiten dat de button class heeft, ook gelden voor de CustomButton class)
public class CustomButton : Button
{
private string testString = "Private vars kunnen alleen benaderd worden uit de classe waarin de var staat";

//Constructor
public CustomButton()
{

}

public String GetTestText()
{
return testString;
}

}


public class Form1 : Form
{
//de standaard button die ook te vinden is bij tool --> sleur en pleur op een Form.
private Button frameworkButton;

//de eigengemaakte button.... dit is een has-a relatie aangezien Form1 een CustomButton heeft.
private CustomButton customButton;

public Form1()
{
//init van framework button en het "setten" van de properties.
frameworkButton = new Button();
frameworkButton.Location = new Point(50,50);
frameworkButton.Text = "standaard button";

this.Controls.Add(frameworkButton);

customButton = new CustomButton();
customButton.Location = new Point(100,100);
customButton.Text = "custom button";

this.Controls.Add(customButton);

string testText = customButton.GetTestText();

}

}

[/cpp]


zoals je kan zien, is de custombutton precies hetzelfde benaderbaar als de standaard button alleen heeft de customButton een toegevoegte methode die een string returned.



voor je 2e vraag:

De variabelen zijn idd hetzelfde alleen is het de bedoeling van OOP dat je functionaliteiten gaan encapsuleren.

De timer class doet elke keer precies hetzelfde truukje met het verschil dat de variabel iets anders is. Wat je dan kan doen is in een nieuw object deze functionaliteit neerzetten en in de constuctor een init waarde zetten.

dus bijv:

[cpp]

public class SpinThingy
{
private int spinnerPixelSpeed;

public SpinThingy(int scrollSpeed)
{
this.spinnerPixelSpeed = scrollSpeed;
}
}

[/cpp]

uiteraard is dit niet voldoende maar zo moet je het ongeveer doen.

Mocht het niet duidelijk zijn wil ik je code wel even omzetten zodat het hopelijk wat duidelijker wordt :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan