Code verkleinen c#

Status
Niet open voor verdere reacties.

Bramcsharp

Gebruiker
Lid geworden
11 aug 2009
Berichten
6
Hallo,

Ik zit met een probleem,
Ik ben een spelletje aan het maken. Hierbij komen er pijlen vanaf de onderkant van het scherm naar boven en op een bepaalde hoogte moet je op de goede cursortoets drukken om te scoren.
Nou heb ik een stuk code waarin mijn pijlen worden aangemaakt, maar mijn leraar is hier niet tevreden mee omdat de teveel "hetzelfde" is.
Het is dus de bedoelling om dit stuk code aanzienlijk te verkleinen, maar ik heb geen idee hoe ik dat voor elkaar moet krijgen want elke regel heeft toch andere variabelen.

hier is mijn code:
Code:
public void maakPijlen()
        {
            //image, x-loc, time.
            pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, 0));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 50));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 100));
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 150));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 200));
            //
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 250));
            pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, 300));
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 400));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 500));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 550));
            //
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 600));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 650));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 700));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 750));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 800));
            //
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 850));
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 900));
            pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, 950));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 1000));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 1050));
            //
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 1100));
            pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, 1150));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 1200));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 1250));
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 1300));
            //
            pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, 1350));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 1400));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 1500));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 1550));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 1650));
            //
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 1700));
            pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, 1750));
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 1800));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 1850));
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 1900));
            //
            pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, 1950));
            pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, 2000));
            pijlen.Add(new Arrow(Properties.Resources.PijlRechts2, 650, 2050));
            pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, 2100));
        }

Aangezien het vakantie is en ik deze opdracht na de vakantie moet inleveren kan ik het niet even aan mijn leraar vragen en dus ben ik hier beland.
Alle hulp is welkom :thumb:

Groetjes, Bram
 
Ik ga je geen direct goede code geven (wij zijn er niet om je huiswerk te maken) maar misschien heb je hier wat aan:
[CPP]public void maakPijlen()
{
//image, x-loc, time.
int no1 = 250;
int no2 = 0;
int repeat = 0;
label1:
pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, 0));
int no1 = no1 + 200;
int no2 = no2 + 50;
int repeat++;
if(repeat <= 5){
goto label1;
}
else{
goto 2;
}[/CPP]

Ga hiermee eens aan de slag! Succes!

ps. Ik heb geen ervaring met C# maar ik heb mijn C++ervaring gebruikt. Het kan dus zijn dat de code niet werkt, maar dat is makkelijk uit te vinden voor een programmeur, denk ik...
 
Je zou natuurlijk 2 arrays kunnen maken.
array 1: alle soorten pijlen
array 2: alle locaties.

timer die afgaat op elke halve seconde.

Vervolgens na halve seconde event een new arrow met random een soort pijl uit de array en random uit de array met de locatie. Je hoeft dan ook geen tijd mee te geven aan deze klasse.
 
Hier is nog een kleinere code:
Code:
public void maakPijlen()
        {
            for (int i = 0; i < 43; i++)
{

            pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, (i % 5) * 250, i * 50));
// ik snap niet precies welke peilen je wil creeren maar als je deze code nou execute dan krijg je een voorbeeld
}
            }
        }

Ik zie dat de laaste variabele constant is dus hier is er 1 met randoms
Code:
public void maakPijlen()
{
Random random = new Random();
for (int i = 0; i < 43; i++)
{
int x = random.Next(0,3);
if (x==0)
pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, (random.Next(1,4)*200) + 50, i * 50));
elseif (x==1)
pijlen.Add(new Arrow(Properties.Resources.PijlLinks2,  (random.Next(1,4)*200) + 50, i * 50));
elseif (x==2)
pijlen.Add(new Arrow(Properties.Resources.PijlRechts2,  (random.Next(1,4)*200) + 50, i * 50));
elseif(x==3)
pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, (random.Next(1,4)*200) + 50, i * 50));
}
}
 
Laatst bewerkt:
Oke, allereerst bedankt voor alle reacties :thumb:
En sorry voor mijn late reactie maar ik was gisteren de hele dag weg.

In ieder geval, ik ben zo stom geweest om in mijn startpost er niet bij zetten dat we geen gebruik mogen maken van random, de bedoeling van de opdracht is onder andere om alle pijlen zelf te programmeren.
Verder heb ik zojuist heel even met een klasgenoot gesproken en die vertelde mij dat de leraar dit probleem het liefste opgelost zou willen zien worden door middel van initializers, hier ben ik dus op het moment informatie over aan het zoeken.

@gast0231 :
Ik heb je code bekeken en aangepast zodat het werkt, maar wat ik dan krijg is dat de x-locatie (dus de locatie waarop de pijl verschijnt) telkens met 200 wordt verhoogt en na 4 pijlen dus al buiten het scherm valt, verder hoort bij elke x-locatie een ander plaatje en dus moet dit ook aangepast worden.

@Jabber & wicherh
Bedankt voor het idee maar zoals ik net verteld heb, we mogen geen random gebruiken, nogmaals sorry voor het laat vermelden daarvan.

Even te verduidelijking; het gaat hier over 4 pijlen:
Pijl1: gebruikt altijd het plaatje PijlOnder2 en heeft altijd de x-locatie 250
Pijl2: gebruikt altijd het plaatje PijlLinks2 en heeft altijd de x-locatie 450
Pijl3: gebruikt altijd het plaatje PijlRechts2 en heeft altijd de x-locatie 650
Pijl4: gebruikt altijd het plaatje PijlBoven2 en heeft altijd de x-locatie 850
Verder wordt de tijd altijd met 50 verhoogt.

Ik moet dus eigenlijk een lijst hebben waarin ik zeg, achtereenvolgens, welke pijl er moet verschijnen. (bijv. 1, 2, 1, 4, 3, 2, 1, enz.) zo kan ik dus zelf bepalen wanneer welke pijl verschijnt.

Groetjes,
Bram :thumb:
 
Laatst bewerkt door een moderator:
Hier is dan de code die je zoekt.
Deze code zou moeten werken maar ik heb em geschreven met de hand.
Code:
public void maakPijlen()
{
String Pijlkeuze = "1230322"; // vul je eigen peilenlist aan
for (int i = 0; i < Pijlkeuze.Length - 1; i++)
{
int x = Pijlkeuze[i]; // (schrijf deze code met de hand maar het kan ook zijn dat het is Pijlkeuze.tocharray[i] moet zijn.
if (x==0)
pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, i * 50));
elseif (x==1)
pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, i * 50));
elseif (x==2)
pijlen.Add(new Arrow(Properties.Resources.PijlRechts2,  650, i * 50));
elseif(x==3)
pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, i * 50));
}
}

Suc6
 
Hier is dan de code die je zoekt.
Deze code zou moeten werken maar ik heb em geschreven met de hand.
Code:
public void maakPijlen()
{
String Pijlkeuze = "1230322"; // vul je eigen peilenlist aan
for (int i = 0; i < Pijlkeuze.Length - 1; i++)
{
int x = Pijlkeuze[i]; // (schrijf deze code met de hand maar het kan ook zijn dat het is Pijlkeuze.tocharray[i] moet zijn.
if (x==0)
pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, i * 50));
elseif (x==1)
pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, i * 50));
elseif (x==2)
pijlen.Add(new Arrow(Properties.Resources.PijlRechts2,  650, i * 50));
elseif(x==3)
pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, i * 50));
}
}

Suc6

Ik heb zeker een half uur proberen uit te zoeken waarom, maar het werkt dus niet. Met behulp van debuggen kwam ik erachter dat de x van int x = Pijlkeuze; nooit gevuld word met 0, 1, 2 of 3. Ik heb ook geprobeerd er dan int x = Pijlkeuze.ToCharArray; van te maken maar dan krijg ik de error "Cannot apply indexing with [] to an expression of type 'method group' " Enig idee hoe ik dit kan oplossen?:confused:
 
Ik heb zeker een half uur proberen uit te zoeken waarom, maar het werkt dus niet. Met behulp van debuggen kwam ik erachter dat de x van int x = Pijlkeuze; nooit gevuld word met 0, 1, 2 of 3. Ik heb ook geprobeerd er dan int x = Pijlkeuze.ToCharArray; van te maken maar dan krijg ik de error "Cannot apply indexing with [] to an expression of type 'method group' " Enig idee hoe ik dit kan oplossen?:confused:


Gebruik i.p.v. Pijlkeuze.ToCharArray dit:

Code:
Pijlkeuze.ToCharArray()[i]
 
Ja oke, nou is die error wel weg, maar hij vult x nog steeds niet met 0, 1, 2 of 3 :(
wat dus betekend dat hij nooit bij de code komt om de pijlen te maken
 
Probeer dit eens:

Code:
public void maakPijlen()
{
String Pijlkeuze = "1230322"; // vul je eigen peilenlist aan
for (int i = 0; i < Pijlkeuze.Length - 1; i++)
{
if (i==0)
pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, i * 50));
elseif (i==1)
pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, i * 50));
elseif (i==2)
pijlen.Add(new Arrow(Properties.Resources.PijlRechts2,  650, i * 50));
elseif(i==3)
pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, i * 50));
}
}
 
Oke, er komt verbetering in!
Er worden nu 4 pijlen gemaakt (pijl 0, 1, 2 en 3) maar ik denk dat dit komt omdat i telkens verhoogt wordt met 1, het heeft namelijk ook totaal geen effect om de string Pijlkeuze te veranderen, hij blijft hoe dan ook pijl 0,1,2 en 3 maken met een halve seconde ertussen, na deze 4 pijlen worden er ook geen andere pijlen meer gemaakt.

In ieder geval alvast bedankt voor alle hulp die ik tot nu toe al heb gekregen, top:thumb:
 
kleine npassing (misschien wekt het):

Code:
public void maakPijlen()
{
String Pijlkeuze = "1230322"; // vul je eigen peilenlist aan
for (int i = 0; i < Pijlkeuze.Length; i++)
{
String x = Pijlkeuze.SubString(i, i + 1);
if (x == "0")
pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, i * 50));
elseif (x == "1")
pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, i * 50));
elseif (x == "2")
pijlen.Add(new Arrow(Properties.Resources.PijlRechts2,  650, i * 50));
elseif(x == "3")
pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, i * 50));
}
}
 
Nou krijg ik bij string x = Pijlkeuze.Substring(i, i + 1); de error:
ArgumentOutOfRangeException was unhandled, met als uitleg:
Index en lengte moeten naar een locatie binnen de tekenreeks verwijzen. Parameternaam: length
 
Sorry, iets over het hoofd gezien:

Code:
public void maakPijlen()
{
String Pijlkeuze = "1230322"; // vul je eigen peilenlist aan
for (int i = 0; i < Pijlkeuze.Length - 1; i++)
{
String x = Pijlkeuze.SubString(i, i + 1);
if (x == "0")
pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, i * 50));
elseif (x == "1")
pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, i * 50));
elseif (x == "2")
pijlen.Add(new Arrow(Properties.Resources.PijlRechts2,  650, i * 50));
elseif(x == "3")
pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, i * 50));
}
}
 
Sorry, iets over het hoofd gezien:

Code:
public void maakPijlen()
{
String Pijlkeuze = "1230322"; // vul je eigen peilenlist aan
for (int i = 0; i < Pijlkeuze.Length - 1; i++)
{
String x = Pijlkeuze.SubString(i, i + 1);
if (x == "0")
pijlen.Add(new Arrow(Properties.Resources.PijlOnder2, 250, i * 50));
elseif (x == "1")
pijlen.Add(new Arrow(Properties.Resources.PijlLinks2, 450, i * 50));
elseif (x == "2")
pijlen.Add(new Arrow(Properties.Resources.PijlRechts2,  650, i * 50));
elseif(x == "3")
pijlen.Add(new Arrow(Properties.Resources.PijlBoven2, 850, i * 50));
}
}

Moet toevallig dezelfde game maken maar zit met een probleem. Heb eerst de pijlen gemaakt en laat ze allemaal tegelijk omhoog gaan dit lukt. Om er een level van te maken heb ik de code hierboven gebruikt maar nu bewegen de pijlen niet meer als ik de arrowy variablen verander met i * 100 om ze onder elkaar te tekenen, maar ze worden wel in de goede volgorde na elkaar getekend. als ik arrowy niet verander werkt het wel en gaan de 4 pijlen naast elkaar 1 keer omhoog. Iemand een idee hoe ik de pijlen weer kan laten bewegen?

Code:
class ArrowLeft
    {
        private Bitmap bmparrowleft;
        private Bitmap bmparrowghostleft;

        public int Arrowleftx = 224;
        public int Arrowlefty = 652;

        public int ArrowGhostx = 224;
        public int ArrowGhosty = 12;

        public ArrowLeft()
        {
            bmparrowleft = new Bitmap(imgArrowleft, new Size(100, 100));
            bmparrowghostleft = new Bitmap(imgArrowghostleft, new Size(100, 100));
        }

        Image imgArrowleft = global::Cursordancing.Properties.Resources.arleft;
        Image imgArrowghostleft = global::Cursordancing.Properties.Resources.ableft;

        public void DrawArrowLeft(Graphics g)
        {
            g.DrawImage(bmparrowleft, new Rectangle(Arrowleftx, Arrowlefty, 100, 100));
        }

        public void DrawArrowLeftGhost(Graphics g)
        {
            g.DrawImage(bmparrowghostleft, new Rectangle(ArrowGhostx, ArrowGhosty,    100, 100));
        }
    }
}


public partial class Form1 : Form
    {

        ArrowDown ArrowDown;
        ArrowUp ArrowUp;
        ArrowLeft ArrowLeft;
        ArrowRight ArrowRight;

        public Form1()
        {
            InitializeComponent();

            ArrowDown = new ArrowDown();
            ArrowUp = new ArrowUp();
            ArrowLeft = new ArrowLeft();
            ArrowRight = new ArrowRight();

            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.DoubleBuffer, true);
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.DoubleBuffer, true);
        }

        String Pijlkeuze = "1234321";

       private void Form1_Paint(object sender, PaintEventArgs e)
        {
            ArrowLeft.DrawArrowLeftGhost(e.Graphics);
            ArrowDown.DrawArrowDownGhost(e.Graphics);
            ArrowUp.DrawArrowUpGhost(e.Graphics);
            ArrowRight.DrawArrowRightGhost(e.Graphics);

            if (Start.Visible == false)
            {
                for (int i = 0; i < Pijlkeuze.Length; i++)
                {
                    String x = Pijlkeuze.Substring(i, 1);
                    if (x == "1")
                    {
                        ArrowDown.Arrowdowny = i * 100 + 12;
                        ArrowDown.DrawArrowDown(e.Graphics);
                    }
                    if (x == "2")
                    {
                        ArrowUp.Arrowupy = i * 100 + 12;
                        ArrowUp.DrawArrowUp(e.Graphics);
                    }
                    if (x == "3")
                    {
                        ArrowLeft.Arrowlefty = i * 100 + 12;
                        ArrowLeft.DrawArrowLeft(e.Graphics);
                    }
                    if (x == "4")
                    {
                        ArrowRight.Arrowrighty = i * 100 + 12;
                        ArrowRight.DrawArrowRight(e.Graphics);
                    }
                }
            }
        }

        int ArrowSpeed = 10;

        private void move (object sender, EventArgs e)
        {
            if (Start.Visible == false)
            {
                if (ArrowDown.Arrowdowny > -100)
                    ArrowDown.Arrowdowny -= ArrowSpeed;
                if (ArrowUp.Arrowupy > -100)
                    ArrowUp.Arrowupy -= ArrowSpeed;
                if (ArrowLeft.Arrowlefty > -100)
                    ArrowLeft.Arrowlefty -= ArrowSpeed;
                if (ArrowRight.Arrowrighty > -100)
                    ArrowRight.Arrowrighty -= ArrowSpeed;
                else
                {
                    //ArrowDown.Arrowdowny = 652;
                    //ArrowUp.Arrowupy = 652;
                    //ArrowLeft.Arrowlefty = 652;
                    //ArrowRight.Arrowrighty = 652;
                }
                Invalidate();
            }
        }
    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan