Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.19 KB | None | 0 0
  1. #include <gtk/gtk.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. struct Vital {
  7. int current;
  8. int maximum;
  9. };
  10.  
  11. double get_fraction (struct Vital v) {
  12. return (double) v.current / (double) v.maximum;
  13. }
  14.  
  15. struct Character {
  16. char name[20];
  17. struct Vital health;
  18. int power;
  19. };
  20.  
  21. struct Character new_character (char *name, int health, int power) {
  22. struct Character new_char;
  23. strncpy(new_char.name, name, 20);
  24. new_char.health.current = health;
  25. new_char.health.maximum = health;
  26. new_char.power = power;
  27. return new_char;
  28. }
  29.  
  30. struct Player {
  31. struct Character character;
  32. int level;
  33. };
  34.  
  35. struct Node {
  36. struct Character character;
  37. struct Node *next;
  38. };
  39.  
  40. struct Node *append (struct Node *queue, struct Character c) {
  41. struct Node *node = (struct Node*) malloc (sizeof(struct Node));
  42. node->character = c;
  43. node->next = NULL;
  44. if (queue == NULL) {
  45. return node;
  46. } else {
  47. struct Node *temp = queue;
  48. while (temp->next != NULL) {
  49. temp = temp->next;
  50. }
  51. temp->next = node;
  52. return queue;
  53. }
  54. }
  55.  
  56. void print_queue (struct Node *queue) {
  57. while (queue != NULL) {
  58. printf("%s\n%d/%d\n%d\n",
  59. (queue->character).name,
  60. (queue->character).health.current,
  61. (queue->character).health.maximum,
  62. (queue->character).power);
  63. queue = queue->next;
  64. }
  65. }
  66.  
  67. struct Node *create_queue () {
  68. struct Node *queue = NULL;
  69. queue = append (queue, new_character ("Prof. X", 30, 10));
  70. queue = append (queue, new_character ("Magneto", 100, 50));
  71. queue = append (queue, new_character ("Storm", 50, 80));
  72. queue = append (queue, new_character ("Iron Man", 70, 20));
  73. return queue;
  74. }
  75.  
  76. /* This callback quits the program */
  77. static gboolean delete_event ( GtkWidget *widget, GdkEvent *event, gpointer data ) {
  78. gtk_main_quit ();
  79. return FALSE;
  80. }
  81.  
  82. void attack_enemy (gpointer *queue) {
  83. printf("%p\n", queue);
  84. printf("%p\n", (struct Node *)queue);
  85. }
  86.  
  87. GtkWidget *get_player_box (gchar *name, int level, gdouble healthFraction, int power) {
  88. GtkWidget *player_box = gtk_vbox_new (TRUE, 0);
  89.  
  90. char level_string[12];
  91. sprintf(level_string, "Level: %d", level);
  92. char power_string[12];
  93. sprintf(power_string, "Power: %d", power);
  94.  
  95. GtkWidget *player_name = gtk_label_new (name);
  96. GtkWidget *player_level = gtk_label_new (level_string);
  97. GtkWidget *player_health = gtk_progress_bar_new ();
  98. gtk_progress_bar_set_fraction ((GtkProgressBar*) player_health, healthFraction);
  99. GtkWidget *player_power = gtk_label_new (power_string);
  100.  
  101. gtk_box_pack_start((GtkBox*) player_box, player_name, TRUE, FALSE, 2);
  102. gtk_widget_show(player_name);
  103. gtk_box_pack_start((GtkBox*) player_box, player_level, TRUE, FALSE, 2);
  104. gtk_widget_show(player_level);
  105. gtk_box_pack_start((GtkBox*) player_box, player_health, TRUE, FALSE, 2);
  106. gtk_widget_show(player_health);
  107. gtk_box_pack_start((GtkBox*) player_box, player_power, TRUE, FALSE, 2);
  108. gtk_widget_show(player_power);
  109.  
  110. return player_box;
  111. }
  112.  
  113. GtkWidget *get_enemy_box (gchar *name, gdouble healthFraction, int power, struct Node *queue) {
  114. GtkWidget *enemy_box = gtk_vbox_new (TRUE, 0);
  115.  
  116. char power_string[12];
  117. sprintf(power_string, "Power: %d", power);
  118.  
  119. GtkWidget *enemy_name = gtk_label_new (name);
  120. GtkWidget *enemy_health = gtk_progress_bar_new ();
  121. gtk_progress_bar_set_fraction ((GtkProgressBar*) enemy_health, healthFraction);
  122. GtkWidget *enemy_power = gtk_label_new (power_string);
  123. GtkWidget *attack_button = gtk_button_new_with_label ("Attack");
  124. g_signal_connect (attack_button, "clicked", G_CALLBACK (attack_enemy), (gpointer*) queue);
  125.  
  126. gtk_box_pack_start((GtkBox*) enemy_box, enemy_name, TRUE, FALSE, 2);
  127. gtk_widget_show(enemy_name);
  128. gtk_box_pack_start((GtkBox*) enemy_box, enemy_health, TRUE, FALSE, 2);
  129. gtk_widget_show(enemy_health);
  130. gtk_box_pack_start((GtkBox*) enemy_box, enemy_power, TRUE, FALSE, 2);
  131. gtk_widget_show(enemy_power);
  132. gtk_box_pack_start((GtkBox*) enemy_box, attack_button, TRUE, FALSE, 2);
  133. gtk_widget_show(attack_button);
  134.  
  135. return enemy_box;
  136. }
  137.  
  138. void add_enemies (GtkWidget *table, struct Node *queue) {
  139. int index = 0;
  140. while (queue != NULL) {
  141. GtkWidget *enemy_box = get_enemy_box (queue->character.name, get_fraction(queue->character.health), queue->character.power, queue);
  142. gtk_table_attach_defaults (GTK_TABLE (table), enemy_box, index % 3, (index % 3) + 1, (index / 3) + 1, (index / 3) + 2);
  143. gtk_widget_show(enemy_box);
  144.  
  145. queue = queue->next;
  146. index++;
  147. }
  148. }
  149.  
  150. int main( int argc, char *argv[] ) {
  151. struct Node *queue = create_queue ();
  152. // print_queue (queue);
  153.  
  154. GtkWidget *window;
  155. GtkWidget *table;
  156.  
  157. gtk_init (&argc, &argv);
  158.  
  159. /* Create a new window */
  160. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  161. gtk_window_set_title (GTK_WINDOW (window), "SpiderQuest");
  162. g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL);
  163. gtk_container_set_border_width (GTK_CONTAINER (window), 20);
  164.  
  165. /* Create a 4x3 table */
  166. table = gtk_table_new (4, 3, TRUE);
  167. gtk_container_add (GTK_CONTAINER (window), table);
  168.  
  169. GtkWidget *player_box = get_player_box ("Spiderman", 4, 0.75, 50);
  170. gtk_table_attach_defaults (GTK_TABLE (table), player_box, 1, 2, 0, 1);
  171. gtk_widget_show(player_box);
  172.  
  173. add_enemies (table, queue);
  174.  
  175. gtk_widget_show (table);
  176. gtk_widget_show (window);
  177.  
  178. gtk_main ();
  179.  
  180. return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement