Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Valinnan valitseminen nuolinäppäimillä konsoliin

Jarkko-C++ [25.04.2006 21:37:40]

#

Elikkä tämä koodi listaa valintoja, joista voidaan sitten valita yksi nuolinäppäimillä. Hieman pitkähkö tuo on, mutta eipähän ole niin sekava kuin jos siihen olisi laitettu paljon aliohjelmia. Kun täällä ei vielä ollut tälläista koodivinkeissä ni aattelin postata sen, toivottavasti se auttaa jotakuta.

#include <iostream>
#include <conio.h>
#include <windows.h> //Tätä tarvimme jotta voimme käyttää GetAsyncKeyStatea. Valitettavasti se myös aiheuttaa sen, että ohjelma toimii vain Wintoosassa.
using namespace std;

struct Options //Struktuuri Valinnoille. Voi tämän jotenkii paremminkii tehä varmasti (kuten suoraan chaarina), mutta näin saa sen ainakin toimimaan.
{
      const  char Options[64][64]; //Char muuttujataulukko Options.
};


int ShowOption(Options Option, char Title[])  //Aliohjelma. Argumentit ovat Options luokka Option, ja char muuttuja Title.
{
    system("cls"); //Puhdistetaan näyttö.
    int i = 0, Select = 0, OptionAmount = 0, ii = 0;
    cout<<Title<<"\n";
    for(i = 0; i < strlen(Title); i ++) //Silmukka, jotta saadan tulostettua kiva alaviiva otsikolle.
          cout<<"-";
    i = 0;
    for (i = 0; i!=1; i=i) //Silmukka. Tarkista kuinka monta valintaa meillä on. Kasvata OptionAmount:tia niin kauan kunnes löydetään END.
    {
        OptionAmount += 1;
        if (strcmp(Option.Options[ii], "END") == 0)
        i = 1;
        ii += 1;

    }
    OptionAmount -= 1;
    cout<<"\n\n\n";
    for(i=0; i!=OptionAmount; i += 1) //Silmukka. Tulosta valinnat.
         {
                  cout<<Option.Options[i]; //Tulosta valint.
                  if (i == Select) //Jos tämänhetkinen valinta on tällä hetkellä silmukassa tulosettava valinta, tulosta perään "*".
                     cout<<"   *";
                  cout<<"\n";
         }
    for(;;) //Silmukka. Jatkaa ikuisesti. (break, return, ynm. lopettaa tietysti.)
    {
     if (GetAsyncKeyState(VK_DOWN) != 0) //Katso jos ylöspäinnuolta on painettu.
     {
         Select += 1; //Kasvata valintaa yhdellä.
         system("cls"); //Puhdista näyttö.
         cout<<Title<<"\n";
         for(ii = 0; ii < strlen(Title); ii ++)
                        cout<<"-";
         cout<<"\n\n\n";
         if (Select > OptionAmount - 1) //Jos valinta on suurempi kuin valintojenmäärä, laita valinta nollaksi,
                    Select = 0;
         for(i=0; i!=OptionAmount; i += 1)
         {

                  cout<<Option.Options[i];  //Tulosta valinta.
                  if (i == Select)
                     cout<<"   *";
                  cout<<"\n";
         }
     }
     if (GetAsyncKeyState(VK_UP) != 0) //Jos ylöspäinnappia on painettu.
     {
         Select -= 1; //Vähennä valintaa yhdellä.
         system("cls"); // //Puhdista näyttö.
         cout<<Title<<"\n";
         for(ii = 0; ii < strlen(Title); ii ++)
                        cout<<"-";
         cout<<"\n\n\n";
         if (Select < 0) //Jos valinta on pienempi kuin nolla, laita vailnta määräksi valintojen määrä.
            Select = OptionAmount - 1;
         for(i=0; i!=OptionAmount; i += 1)
         {

                  cout<<Option.Options[i];
                  if (i == Select)
                     cout<<"   *";
                  cout<<"\n";
         }
     }

      if (GetAsyncKeyState(VK_RETURN) != 0) //Jos enteriä painetaan.
      {
         system("cls"); //Puhdista näyttö.
         return Select + 1; //Palauta valinta. Lisää valintaan yksi, sillä ainakin omasta milestäni ykkösestä alkaminen
         //on selvenpää tähän kuin nollasta.
      }
     Sleep(50); //"Nuku" 50millisekuntia, jotta prosessori ei vetäisi täysillä.
    }
}


int main() //Käyttö.
{
    Options Op = {{ "Valinta1", "Valinta2", "Valinta3", "Valinta4", "Valinta5", "END"}}; //Uusi Options struktuuri Op. Laita valinnat arvoksi. Muista laittaa loppuun tuo END, sillä siitä aliohjelma laskee valintojen määrän.
    int Valinta = ShowOption(Op, "Valitse Valinta");
    cout<<"Valitsit: "<<Valinta<<"\n";
    cout<<"Eli valitsit: "<<Op.Options[Valinta -1]; //Tulosta Op.Optionsis muuttujan alkio Valinta - 1. Eli teksti, jonka käyttäjä valitsi.
    Sleep(10000);
    return 0;
}

Metabolix [25.04.2006 22:36:33]

#

Ylipitkät rivit rikkovat siistin sisennyksen näin foorumilla, ja muutenkin kommentointi olisi selvempää muualla kuin rivien lopussa. Kaiken kaikkiaan koodin voisi tehdä paljon pienempään tilaan, siistimmin ja, kuten itsekin jostain kohdasta totesit, paremmin.

Turha laittaa samoja asioita moneen kertaan, esimerkiksi tuo valikon tulostus. Muutenkin tuossa on nyt aika lailla aloittelijan purkkakoodia, ei millään pahalla. Nähdäkseni conio.h ei ollut edes käytössä, eikä se ainakaan kuulu perusotsikoihin. Sen sijaan cstdlib pitäisi olla, ja käsittääkseni system-funktion edessä olisi std:: paikallaan. Vaihtoehtoisesti voi tehdä C-tapaan, jolloin on stdlib.h ilman std-nimiavaruutta. Sleep löytyy samasta windows.h:sta kuin GetAsyncKeyState, senkin voisi mainita kyseisen otsikon yhteydessä.

Tällaiset vasemmalla kädellä kirjoitetut alkutaipaleen väkerrykset tapaavat sisältää enemmän huonoja tapoja kuin oikeasti kiinnostavaa asiaa...

Huh, tulipa valitettua. Mutta siitä se lähtee, koeta kestää kritiikki. :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta