pipe-game

Un jeu de cartes à piper les une dans les autres - retour accueil

git clone git://bebou.netlib.re/pipe-game
Log | Files | Refs | README |

commit 3bdb70dc26fc7f2d3c8bf6087f99a8d92548bcb5
parent 02f3788b052ad894515105e97722f633b427b160
Auteurice: Arthur Pons <arthur.pons@unistra.fr>
Date:   Wed, 29 Jan 2025 19:41:18 +0100

Factorisation du déplacement de cartes pile->pile

Enfin !
Bon je garantis pas du tout qu'il ne reste pas de bug mais le gros est
là
Ca m'a obligé (je crois) à remettre des "struct pile" partout m'enfin
Par contre ça a vachement simpifié le code de mouvement des cartes !

Diffstat:
Minterface.c | 120+++++++++++++++++++++++++++++++++++--------------------------------------------
1 file changed, 53 insertions(+), 67 deletions(-)

diff --git a/interface.c b/interface.c @@ -15,14 +15,16 @@ typedef struct { int y; } coord; -typedef struct { +struct pile { char *name; int cardCount; char **cards; int curline; coord begin; coord end; -} pile; + struct pile *destleft; + struct pile *destright; +}; enum pileid { HAND, PLAYED, ARGS, PLAYEDARGS, PLAYEDENNEMY, PLAYEDENNEMYARGS }; @@ -49,14 +51,19 @@ void vr(int coloffset, int lineoffset, int length) { tb_printf(coloffset,lineoffset+i,TB_DEFAULT, TB_DEFAULT, "|"); } -pile createpile(char *name) { - pile p; +struct pile createpile(char *name) { + struct pile p; p.cards=malloc(LIST_SIZE); p.name=name;p.cardCount=0; p.curline=0; return p; } -bool addcardtopile(char* cardname, pile* p, pile **piles) { +void setpiledests(struct pile *p, struct pile *destleft, struct pile *destright) { + p->destleft=destleft; + p->destright=destright; +} + +bool addcardtopile(char* cardname, struct pile* p, struct pile **piles) { /*On quitte si l'argument est vide ou s'il contient un espace*/ /* strchr ne fonctionne pas avec utf-8 mais pour le moment rien * ne fonctionne en utf8 alors bon */ @@ -74,7 +81,7 @@ bool addcardtopile(char* cardname, pile* p, pile **piles) { return true; } -void removecardofpile(int cardposition, pile* p, pile **piles) { +void removecardofpile(int cardposition, struct pile* p, struct pile **piles) { if(strcmp(p->name,"played")==0) { if(strcmp(piles[PLAYEDARGS]->cards[cardposition],"none")!=0) addcardtopile(piles[PLAYEDARGS]->cards[cardposition],piles[ARGS],piles); @@ -94,7 +101,7 @@ void removecardofpile(int cardposition, pile* p, pile **piles) { p->curline--; } -pile* moveselection(pile* p, pile** piles, char* direction, bool selection) { +struct pile* moveselection(struct pile* p, struct pile** piles, char* direction, bool selection) { int step = strcmp(direction,"up")==0 ? -1 : 1 ; if (p->curline+step >= 0 && p->curline+step < p->cardCount) { if (selection) { @@ -113,7 +120,23 @@ pile* moveselection(pile* p, pile** piles, char* direction, bool selection) { return p; } -void updatecmd(char* cmd, pile p, pile parg) { +struct pile* movetest(int curline, struct pile* p, struct pile** piles, bool* selection, int direction) { + struct pile *newcurmenu=p; + if(direction) { + newcurmenu=p->destleft; + } else { + newcurmenu=p->destright; + } + if(*selection) { + addcardtopile(p->cards[p->curline],newcurmenu,piles); + removecardofpile(curline,p,piles); + } else if ( newcurmenu->cardCount==0 ) { + newcurmenu=p; + } + return newcurmenu; +} + +void updatecmd(char* cmd, struct pile p, struct pile parg) { if (p.cardCount == 0 ) return; strcat(cmd,"( cat ./"); strcat(cmd,p.cards[0]); @@ -132,7 +155,7 @@ void updatecmd(char* cmd, pile p, pile parg) { strcat(cmd," ) 2> /dev/null\n"); } -void updateinterncmd(char *res, const pile p) { +void updateinterncmd(char *res, const struct pile p) { if (p.cardCount == 0 ) return; for(int i=0;i<p.cardCount;i++) { @@ -150,7 +173,7 @@ void updateres(char *res, const char *cmd, FILE *fp) { strcat(res, line); } -void file2pile(FILE* fp, pile *p, pile **piles) { +void file2pile(FILE* fp, struct pile *p, struct pile **piles) { char line[CARD_NAME_SIZE]; while (fgets(line, sizeof(line), fp)) { /* Retire le retour à la ligne à la fin de line */ @@ -174,7 +197,7 @@ coord displaybox(int coloffset, int lineoffset, int width, int length) { return p; } -coord displaypile(pile *p, pile curmenu, int coloffset, int lineoffset, bool selection) { +coord displaypile(struct pile *p, struct pile curmenu, int coloffset, int lineoffset, bool selection) { int newlineoffset=lineoffset; int maxwidth=CARD_NAME_SIZE+2; int maxlen=p->cardCount+1; coord begin; begin.x=coloffset; begin.y=lineoffset; @@ -204,7 +227,7 @@ coord displaytextblock(char *text, int coloffset, int lineoffset) { return p; } -int debug(int l, pile curmenu,struct tb_event ev) { +int debug(int l, struct pile curmenu,struct tb_event ev) { tb_printf(0,l++,TB_DEFAULT,TB_DEFAULT,curmenu.name); char str[100];sprintf(str,"%d",curmenu.cardCount); tb_printf(0,l++,TB_DEFAULT,TB_DEFAULT,str); @@ -216,7 +239,8 @@ int debug(int l, pile curmenu,struct tb_event ev) { return l; } -int display(pile** piles, pile curmenu, bool selection, char* cmd, char* res, char* intern, char* cmdennemy, char* resennemy, char* internennemy) { +int display(struct pile** piles, struct pile curmenu, bool selection, char* cmd, char* res, + char* intern, char* cmdennemy, char* resennemy, char* internennemy) { coord p; tb_clear(); @@ -258,13 +282,19 @@ int main(int argc, char **argv) { FILE *fp2, *fp3; - pile *piles[6]; - pile hand=createpile("hand"); - pile played=createpile("played"); - pile args=createpile("args"); - pile playedargs=createpile("playedargs"); - pile playedennemy=createpile("playedennemy"); - pile playedennemyargs=createpile("playedennemyargs"); + struct pile *piles[6]; + struct pile played=createpile("played"); + struct pile hand=createpile("hand"); + struct pile playedargs=createpile("playedargs"); + struct pile args=createpile("args"); + struct pile playedennemy=createpile("playedennemy"); + struct pile playedennemyargs=createpile("playedennemyargs"); + setpiledests(&played,&playedargs,&hand); + setpiledests(&hand,&played,&playedennemy); + setpiledests(&args,&playedargs,&playedennemyargs); + setpiledests(&playedennemy,&hand,&playedennemyargs); + setpiledests(&playedennemyargs,&hand,NULL); + setpiledests(&playedargs,NULL,&hand); piles[HAND]=&hand;piles[PLAYED]=&played; piles[ARGS]=&args;piles[PLAYEDARGS]=&playedargs; piles[PLAYEDENNEMY]=&playedennemy; @@ -277,7 +307,7 @@ int main(int argc, char **argv) { bool selection=false; bool quit=false; - pile *curmenu=&hand; + struct pile *curmenu=&hand; while(!quit) { cmd[0]='\0';res[0]='\0';intern[0]='\0'; @@ -306,55 +336,11 @@ int main(int argc, char **argv) { break; /* -> */ case 65514: - if (strcmp(curmenu->name,"played")==0) { - if (selection) { - addcardtopile(played.cards[played.curline],&hand,piles); - removecardofpile(played.curline,&played,piles); - selection=!selection; - } - if (piles[HAND]->cardCount > 0){ curmenu=&hand; } - } else if (strcmp(curmenu->name,"playedargs")==0) { - if (selection && strcmp(curmenu->cards[curmenu->curline],"none")!=0) { - addcardtopile(playedargs.cards[playedargs.curline],&args,piles); - removecardofpile(playedargs.curline,&playedargs,piles); - selection=!selection; - curmenu=&args; - } - if (piles[ARGS]->cardCount > 1){ curmenu=&args; } - else if (piles[HAND]->cardCount > 0){ curmenu=&hand; } - } else if(strcmp(curmenu->name,"hand")==0) { - if (selection) { - addcardtopile(hand.cards[hand.curline],&playedennemy,piles); - removecardofpile(hand.curline,&hand,piles); - selection=!selection; - } - if (piles[PLAYEDENNEMY]->cardCount > 0){ curmenu=&playedennemy; } - } + curmenu=movetest(curmenu->curline, curmenu, piles, &selection, 0); break; /* <- */ case 65515: - if (strcmp(curmenu->name,"hand")==0) { - if (selection) { - addcardtopile(hand.cards[hand.curline],&played,piles); - removecardofpile(hand.curline,&hand,piles); - } - if (piles[PLAYED]->cardCount > 0){ curmenu=&played; } - } else if (strcmp(curmenu->name,"args")==0) { - if (selection) { - addcardtopile(args.cards[args.curline],&playedargs,piles); - removecardofpile(args.curline,&args,piles); - } - if (piles[PLAYEDARGS]->cardCount > 0){ curmenu=&playedargs; } - } else if (strcmp(curmenu->name,"played")==0 && piles[PLAYEDARGS]->cardCount > 0) { - curmenu=&playedargs; - } else if(strcmp(curmenu->name,"playedennemy")==0) { - if (selection) { - addcardtopile(playedennemy.cards[playedennemy.curline],&hand,piles); - removecardofpile(playedennemy.curline,&playedennemy,piles); - selection=!selection; - } - if (piles[PLAYEDENNEMY]->cardCount > 0){ curmenu=&hand; } - } + curmenu=movetest(curmenu->curline, curmenu, piles, &selection, 1); break; case 13: selection=!selection;