Avatar billede j3ppah Novice
19. november 2008 - 10:30 Der er 16 kommentarer og
1 løsning

Keyboard input lykke, problem

Goddag alle glade eksperter... Jeg er ved at kode mig en gang snake... Mit problem er nu at jeg ikke helt kan find ud af at få et keyboard input.. da det er snake skal den selvfølgelig kører for hver gang lortet bevæger sig, og checke om keyboard inputtet er ændret... Her er så koden... i behøver kun at kigge på den sidste del som er udkommenteret. da det er her den skal sættet ind.
Håber der er nogen der kan hjælpe en newbie programmør

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Spil
{
    public partial class Level11Snake : UserControl
    {
        Button[,] myButton = new Button[8, 8];
        int xID = 0;
        int yID = 0;
        int Direction = 3;

        public Level11Snake()
        {
            InitializeComponent();
            myButton[0, 0] = button1;
            myButton[0, 1] = button2;
            myButton[0, 2] = button3;
            myButton[0, 3] = button4;
            myButton[0, 4] = button5;
            myButton[0, 5] = button6;
            myButton[0, 6] = button7;
            myButton[0, 7] = button8;
            myButton[1, 0] = button9;
            myButton[1, 1] = button10;
            myButton[1, 2] = button11;
            myButton[1, 3] = button12;
            myButton[1, 4] = button13;
            myButton[1, 5] = button14;
            myButton[1, 6] = button15;
            myButton[1, 7] = button16;
            myButton[2, 0] = button17;
            myButton[2, 1] = button18;
            myButton[2, 2] = button19;
            myButton[2, 3] = button20;
            myButton[2, 4] = button21;
            myButton[2, 5] = button22;
            myButton[2, 6] = button23;
            myButton[2, 7] = button24;
            myButton[3, 0] = button25;
            myButton[3, 1] = button26;
            myButton[3, 2] = button27;
            myButton[3, 3] = button28;
            myButton[3, 4] = button29;
            myButton[3, 5] = button30;
            myButton[3, 6] = button31;
            myButton[3, 7] = button32;
            myButton[4, 0] = button33;
            myButton[4, 1] = button34;
            myButton[4, 2] = button35;
            myButton[4, 3] = button36;
            myButton[4, 4] = button37;
            myButton[4, 5] = button38;
            myButton[4, 6] = button39;
            myButton[4, 7] = button40;
            myButton[5, 0] = button41;
            myButton[5, 1] = button42;
            myButton[5, 2] = button43;
            myButton[5, 3] = button44;
            myButton[5, 4] = button45;
            myButton[5, 5] = button46;
            myButton[5, 6] = button47;
            myButton[5, 7] = button48;
            myButton[6, 0] = button49;
            myButton[6, 1] = button50;
            myButton[6, 2] = button51;
            myButton[6, 3] = button52;
            myButton[6, 4] = button53;
            myButton[6, 5] = button54;
            myButton[6, 6] = button55;
            myButton[6, 7] = button56;
            myButton[7, 0] = button57;
            myButton[7, 1] = button58;
            myButton[7, 2] = button59;
            myButton[7, 3] = button60;
            myButton[7, 4] = button61;
            myButton[7, 5] = button62;
            myButton[7, 6] = button63;
            myButton[7, 7] = button64;

            /*
            do
            {
                //Console.ReadKey();
                this.Update();
                Thread.Sleep(250);
                switch (Direction)
                {
                    case 1:
                            myButton[xID, yID].Text = "";
                            xID--;
                            myButton[xID, yID].Text = "X";
                        break;
                    case 2:
                            myButton[xID, yID].Text = "";
                            yID--;
                            myButton[xID, yID].Text = "X";
                        break;
                    case 3:
                            myButton[xID, yID].Text = "";
                            xID++;
                            myButton[xID, yID].Text = "X";
                            this.Update();
                            //Thread.Sleep(250);
                        break;
                    case 4:
                            myButton[xID, yID].Text = "";
                            yID++;
                            myButton[xID, yID].Text = "X";
                        break;
                    default:
                        break;
                }

            } while ((xID<7) && (yID<7) && (xID>=0) && (yID>=0));
            */

            /* Console.ReadKey();
           
            switch (Direction)
            {
                case 1:
                    break;
                case 2:
                    break;
                case 3: do
                    {
                        myButton[xID, yID].Text = "";
                        xID++;
                        myButton[xID, yID].Text = "X";
                        Thread.Sleep(250);
                        this.Update();
                    } while (xID < 7);
                    break;
                case 4:
                    break;
            }
            } */

            foreach (Button b in myButton)
            {
             
            }

        }

        public void Styrring()
        {
            int Running = 1;
            do
            {

                /*Her Skal keyboard inputtet læses();
                //inputtet skal læses på pil tasterne.
                switch (Userinput) // og her skal den bruge det i en switch.
                {
                    case west: //det her er så selvfølgelig
                        Direction = west // venstre, højre, op og ned self.;
                        break;
                    case north:
                        Direction = north;
                        break;
                    case east:
                        Direction = east;
                        break;
                    case south:
                        Direction = south;
                        break;
                }
                */

                switch (Direction)
                {
                    case 1:
                        myButton[xID, yID].Text = "";
                        yID--;
                        myButton[xID, yID].Text = "X";
                        break;
                    case 2:
                        myButton[xID, yID].Text = "";
                        xID--;
                        myButton[xID, yID].Text = "X";
                        break;
                    case 3:
                        myButton[xID, yID].Text = "";
                        yID++;
                        myButton[xID, yID].Text = "X";
                        break;
                    case 4:
                        myButton[xID, yID].Text = "";
                        xID++;
                        myButton[xID, yID].Text = "X";
                        break;
                    default:
                        break;
                }
                if ((yID > 7)||(yID<0)||(xID>7)||(xID<0))
                {
                    Running = 0;
                }
                this.Update();
                Thread.Sleep(250);
            } while (Running == 1);
        }
       
        private void Level11Snake_Load(object sender, EventArgs e)
        {

        }

        private void StartButton_Click(object sender, EventArgs e)
        {
            Styrring();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

       
    }
}
Avatar billede aaberg Nybegynder
19. november 2008 - 13:09 #1
På den måde du har lagt dit program op på, er jeg ikke sikker på det er så nemt! Du kommer også til at få store problemer, da hele din form kommer til at fryse og skrive "Svare ikke" efter et kort stykke tid. Dette sker, da du kører programmet ind i en uendelig do-while løkke, så programmet aldrig får lov at opdatere brugergrænsesnittet. Heldigvis kan det nemt laves, hvis du laver lidt om på strukturen af dit program.

Drop hele din Styrring() metode.
I stedet for at suse rundt i en while-løkke, skal du bruge en Timer. Fra toolboxen i designeren, trækker du en Timer ind på din form. Sæt Interval propertien til 250 (eller hvor lang tid du vil have imellem hver opdatering). I din StartButton_Click(object sender, EventArgs e) metode, sætter du timerens Enabled property til true, da vil timeren starte. Sætter du den til false, stopper timeren.

Dobbeltklik på timeren i designvinduet for at abonnere på Tick eventet. Denne metode vil blive kørt hvert 250 millisekund. Her skriver du logikken som opfrisker brugergrænsesnittet.

Derudover skal du abonnere på KeyDown eventet på formen. Dette event bliver kørt, hver gang der trykkes på en knap, og som parameter får du hvilken knap der var trykket. Fra dette event kan du sætte din Direction variabel.

Jeg håber dette hjælper dig lidt videre. Bare spørg hvis jeg skal uddybe noget af det.
Avatar billede aaberg Nybegynder
19. november 2008 - 13:11 #2
Jeg glemte lige en ting. Du skal sætte KeyPreview propertien på formen til true, for at KeyDown eventet skal virke.
Avatar billede j3ppah Novice
19. november 2008 - 13:56 #3
Hey aaberg... Kunne være sweet, hvis du kunne prøve at give et eksempel på hvordan det burde se ud... for vi sidder 100% fast lige nu... har uploaded den til rapidshare:

http://rapidshare.com/files/165304767/programmering_spil_med_level_10.rar.html

Hvis du får tid må du meget gerne lige smide en modsatte vej, i håb om jeg kan lure lidt kode, og lære en del!..

Mange tak!

Hilsen J3ppah
Avatar billede aaberg Nybegynder
19. november 2008 - 14:20 #4
Jeg skal se om jeg ikke kan smække noget sammen i aften :-)
Avatar billede j3ppah Novice
19. november 2008 - 14:27 #5
Satan, du ville være SÅDAN en guldklump hvis du kunne hjælpe... for vi er så freaking lost, det forstår du slet ikke!
Avatar billede j3ppah Novice
19. november 2008 - 19:52 #6
Hva så :)... er man ved at være nåed frem til en løsning ;)
Avatar billede aaberg Nybegynder
20. november 2008 - 00:18 #7
Hehe, klokken 19:52, da du skrev din sidste kommentar, var jeg i gang med at putte børnene. Jeg var ikke engang kommet i gang med Worm spillet! Men men, nu har jeg flækket noget sammen. Løsningen blev noget mere kompliceret end det eksempel du var begyndt på, men du kan jo i hvert fald se på det, og se om du kan gennemskue det. Det kan være jeg dokumenterer lidt på det i morgen og uploader en ny version, men nu er det sgu sent og jeg er på vej i seng.

Men, her er filen:
http://rapidshare.com/files/165476668/SimpleWorms.zip.html

Jeg må sgu indrømme at det er lang tid siden jeg har hygget mig så meget med en programmeringopgave. Jeg arbejder med programmering, og udvikler for det meste rimeligt kedelige løsninger for blandt andet sundhedsektoren og forsikring. Så at flække sammen et lille Worm-spil var faktisk mega sjovt!!

:-D
Avatar billede j3ppah Novice
20. november 2008 - 11:17 #8
Holy Freaking Christ!...

Det var sku da noget af en omgang kode du lige fik mixet sammen, i pappas egen sorte programmerings gryde...

Øhh... Altså... Der er en helt del ting jeg ikke forstår af det ^^... og havde egentligt regnet med at det var mere simpelt...
men den hovedsalige ting, som jeg ikke forstår er...
1. Hvornår sætter du at din "usercontrole" er en x og y lenght...

Kan sagtens se du arbejder på dem osv, men kan ikke finde stedet hvor du har sat op at det skal være en form for "diagram / array"...

Men ideen er jo 100x bedre end den jeg havde, dog tror jeg bare det bliver for indviklet programmering til at jeg kan følge med... ^^...

Du skulle vel aldrig kunne prøve at lave noget lignende det du har lavet, bare vider epå vores som kører i et button array ^^... for bliver næsten nød til at forstå koden noget bedre, da det jo er til selvvalgt opgave :)...


MEN SATAN DU ER KODE GUROEN!... :D...
Super fed kodt du har fået lavet...

Og du siger bare fra når det bliver for meget for dig :).. for så smider jeg lige en gang points over til dig :D
Avatar billede j3ppah Novice
20. november 2008 - 11:58 #9
Damn jeg gad godt kunne brykke noget smamen som det du har lavet... :S...

Satan det er lækker kode!..
Og mange tak, har virkeligt en del mere forståelse for hvordan vi burde lave det...
Men der er stadig en del jeg ikke helt ved hvordan jeg skal få brykket ind i vores slam :D
Avatar billede aaberg Nybegynder
20. november 2008 - 12:33 #10
Jeg skal skrive en forklaring til koden i aften. Jeg er på arbejde, og kan derfor ikke tillade mig at bruge tid på det nu, men jeg skal gøre det i aften. Det er faktisk ikke så kompliceret bygget op, men man skal selvfølgelig forstå hvordan jeg har tænkt. Så forhåbentlig får du en bedre forståelse af det, når jeg har beskrevet det lidt.

Jeg kan også se om jeg kan lave noget som passer mere til dit eksempel.

Jeg smider bare et svar nu, som du kan acceptere, så vender jeg tilbage i aften :-D
Avatar billede aaberg Nybegynder
20. november 2008 - 12:34 #11
Jeg skal huske at trykke på "Svar"!!  ;-)
Avatar billede j3ppah Novice
20. november 2008 - 13:13 #12
Du er sku en lille frækkert aaberg!... Lyder voldsomt nice... Begge ting ville være super lækkert...

Al respekt til dig!

Hilsen Jeppe
Avatar billede j3ppah Novice
20. november 2008 - 14:11 #13
Hey aaberg... fik en del ud af din kode, og noget hjælp fra en anden... vi er kommet en del videre...

http://rapidshare.com/files/165629244/WindowsApplication1_1_.rar.html

Der ligger en ny, som vi håber man kan arbejde lidt vider på.. men kan godt være vi skal bruge drawing for at kunne få ormen til at blive længere osv?..
Eller kan man lave det i vores button array?..
Avatar billede aaberg Nybegynder
20. november 2008 - 15:23 #14
Jeg downloadede lige jeres kode og så lidt på det. Det er slet ikke så dumt, det i har lavet.

Lige et hurtigt forbedringsforslag.
I stedet for at bruge knapper, kan i bruge Control klassen. I stedet for at putte flere Buttons eller Controls ind på klassen design time, synes jeg i skal eksperimentere med at lave en algoritme der putter instanser af Control klassen ind på formen, når formen loades. Det kan gøres med noget ala:

for (int xIndex = 0; xIndex < 10; xIdx++)
{
  for (int yIndex = 0; yIndex < 10; yIndex++)
  {
      //Her har i x og y index på kontrollerne. Regn ud bredden på hver kontrol, ud fra max bredde og antal kontroller. Regn ud koordinat for kontrollen, og put den ind på formen via Controls.Add() metoden. På denne måde, kan i nemt ændre hvor mange felter der skal være.
  }
}

Så kan i jo også prøve at udtænke, hvordan i skal gøre så ormen kan blive længere. :-D

~Jeg vender tilbage i aften.
Avatar billede aaberg Nybegynder
20. november 2008 - 21:47 #15
Nu har jeg lavet nogle små modificeringer til mit snake program. Jeg har lavet lidt om på navngivningen af klasserne, og tilføjet en del forklaring.

http://rapidshare.com/files/165756102/SimpleSnake.zip.html
Avatar billede aaberg Nybegynder
20. november 2008 - 22:19 #16
Nu har jeg fiklet lidt med jeres snake spil. Jeg har implementeret den ændring jeg foreslog tidligere, at bruge Control klassen i stedet for knapper. Derudover har jeg tilføjet at slangen kan være længere.

http://rapidshare.com/files/165764033/WindowsApplication1.zip.html

Jeg synes selv i skal prøve at tilføje nogle flere features, det er trods alt det man lærer mest af. Men ikke nøl med at spørge :-)
Avatar billede aaberg Nybegynder
20. november 2008 - 22:22 #17
Og så har jeg forøvrigt gjort så det er en timer der styrer spiltempoet i stedet for en separat tråd. Tråde skal som tommelfingerregel ikke bruges i andre tilfælde end der det er 100% nødvendig, da man nemt får problemer med tråde, hvis man ikke er 100% sikker på hvad man har gang i.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester