Advertisement
Guest User

Untitled

a guest
Mar 21st, 2017
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <sys/types.h>
  6. #include <sys/ipc.h>
  7. #include <sys/msg.h>
  8.  
  9. typedef enum {READY=1, SHOOT, HIT, MISS, DEAD, FINALIZE} message_type;
  10.  
  11. typedef struct {
  12.     long pid;
  13.     message_type mtype;
  14.     int r;
  15.     int c;
  16. } message_t;
  17.  
  18. char S[10][10];
  19.  
  20. void read_field(){
  21.   for (size_t i = 0; i < 4; i++) {
  22.     scanf(" %s", S[i]);
  23.   }
  24. }
  25.  
  26. int pid;
  27. int msqid;
  28. const key_t key = 12345;
  29.  
  30. void send(message_t* m){
  31.   m->pid = pid^3;
  32.   printf("Saljem poruku pid %d\n", m->pid);
  33.   if (msgsnd(msqid, &m, sizeof(message_t), 0) == -1) {
  34.     perror("msgsnd+");
  35.   }
  36. }
  37.  
  38. void rcv(message_t* m){
  39.   printf("Cekam poruku %d\n", pid);
  40.   if (msgrcv(msqid, &m, sizeof(m)-sizeof(long), pid, 0) == -1) {
  41.       perror("msgrcv");
  42.       exit(1);
  43.   }
  44.   printf("Primio poruku\n");
  45. }
  46.  
  47. bool send_shoot() {
  48.   printf("ispali na polje: ");
  49.   message_t m;
  50.   m.mtype = SHOOT;
  51.   scanf(" %d %d", &m.r, &m.c);
  52.   send(&m);
  53.   rcv(&m);
  54.  
  55.   switch (m.mtype) {
  56.     case HIT:
  57.       printf("Pogodak\n");
  58.       return true;
  59.     case MISS:
  60.       printf("Promasaj\n");
  61.       return true;
  62.     case DEAD:
  63.       printf("Pogodak. Pobjeda\n");
  64.       return false;
  65.     default:
  66.       printf("wtf %d\n", m.mtype);
  67.       exit(1);
  68.   }
  69. }
  70.  
  71. bool am_i_dead() {
  72.   for (size_t i = 0; i < 4; i++) {
  73.     if (strcmp(S[i], "----") != 0)
  74.       return false;
  75.   }
  76.   return true;
  77. }
  78.  
  79. bool rcv_shoot() {
  80.   message_t m;
  81.   rcv(&m);
  82.  
  83.   printf("pucano na polje: %d %d\n", m.r, m.c);
  84.   if (S[m.r][m.c] == 'o') {
  85.     printf("Pogodak\n");
  86.     S[m.r][m.c] = '-';
  87.     if (am_i_dead())
  88.       m.mtype = DEAD;
  89.     else
  90.       m.mtype = HIT;
  91.   } else {
  92.     m.mtype = MISS;
  93.   }
  94.   send(&m);
  95.   return m.mtype != DEAD;
  96. }
  97.  
  98. void verify_read(){
  99.   message_t m;
  100.   m.mtype = READY;
  101.   send(&m);
  102.   rcv(&m);
  103.   if (m.mtype != READY) {
  104.     printf("ERROR %d\n", m.mtype);
  105.   }
  106. }
  107.  
  108. void p1(){
  109.   for (;;) {
  110.     if(!send_shoot()) break;
  111.     if(!rcv_shoot()) break;
  112.   }
  113.   msgctl(msqid, IPC_RMID, NULL);
  114. }
  115.  
  116. void p2(){
  117.   for (;;) {
  118.     if(!rcv_shoot()) break;
  119.     if(!send_shoot()) break;
  120.   }
  121. }
  122.  
  123. int main(int argc, char *argv[])
  124. {
  125.   if (argc != 2) {
  126.     printf("invalid no arguments, quitting\n");
  127.     exit(1);
  128.   }
  129.  
  130.     if (strcmp(argv[1], "p1") == 0) {
  131.         printf("Player1 %s\n", argv[1]);
  132.     pid = 1;
  133.     } else if (strcmp(argv[1], "p2") == 0) {
  134.     printf("Player2 %s\n", argv[1]);
  135.     pid = 2;
  136.   } else {
  137.     printf("Unknown player!!!\n");
  138.     exit(1);
  139.   }
  140.  
  141.   printf("Creating message queues\n");
  142.   if ((msqid = msgget(key, 0600 | IPC_CREAT)) == -1) {
  143.       perror("msgget");
  144.       exit(1);
  145.   }
  146.   printf("MSGID %d\n", msqid);
  147.  
  148.   read_field();
  149.  
  150.   if (pid == 1) {
  151.     p1();
  152.   } else {
  153.     p2();
  154.   }
  155.   return 0;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement