Question

Je vous écris un client pour un jeu de console, 1vs1. Dans le jeu d'un joueur doivent attraper l'autre, et chaque joueur est rappresented avec un char, imprimé sur la console. J'utilise le mvaddch () pour supprimer l'ancienne position, et d'imprimer la nouvelle position sur la console. générer mon code 2 processus:

  • Processus A: Obtenir l'entrée du clavier et mettre à jour la position sur l'écran;
  • Processus B: il se l'entrée du serveur et mettre à jour la position de l'ennemi à l'écran;

Mon problème est l'ancienne position de l'ennemi n'est pas supprimé (avec écraser ' « ), et donc le processus B génère un serpent de charactes sur l'écran. Un processus bon travail.

  initscr();
noecho();
curs_set(0);
  //process A is created now
switch ( pid = fork() ) {
    case -1:    perror("fork() fallita");   exit(0);
    case 0:     {char c;    struct pos old_position = {welcome_position.c, welcome_position.x, welcome_position.y};
                    struct pos position = {welcome_position.c, welcome_position.x, welcome_position.y};
                    mvaddch(position.y, position.x, position.c);
            while (1) {
                switch(c=getch()) {
                    case SU:    if(position.y>0) {  position.y-=1; } break;
                    case GIU:   if(position.y<MAXY-1){  position.y+=1; } break;
                    case SINISTRA:  if(position.x>0){   position.x-=1; } break;
                    case DESTRA:    if(position.x<MAXX-1){  position.x+=1; } break;
                    default: break;     }
                if ((position.x != old_position.x) || (position.y != old_position.y)) { 
                    send(sock, &position, sizeof(struct pos), 0);
                    mvaddch(old_position.y, old_position.x, ' ');
                    mvaddch(position.y, position.x, position.c);
                    refresh();
                    old_position.x = position.x;
                    old_position.y = position.y; }}     }   
    default:    break ;         }                   
   // Process B is here
struct pos position; 
struct pos old_position={' ', -1,-1};
    while (1) {
        while ( recv(sock, &position, sizeof(struct pos), 0) < 1 )
            mvaddch(old_position.y, old_position.x, ' '); // THE PROBLEM
            mvaddch(position.y, position.x, position.c); // Works => snake
            refresh();
            old_position.x = position.x;
            old_position.y = position.y;}   
endwin();
kill(pid);
printf("\n-----------------------------\n");
}
Était-ce utile?

La solution

Si vous ne voulez pas l'ensemble montrant piste, vous devez tenir un registre de la position précédente de chaque personnage (joueur) et prendre des dispositions pour écrire un vide à l'ancienne position et la marque correcte à la nouvelle position. Si vous êtes de fantaisie de sentiment, vous pouvez utiliser un blanc de couleur, une couleur pour chaque joueur, de sorte que vous pouvez voir où chacun a été, même si les positions actuelles sont marquées différemment.

Malheureusement, sans coloration mentionné, qui ressemble à ce que vous faites.

Vous devez vous assurer de ne pas utiliser les coordonnées -1; mvaddch() est probablement pas vérifié et erreur va piétiner hors des limites, qui sait faire les dommages. Ne pas prendre le risque. (Pensez à utiliser 0, 0 comme l'ancienne position;.. Il importe si vous écrivez un blanc sur un blanc La seule chose qui importe est que l'autre joueur n'est pas où vous écrivez le blanc)

Notez qu'il est crucial que seul un processus fait le dessin. Si vous avez deux processus qui tentent de le faire, vous perdrez une ou l'autre des images de temps en temps. C'est une des raisons raison pour laquelle il est difficile d'ajouter une horloge, par exemple, dans le coin supérieur droit d'un écran du terminal. Vous ne semblez avoir deux processus en train d'écrire à l'écran.

Style-sage, vous devez utiliser plus de fonctions. Autrement dit, les différents processus doivent avoir chacun leur code dans une fonction distincte, de sorte qu'il est plus facile de voir ce qu'ils font. Empiler des accolades près } trois de profondeur sur une seule ligne n'est pas bon style non plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top