Jeg er i gang med at lave et kortspil, som kaldes klok-kabale. Den skal laves som en consol program i Visual C++. Altså spilleren skal placere de første 13 kort. Ligesom i et ur og kort nr. 13 placeres i midten. Nu er man klar til at gå videre. Man begynder nu at placere et nyt kort oven på den første, og man kontrollere om kortet gå op. fx hvis der er i forvejen et 9'er og den kort der blev placeret over i anden runde er også et 9'er, så er kort gået op. Man tager kortene og placere dem nedst i bunken.
Her er betingelserne.
1: De første 13 kort placeres, og man er klar til at placere et nyt kort på plads et (Es-pladsen).
2: Det kontrolleres, om det kort, der ligger på pladsen i forvejen er rigtig.
3: Hvis JA: Gå videre til næste plads (og tilbage til 3).
Hvis NEJ: Der lægges et ny kort.
4: Det kontrolleres, om det nye kort passer.
5: Hvis NEJ: Gå videre til næste plads (og tilbage til 2).
Hvis JA: Den/de kort, der ligger ”under”, placeres i bunken.
6: Gå videre til næste plads (og tilbage til 2).
Slutbetingelser: A: Der er ikke flere kort i bunken (kabalen gik ikke op). B: På alle pladser ligger der et rigtigt kort (kabalen gik op).
Jeg er kommet så langt. Jeg har lavet et blandkort program og fået placeret de først 13 kort. Jeg vil spørge om, hvordan får jeg programmet til at kontrollere, om det kort, der ligger på pladsen i forvejen er rigtig. Så jeg kom til betingelse nr.2
Det kommer an på hvordan det program du har nu ser ud, så det var måske en ide at poste det. Det oplage var at have et array med 13 elementer der gemmer kort for hver position. Hver element i arrayet må være i stand til at gemme flere kort.
(Jeg synes at jeg er stødt på dette spørgsmål for ganske nyligt i et andet forum.)
Jeg går ud fra at Deck er kort med numre 0, 1, 2 .. 51 ?
Du skal for hver bunke (Table) vide hvor mange der er i bunken, lad os kalde dem "int Num[13]", denne sættes til 0 når der er et kort i bunken og tælles derpå op.
Når du ligger det næste kort i bunke x skal du: Checke om Table[Num[x]][x] % 13 == x, hvis den er det skal alle fra Table[][x] lægges tilbage til Deck, ellers skal Num[x] tælles én op, og kortet puttes i Table[Num[x]][x].
Det var måske mere logisk hvis du byttede om på de to index'er i Table.
Jeg forstår ikke hvorfor der er 3 værdier i CardValue og hvorfor det er et 2d array.
Jeg har lavet en komplet løsning, men jeg går ud fra at det er en skole opgave, så jeg poster den ikke før du beder om den.
void GotoXY(int x, int y); void GetXY(int &x, int &y); WORD GetAttrib(); WORD GetChar(); void OutStrXY(int x, int y, const std::string &str, WORD attr); std::vector<CardValueClass >CardValue; typedef std::list<int >DeckType; DeckType Deck; std::vector<std::vector<int> >Pile; WORD NormAttrib; void ClearLine(int y); void DrawCard(int idx, int card);
int main() { int j; std::cout << "Program start" << std::endl; Pile.resize(13); srand(time(0));
vil du ikke være venlige og hjælpe mig med, hvordan jeg får programmet til lægge kort 37 gang. Forstået på den måde, programmet lægge de første 13 kort, vi kan blive ved at lægge kort 37 gang. Og hvordan kan jeg få den til at kontrollere, om det kort, der ligger på pladsen i forvejen er rigtig.
Hvad mener du med "En loop der lægger de resterende kort, udføres efter LaggeKort(): Og med hensyn til det her "Så vidt jeg kan se virker din BlandKort ikke" mærkligt når jeg prøver den kører den fint.
Du laver en loop over alle Table[] og checker om det sidste kort er rigtigt. Eller du checker om der kun er et kort i hver Table[] Eller du checker om der er netop 39 kort i Deck når du er færdig.
Hvor langt er du kommet? Har du lavet Bunken funktionen eller implementeret den loop jeg beskrev "29/11-2004 22:48:29" ? Har du lavet det om så man tager kortene fra Table[] tilbage til Deck når et kort lægges rigtigt ?
mener du det her "Har du lavet det om så man tager kortene fra Table[] tilbage til Deck når et kort lægges rigtigt?" Jeg har ikke lavet noget ændringer i den kode du vist mig. #include <time.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <iostream> using namespace std;
extern int Deck[52]; extern char CardValue[][3]; extern int Table[37][13];
int NumKort[13]; int i; int j;
void Bunken()
{
for(j = 1; j < 4; j++) {
for(i = 0; i < 13; i++) { if(Table[NumKort[i]][i] % 13 == i) { // This pile is OK cout << " "; } else { // Add a card, todo move table to deck if new card is OK NumKort[i]++; Table[NumKort[i]][i] = Deck[13*j + i]; cout << CardValue[Table[NumKort[i]][i]] << " "; } } cout << endl; } getch(); }
Du skal: 1: Udvide Deck[] så der bliver plads til de kort der puttes bag i bunken (man kunne godt genbruge plader men det er lettere at putte dem bag i Deck[]).
2: Tilføje en variabel der er index på det sidste kort i Deck[], sættes til 52 ved start, tælles op når der lægges et kort tilbage til Deck, kortet puttes ind i Deck[] i dette index. Jeg ville nok kalde den SidsteKort.
3: Lave en variabel der tæller det øverste/første kort i Deck[], Når du tager et kort fra Deck[] tages det fra dette index, og index'et tælles en op. Jeg ville måske kalde den FoersteKort.
Når FoersteKort == SidsteKort er der ikke flere kort i Deck[] og du har tabt.
I else delen af Bunken() skal du: Checke om Deck[FoersteKort]%13 == i, hvis den er det: 1: Puttes alle kort fra Table[][i] tilbage til Deck[SidsteKort]. 2: SidsteKort tælles en op for hver kort i Table[][i]. 3: NumKort[i] sættes til 0.
Derpå: Flyttes Deck[FoersteKort] over i Table[NumKort[i]][i] NumKort[i] tælle en op. FoersteKort tælles en op.
NumKort[i]++; Table[NumKort[i]][i] = Deck[13*j + i]; cout << CardValue[Table[NumKort[i]][i]] << " "; // Her skal tilføjes, at hvis det nu lagte kort er rigtig, skal de øvrige kort i den bunke flyttes tilbage i Deck. hvordan gør jeg det.
Og hvordan får jeg programet til at "rykker kortene op" i Deck, hver gang jeg tager en der fra.
Som koden ser ud nu, lægger der MAX. 52 kort, men ikke altid 52 kort.Det skal ændres, så jeg lægger kort indtil der ikke er flere i Deck.
Jeg har ændret det her:
{ if(Table[NumKort[i]][i] % 13 == 51)"Her har jeg ændret i med 51" { // This pile is OK cout << " "; } else { // Add a card, todo move table to deck if new card is OK NumKort[i]++; Table[NumKort[i]][i] = Deck[13*j+i]; cout << CardValue[Table[NumKort[i]][i]] << " ";
Du skal have en tæller der tæller hvor mange kort der er i Deck, lad os kalde den NumInDeck
Hvis du bruger memmove metoden skal du altid tage Deck[0], derved kommer else delen til at se ca. sådan ud:
if(Deck[0]%13 == i) { // Dette kort kommer til at ligge på rigtig plads for(int y = 0; y < NumKort[i]; y++) Deck[NumInDeck++] = Table[y][i]; NumKort[i] = 0; } Table[NumKort[i]][i] = Deck[0]; NumKort[i]++; memmove(Deck, &Deck[1], 51*sizeof(int)); NumInDeck--;
Du skal så ændre loopen udenom så den kører sålænge der NumInDeck er større end 0, og ikke kun kører 3 gange. Dette check skal du også have i den loop der kører fra 0 til 13, da du kan risikere at du løber ud for kort midt i en runde.
for(i = 0; i < 13; i++) { if(Table[NumKort[i]][i] % 13 == i) { // This pile is OK cout << " ";
Hvis jeg kører koden, så kommer der ikke de 52 kort frem på skærmen. Der mangler nogle gang 2 eller 3 kort. Hvis jeg sætter at 13==51 så kommer aller kortene frem.
Den kører loop'en 3 gange så den lægger 3*13 kort (+ de 13 fra føreste gang), medmindre et kort ligger rigtigt, så springer den den bunke over og der kommer derved til at mangle nogle.
"Du skal have en tæller der tæller hvor mange kort der er i Deck" Er det her i orden.
extern int Deck[52]; extern char CardValue[][3]; extern int Table[37][13]; extern void Bunken(); extern NumKort[13]; extern void LaggeKort(); extern int i; int NumInDeck= 52; // antal kort i deck
void AntalKort() {
if(Deck[0]%13 == i) { // Dette kort kommer til at ligge p? rigtig plads for(int x = 0; x < NumKort[i]; x++) Deck[NumInDeck++] = Table[x][i]; NumKort[i] = 0;
Deck[i]= Deck[i+1]; NumInDeck--; cout <<"Antal kort tilbage i Deck"<< endl;
cout << Table[NumKort[i]][i] << " ";
cout << endl; } getch(); }
Med hensyn til det her.
"Du skal så ændre loopen udenom så den kører sålænge der NumInDeck er større end 0, og ikke kun kører 3 gange. Dette check skal du også have i den loop der kører fra 0 til 13, da du kan risikere at du løber ud for kort midt i en runde."
void AntalKort() { if(Deck[0]%13 == i) { // Dette kort kommer til at ligge p? rigtig plads for(int x = 0; x < NumKort[i]; x++) Deck[NumInDeck++] = Table[x][i]; NumKort[i] = 0; }
AllSet bliver sat til true inden loopen, hvis der er en bunke hvor kortet ikke ligger rigtigt bliver den sat til false. Så hvis den er true efter loopen ligger kortene rigtigt og du har vundet.
Synes godt om
Ny brugerNybegynder
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.