Advertisement
patryk

GOWNO

Feb 20th, 2015
547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.01 KB | None | 0 0
  1. #include <gtk/gtk.h>
  2. #include <ctype.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. #include <stdbool.h>
  8. #include <unistd.h>
  9. #include <sys/ipc.h>
  10. #include <sys/msg.h>
  11. #include <sys/sem.h>
  12. #include <sys/types.h>
  13. #include <signal.h>
  14.  
  15. //----SEMAFORY----
  16. int clientReadySID, serverReadySID;
  17. struct sembuf clientReady;
  18. struct sembuf serverReady;
  19.  
  20.  
  21. //----STRUKTURY----
  22. struct prepareClient {
  23.     long mtype;
  24.     int CSQueueNumber;
  25.     int SCQueueNumber;
  26. };
  27.  
  28. struct clientStatus {
  29.     long mtype;
  30.     int surowce;
  31.     int lekka_piechota;
  32.     int ciezka_piechota;
  33.     int jazda;
  34.     int robotnicy;
  35.     int punkty;
  36. };
  37.  
  38. struct message {
  39.     long mtype;
  40.     int value;
  41. };
  42.  
  43. struct atak {
  44.     long mtype;
  45.     int lekka_p;
  46.     int ciezka_p;
  47.     int jazda;
  48. };
  49.  
  50. //----INNE_ZMIENNE-----
  51. char playerNumber = 0;
  52. int client_server_QID;
  53. int server_client_QID;
  54.  
  55. GtkWidget *window;
  56. GtkWidget *progressBar;
  57. GtkWidget *waitingLabel;
  58. GtkWidget *lekkaPiechotaLabel;
  59. GtkWidget *ciezkaPiechotaLabel;
  60. GtkWidget *jazdaLabel;
  61. GtkWidget *robotnicyLabel;
  62. GtkWidget *surowceLabel;
  63. GtkWidget *punktyLabel;
  64. GtkWidget *lekka_piechota_entry;
  65. GtkWidget *ciezka_piechota_entry;
  66. GtkWidget *jazda_entry;
  67. GtkWidget *victoryLabel;
  68. GtkWidget *defeatLabel;
  69.  
  70.  
  71. bool isInteger(const char *str) {
  72.    if (!*str || (int)*str == 48)
  73.       return false;
  74.  
  75.    while (*str)
  76.    {
  77.       if (!isdigit(*str))
  78.          return false;
  79.       else
  80.          ++str;
  81.    }
  82.  
  83.    return true;
  84. }
  85.  
  86. void closeClient(GtkWidget *widget, gpointer data) {
  87.     clientReady.sem_op = 1;
  88.     semop(clientReadySID, &clientReady, 1);
  89.     gtk_main_quit();
  90. }
  91.  
  92. void waitForRespond() {
  93.     while (1) {
  94.         struct message recruitResult;
  95.         int recruitResult_ID = msgget(server_client_QID, 0606 | IPC_CREAT);
  96.  
  97.         msgrcv(recruitResult_ID, &recruitResult, 20, 8, 0);
  98.  
  99.         if(recruitResult.value == 1)
  100.             printf("UDALO SIE");
  101.         else
  102.             printf("Brak surowców");
  103.         fflush(stdout);
  104.     }
  105. }
  106.  
  107. void waitForGameStatus(gpointer data) {
  108.     struct message gameInfo;
  109.     int gameInfo_ID = msgget(server_client_QID, 0606 | IPC_CREAT);
  110.    
  111.     msgrcv(gameInfo_ID, &gameInfo, 20, 2, 0);
  112.    
  113.     if(gameInfo.value == 0) {
  114.         printf("PRZEGRANA\n");
  115.     } else {
  116.         printf("WYGRANA\n");
  117.     }  
  118.     fflush(stdout);
  119. }
  120.  
  121. //================--OBSŁUGA-BUTTONÓW--====================
  122.  
  123. void lekka_piechota_click(GtkWidget *widget, gpointer data) {
  124.     GtkEntry* entry = (GtkEntry*)data;
  125.     char *dane;
  126.     dane = (char*)gtk_entry_get_text(entry);
  127.     if(isInteger(dane)) {
  128.         struct message recruit;
  129.         int recruit_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  130.         recruit.mtype = 3;
  131.         recruit.value = atoi(dane);
  132.        
  133.         msgsnd(recruit_ID, &recruit, 20, 0);   
  134.  
  135.         gtk_entry_set_text(GTK_ENTRY(entry), "");  
  136.     }
  137.  
  138. }
  139.  
  140. void ciezka_piechota_click(GtkWidget *widget, gpointer data) {
  141.     GtkEntry* entry = (GtkEntry*)data;
  142.     char *dane;
  143.     dane = (char*)gtk_entry_get_text(entry);
  144.     if(isInteger(dane)) {
  145.         struct message recruit;
  146.         int recruit_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  147.  
  148.         recruit.mtype = 4;
  149.         recruit.value = atoi(dane);
  150.  
  151.         msgsnd(recruit_ID, &recruit, 20, 0);
  152.  
  153.         gtk_entry_set_text(GTK_ENTRY(entry), "");
  154.     }
  155. }
  156.  
  157. void jazda_click(GtkWidget *widget, gpointer data) {
  158.     GtkEntry* entry = (GtkEntry*)data;
  159.     char *dane;
  160.     dane = (char*)gtk_entry_get_text(entry);
  161.     if(isInteger(dane)) {
  162.         struct message recruit;
  163.         int recruit_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  164.  
  165.         recruit.mtype = 5;
  166.         recruit.value = atoi(dane);
  167.  
  168.         msgsnd(recruit_ID, &recruit, 20, 0);
  169.  
  170.         gtk_entry_set_text(GTK_ENTRY(entry), "");
  171.     }
  172. }
  173.  
  174. void robotnicy_click(GtkWidget *widget, gpointer data) {
  175.     GtkEntry* entry = (GtkEntry*)data;
  176.     char *dane;
  177.     dane = (char*)gtk_entry_get_text(entry);
  178.     if(isInteger(dane)) {
  179.         struct message recruit;
  180.         int recruit_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  181.  
  182.         recruit.mtype = 6;
  183.         recruit.value = atoi(dane);
  184.  
  185.         msgsnd(recruit_ID, &recruit, 20, 0);
  186.  
  187.         gtk_entry_set_text(GTK_ENTRY(entry), "");
  188.     }
  189. }
  190.  
  191. void walka_click(GtkWidget *widget, gpointer dane) {
  192.     char *lekka_piechota_text;
  193.     char *ciezka_piechota_text;
  194.     char *jazda_text;
  195.     char *lp_label, *cp_label, *j_label;
  196.     GtkEntry* entry_LP = (GtkEntry*)lekka_piechota_entry;
  197.     GtkEntry* entry_CP = (GtkEntry*)ciezka_piechota_entry;
  198.     GtkEntry* entry_J = (GtkEntry*)jazda_entry;
  199.  
  200.     lekka_piechota_text = (char*)gtk_entry_get_text(entry_LP);
  201.     ciezka_piechota_text = (char*)gtk_entry_get_text(entry_CP);
  202.     jazda_text = (char*)gtk_entry_get_text(entry_J);
  203.     lp_label = (char*)gtk_label_get_text((GtkLabel*)lekkaPiechotaLabel);
  204.     cp_label = (char*)gtk_label_get_text((GtkLabel*)ciezkaPiechotaLabel);
  205.     j_label = (char*)gtk_label_get_text((GtkLabel*)jazdaLabel);
  206.  
  207.  
  208.     if( (isInteger(lekka_piechota_text) || strcmp(lekka_piechota_text, "0") == 0)
  209.     &&(isInteger(ciezka_piechota_text) || strcmp(ciezka_piechota_text, "0") == 0)
  210.     &&(isInteger(jazda_text) || strcmp(jazda_text, "0") == 0)
  211.     &&!(strcmp(lekka_piechota_text, "0") == 0 && strcmp(ciezka_piechota_text, "0") == 0 && strcmp(ciezka_piechota_text, "0") == 0)
  212.     &&!(strcmp(lp_label, "0") == 0 && strcmp(cp_label, "0") == 0 && strcmp(j_label, "0") == 0)
  213. ) {
  214.         struct atak attack;
  215.         int attack_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  216.  
  217.         attack.mtype = 10;
  218.         attack.lekka_p = atoi(lekka_piechota_text);
  219.         attack.ciezka_p = atoi(ciezka_piechota_text);
  220.         attack.jazda = atoi(jazda_text);
  221.  
  222.         msgsnd(attack_ID, &attack, 30, 0);
  223.     }
  224.    
  225. }
  226.  
  227.  
  228. static gpointer serverIsReady(gpointer data) {
  229.  
  230.     struct prepareClient pC;
  231.     int pC_ID = msgget(1000, 0606 | IPC_CREAT);
  232.  
  233.     msgrcv(pC_ID, &pC, 10, 0, 0);
  234.     client_server_QID = pC.CSQueueNumber;
  235.     server_client_QID = pC.SCQueueNumber;
  236.  
  237.     serverReady.sem_num = 0;
  238.     serverReady.sem_flg = 0;
  239.     serverReady.sem_op = -1;
  240.     semop(serverReadySID, &serverReady, 1);
  241.     GtkWidget* window = (GtkWidget*)data;
  242.     gdk_threads_enter();
  243.     gtk_widget_show_all(window);
  244.     gtk_widget_hide(progressBar);
  245.     gtk_widget_hide(waitingLabel);
  246.     gtk_widget_hide(victoryLabel);
  247.     gtk_widget_hide(defeatLabel);
  248.     gdk_threads_leave();
  249.  
  250.     if(fork()) {
  251.         while (1) {
  252.  
  253.             struct clientStatus cS;
  254.             int cS_ID = msgget(server_client_QID, 0606 | IPC_CREAT);
  255.  
  256.             msgrcv(cS_ID, &cS, 50, 1, 0);  
  257.    
  258.             char LP_Status[10], CP_Status[10], J_Status[10], R_Status[10], S_Status[10], P_Status[10];
  259.             sprintf(LP_Status, "%d", cS.lekka_piechota);
  260.             sprintf(CP_Status, "%d", cS.ciezka_piechota);
  261.             sprintf(J_Status, "%d", cS.jazda);
  262.             sprintf(R_Status, "%d", cS.robotnicy);
  263.             sprintf(S_Status, "%d", cS.surowce);
  264.             sprintf(P_Status, "%d", cS.punkty);
  265.  
  266.             gdk_threads_enter();
  267.             gtk_label_set_text((GtkLabel*)lekkaPiechotaLabel, LP_Status);
  268.             gtk_label_set_text((GtkLabel*)ciezkaPiechotaLabel, CP_Status);
  269.             gtk_label_set_text((GtkLabel*)jazdaLabel, J_Status);
  270.             gtk_label_set_text((GtkLabel*)robotnicyLabel, R_Status);
  271.             gtk_label_set_text((GtkLabel*)surowceLabel, S_Status);
  272.             gtk_label_set_text((GtkLabel*)punktyLabel, P_Status);
  273.             gdk_threads_leave();
  274.         }
  275.     } else if (fork())
  276.         waitForRespond();
  277.     else
  278.         waitForGameStatus(window);
  279. }
  280.  
  281.  
  282. gboolean pulse(gpointer data) {
  283.     gtk_progress_bar_pulse(GTK_PROGRESS_BAR(data));
  284.     return TRUE;
  285. }
  286.  
  287. /**
  288.  Funkcja odpowiadająca za inicjalizacje całego GUI
  289.     @param window wskaźnik na okno
  290.     @param container wskaźnik na kontener przechowujący widgety
  291.     @param lekka_piechota wskaźnik na button dla lekkiej piechoty
  292.     @param ciezka_piechota wskaznik na button dla ciezkiej piechoty
  293.     @param jazda wskaźnik na button dla jazdy
  294.     @param robotnicy wskaźnik na button dla robotników
  295.     @param walka wskaźnik na button dla walki
  296. */
  297. void GTK_INIT(int argc, char* argv[], GtkWidget *window, GtkWidget *container, GtkWidget *lekka_piechota, GtkWidget *ciezka_piechota, GtkWidget *jazda, GtkWidget *robotnicy, GtkWidget *walka) {
  298.   GtkWidget *frame;
  299.     GtkWidget *lekka_piechota_label;
  300.     GtkWidget *robotnicy_entry;
  301.     GtkWidget *waitingContainer;
  302.  
  303.     GThread *waitForServer;
  304.     GError *error = NULL;
  305.  
  306.     if(!g_thread_supported())
  307.         g_thread_init(NULL);
  308.     gdk_threads_init();
  309.     gdk_threads_enter();
  310.   gtk_init(&argc, &argv);
  311.  
  312. //---------------TWORZENIE OBIEKTÓW----------------
  313.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  314.     container = gtk_fixed_new();
  315.     lekka_piechota = gtk_button_new_with_label("Lekka Piechota");
  316.     ciezka_piechota = gtk_button_new_with_label("Ciężka Piechota");
  317.     jazda = gtk_button_new_with_label("Jazda");
  318.     robotnicy = gtk_button_new_with_label("Robotnicy");
  319.     walka = gtk_button_new_with_label("Walka");
  320.     frame = gtk_frame_new("    GAME INFO    ");
  321.     lekka_piechota_label = gtk_label_new("Lekka Piechota: \n\nCiezka Piechota: \n\nJazda: \n\nRobotnicy: \n\nSurowce: \n\nPunkty: ");
  322.     lekka_piechota_entry = gtk_entry_new();
  323.     ciezka_piechota_entry = gtk_entry_new();
  324.     jazda_entry = gtk_entry_new();
  325.     robotnicy_entry = gtk_entry_new();
  326.     progressBar = gtk_progress_bar_new();
  327.     waitingLabel = gtk_label_new("Waiting for second player.");
  328.     victoryLabel = gtk_label_new("ZWYCIESTWO!");
  329.     defeatLabel = gtk_label_new("PRZEGRANA!");
  330.     waitingContainer = gtk_fixed_new();
  331.     lekkaPiechotaLabel = gtk_label_new("0");
  332.     ciezkaPiechotaLabel = gtk_label_new("0");
  333.     jazdaLabel = gtk_label_new("0");
  334.     robotnicyLabel = gtk_label_new("0");
  335.     surowceLabel = gtk_label_new("0");
  336.     punktyLabel = gtk_label_new("0");
  337.  
  338. //--------------INICJALIZACJA OBIEKTÓW--------------
  339.   gtk_container_add(GTK_CONTAINER(window), container);
  340.  
  341.   gtk_window_set_default_size (GTK_WINDOW(window), 480, 350);
  342.   gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  343.   gtk_window_set_title (GTK_WINDOW(window), "Gra");
  344.  
  345.     //-------------DODANIE BUTTONÓW------------
  346.   gtk_fixed_put(GTK_FIXED(container), lekka_piechota, 5, 305);
  347.   gtk_widget_set_size_request(lekka_piechota, 120, 35);
  348.  
  349.   gtk_fixed_put(GTK_FIXED(container), ciezka_piechota, 126, 305);
  350.   gtk_widget_set_size_request(ciezka_piechota, 122, 35);
  351.  
  352.   gtk_fixed_put(GTK_FIXED(container), jazda, 248, 305);
  353.   gtk_widget_set_size_request(jazda, 57, 35);
  354.  
  355.   gtk_fixed_put(GTK_FIXED(container), robotnicy, 305, 305);
  356.   gtk_widget_set_size_request(robotnicy, 83, 35);
  357.  
  358.   gtk_fixed_put(GTK_FIXED(container), walka, 405, 305);
  359.   gtk_widget_set_size_request(walka, 70, 35);
  360.  
  361.   gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
  362.   gtk_fixed_put(GTK_FIXED(container), frame, 10, 10);
  363.   gtk_widget_set_size_request(frame, 460, 250);
  364.  
  365.     gtk_fixed_put(GTK_FIXED(container), lekka_piechota_label, 130, 50);
  366.  
  367.     //----------DODANIE PÓL TYPU ENTRY-----------
  368.     gtk_fixed_put(GTK_FIXED(container), lekka_piechota_entry, 5, 270);
  369.     gtk_widget_set_size_request(lekka_piechota_entry, 120, 30);
  370.  
  371.     gtk_fixed_put(GTK_FIXED(container), ciezka_piechota_entry, 126, 270);
  372.     gtk_widget_set_size_request(ciezka_piechota_entry, 122, 30);
  373.  
  374.     gtk_fixed_put(GTK_FIXED(container), jazda_entry, 248, 270);
  375.     gtk_widget_set_size_request(jazda_entry, 57, 30);
  376.  
  377.     gtk_fixed_put(GTK_FIXED(container), robotnicy_entry, 305, 270);
  378.     gtk_widget_set_size_request(robotnicy_entry, 83, 30);
  379.  
  380.  
  381.     gtk_fixed_put(GTK_FIXED(container), progressBar, 162, 175);
  382.     g_timeout_add(90, ( GSourceFunc ) pulse, progressBar);
  383.     gtk_fixed_put(GTK_FIXED(container), waitingLabel, 148, 151);
  384.  
  385.     gtk_fixed_put(GTK_FIXED(container), lekkaPiechotaLabel, 250, 51);
  386.     gtk_fixed_put(GTK_FIXED(container), ciezkaPiechotaLabel, 250, 85);
  387.     gtk_fixed_put(GTK_FIXED(container), jazdaLabel, 250, 119);
  388.     gtk_fixed_put(GTK_FIXED(container), robotnicyLabel, 250, 153);
  389.     gtk_fixed_put(GTK_FIXED(container), surowceLabel, 250, 187);
  390.     gtk_fixed_put(GTK_FIXED(container), punktyLabel, 250, 221);
  391.     gtk_fixed_put(GTK_FIXED(container), victoryLabel, 250, 250);
  392.     gtk_fixed_put(GTK_FIXED(container), defeatLabel, 250, 250);
  393.  
  394. //------------DEKLARACJE FINALIZUJĄCE--------------
  395.   g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(closeClient), NULL);
  396.  
  397.     g_signal_connect(lekka_piechota, "pressed", G_CALLBACK(lekka_piechota_click), (gpointer)lekka_piechota_entry);
  398.     g_signal_connect(ciezka_piechota, "pressed", G_CALLBACK(ciezka_piechota_click), (gpointer)ciezka_piechota_entry);
  399.     g_signal_connect(jazda, "pressed", G_CALLBACK(jazda_click), (gpointer)jazda_entry);
  400.     g_signal_connect(robotnicy, "pressed", G_CALLBACK(robotnicy_click), (gpointer)robotnicy_entry);
  401.     g_signal_connect(walka, "pressed", G_CALLBACK(walka_click), NULL);
  402.  
  403.     gtk_widget_show(window);
  404.     gtk_widget_show(container);
  405.     gtk_widget_show(progressBar);
  406.     gtk_widget_show(waitingLabel);
  407.    
  408.     waitForServer = g_thread_create(serverIsReady, (gpointer)window, FALSE, &error);
  409.  
  410.     gtk_main();
  411.     gdk_threads_leave();
  412. }
  413.  
  414. int main (int argc, char* argv[]) {
  415.      GtkWidget *container;
  416.      GtkWidget *lekka_piechota;
  417.     GtkWidget *ciezka_piechota;
  418.     GtkWidget *jazda;
  419.      GtkWidget *robotnicy;
  420.     GtkWidget *walka;
  421.    
  422.     clientReadySID = semget(7001, 1, 0600 | IPC_CREAT);
  423.     serverReadySID = semget(7002, 1, 0600 | IPC_CREAT);
  424.  
  425.     if(clientReadySID == -1 || serverReadySID == -1) {
  426.         exit(1);
  427.     }
  428.  
  429.     clientReady.sem_num = 0;
  430.     clientReady.sem_flg = 0;
  431.     clientReady.sem_op = 1;
  432.     semop(clientReadySID, &clientReady, 1);
  433.    
  434.     GTK_INIT(argc, argv, window, container, lekka_piechota, ciezka_piechota, jazda, robotnicy, walka);
  435.    
  436.     kill(0, SIGKILL);
  437.    
  438.   return 0;
  439. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement