鱼C论坛

 找回密码
 立即注册
查看: 1140|回复: 0

[技术交流] 改进后的飞机大战

[复制链接]
发表于 2020-3-11 19:22:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
敌机会动了,也会攻击了,不过只能攻击一次,bug很多,在检测方面做的很差,折腾了一天了,从早上9.写到现在,受不了了,暂时这样吧,代码贴出来展示下思路
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <sys/time.h>
  5. #include <signal.h>
  6. #include <ncurses.h>

  7. #define X_MAX 53  地图大小
  8. #define Y_MAX 100
  9. #define BLACKDROP ' ' 背景
  10. #define BOUNDARY '0' 边界
  11. #define ENEMY 'v' 敌机
  12. #define PLANE '^' 自己
  13. #define ATTACK '|' 己方子弹
  14. #define ATTACK1 '*' 地方子弹

  15. typedef struct Enemy 敌机结构体
  16. {
  17.         int x;
  18.         int y;
  19.         _Bool tof;
  20.         struct Enemy *next;
  21. }
  22. Enemy;

  23. typedef struct Enemy_attack 敌机子弹结构体
  24. {
  25.         int x;
  26.         int y;
  27.         struct Enemy_attack *next;
  28. }
  29. Enemy_attack;

  30. typedef struct Attack 己方子弹结构体
  31. {
  32.         int x;
  33.         int y;
  34.         struct Attack *next;
  35. }
  36. Attack;

  37. Enemy *EHEAD, *ETAIL;
  38. Enemy_attack *EAHEAD, *EATAIL;
  39. Attack *HEAD, *TAIL;
  40. int X = 52, Y = 50; 自己坐标

  41. void my_refresh(); 刷新
  42. void printmain(void); 打印菜单
  43. void make_HEAD(void); 创建链表头指针
  44. void set_itimerval(struct itimerval *t); 设定定时时间
  45. void printmap(void); 打印地图
  46. void set_plane(void); 放置飞机
  47. int get_move(char move); 获取移动
  48. void clear_plane(void); 清楚飞机
  49. void plane_attack(void); 攻击指令
  50. void set_attack(int x, int y); 放置子弹
  51. void attack_refresh(void); 刷新子弹
  52. void clear_attack(int x, int y); 清楚子弹
  53. void free_attack(Attack *last, Attack *next); 释放子弹链表

  54. void add_enemy(void); 添加敌机
  55. void move_enemy(void); 敌机移动
  56. void clear_enemy(int x, int y); 清除敌机
  57. void free_enemy(Enemy *last, Enemy *next); 释放敌机链表
  58. void set_enemy(int x, int y); 放置敌机
  59. void enemy_attack(Enemy *next); 敌机攻击
  60. void set_enemy_attack(int x, int y); 放置敌机子弹
  61. void enemy_attack_refresh(void); 刷新敌机子弹
  62. void clear_enemy_attack(int x, int y); 清楚敌机子弹
  63. void free_enemy_attack(Enemy_attack *last, Enemy_attack *next); 释放敌机子弹链表
  64. void exit_game(void); 退出游戏

  65. void exit_game(void)
  66. {
  67.         endwin();
  68.         exit(0);
  69. }

  70. void free_enemy_attack(Enemy_attack *last, Enemy_attack *next)
  71. {
  72.         last->next = next->next;

  73.         free(next);

  74.         refresh();
  75. }

  76. void clear_enemy_attack(int x, int y)
  77. {
  78.         move(x, y);
  79.         addch(BLACKDROP);

  80.         refresh();
  81. }

  82. void enemy_attack_refresh(void)
  83. {
  84.         Enemy_attack *last, *next;

  85.         last = EAHEAD;
  86.         next = EAHEAD->next;

  87.         while(next != NULL)
  88.         {
  89.                 clear_enemy_attack(next->x, next->y);

  90.                 next->x++;

  91.                 move(next->x, next->y);

  92.                 if(inch() == BOUNDARY)
  93.                 {
  94.                         free_enemy_attack(last, next);

  95.                         next = last->next;
  96.                 }
  97.                 else
  98.                 {
  99.                         set_enemy_attack(next->x, next->y);

  100.                         last->next;
  101.                         next = next->next;
  102.                 }
  103.         }

  104.         refresh();
  105. }

  106. void set_enemy_attack(int x, int y)
  107. {
  108.         move(x, y);
  109.         addch(ATTACK1);

  110.         refresh();
  111. }

  112. void enemy_attack(Enemy *next)
  113. {
  114.         Enemy_attack *new;

  115.         new = (Enemy_attack *)malloc(sizeof(Enemy_attack));

  116.         new->x = next->x;
  117.         new->y = next->y;

  118.         if(EAHEAD->next == NULL)
  119.         {
  120.                 EAHEAD->next = new;
  121.         }
  122.         else
  123.         {
  124.                 EATAIL->next = new;
  125.         }

  126.         new->next = NULL;
  127.         EATAIL = new;

  128.         set_enemy_attack(new->x, new->y);

  129.         refresh();
  130. }

  131. void set_enemy(int x, int y)
  132. {
  133.         move(x, y);
  134.         addch(ENEMY);

  135.         refresh();
  136. }

  137. void free_enemy(Enemy *last, Enemy *next)
  138. {
  139.         last->next = next->next;

  140.         free(next);

  141.         refresh();
  142. }

  143. void clear_enemy(int x, int y)
  144. {
  145.         move(x, y);
  146.         addch(BLACKDROP);

  147.         refresh();
  148. }

  149. void move_enemy(void)
  150. {
  151.         Enemy *last, *next;
  152.         int i;
  153.         char a;

  154.         last = EHEAD;
  155.         next = EHEAD->next;

  156.         while(next != NULL)
  157.         {
  158.                 i = rand()%5;

  159.                 clear_enemy(next->x, next->y);

  160.                 switch(i)
  161.                 {
  162.                         case 0:
  163.                                 next->x++;
  164.                                 break;
  165.                         case 1:
  166.                                 next->x--;
  167.                                 break;
  168.                         case 2:
  169.                                 next->y++;
  170.                                 break;
  171.                         case 3:
  172.                                 next->y--;
  173.                                 break;
  174.                         case 4:
  175.                                 if(next->tof == 0)
  176.                                 {
  177.                                         next->tof = 1;
  178.                                         enemy_attack(next);
  179.                                 }
  180.                                 break;
  181.                 }

  182.                 move(next->x, next->y);

  183.                 a = inch();

  184.                 if(a == BOUNDARY || a == ATTACK)
  185.                 {
  186.                         free_enemy(last, next);
  187.                         next = last->next;
  188.                 }
  189.                 else
  190.                 {
  191.                         set_enemy(next->x, next->y);

  192.                         last = next;
  193.                         next = next->next;
  194.                 }
  195.         }

  196.         refresh();
  197. }

  198. void add_enemy(void)
  199. {
  200.         Enemy *enemy;
  201.         int x, y;
  202.         _Bool tof;

  203.         enemy = (Enemy *)malloc(sizeof(Enemy));

  204.         do
  205.         {
  206.                 tof = 1;
  207.                 enemy->x = rand()%(X_MAX - 1) + 1;
  208.                 enemy->y = rand()%(X_MAX - 1) + 1;

  209.                 move(enemy->x, enemy->y);

  210.                 if(inch() !=  BLACKDROP)
  211.                 {
  212.                         tof = 0;
  213.                 }
  214.         }
  215.         while(!tof);

  216.         if(EHEAD->next == NULL)
  217.         {
  218.                 EHEAD->next = enemy;
  219.         }
  220.         else
  221.         {
  222.                 ETAIL->next = enemy;
  223.         }

  224.         enemy->next = NULL;
  225.         ETAIL = enemy;

  226.         refresh();
  227. }

  228. void free_attack(Attack *last, Attack *next)
  229. {
  230.         last->next = next->next;

  231.         free(next);

  232.         refresh();
  233. }

  234. void clear_attack(int x, int y)
  235. {
  236.         move(x, y);
  237.         addch(BLACKDROP);

  238.         refresh();
  239. }

  240. void attack_refresh(void)
  241. {
  242.         Attack *last, *next, *temp;

  243.         last = HEAD;
  244.         next = HEAD->next;

  245.         while(next != NULL)
  246.         {
  247.                 clear_attack(next->x, next->y);

  248.                 next->x--;

  249.                 move(next->x, next->y);

  250.                 if(inch() == BOUNDARY)
  251.                 {
  252.                         free_attack(last, next);
  253.                         next = last->next;
  254.                 }
  255.                 else
  256.                 {
  257.                         set_attack(next->x, next->y);

  258.                         last = next;
  259.                         next = next->next;
  260.                 }
  261.         }

  262.         refresh();
  263. }

  264. void set_attack(int x, int y)
  265. {
  266.         move(x, y);
  267.         addch(ATTACK);

  268.         refresh();
  269. }

  270. void plane_attack(void)
  271. {
  272.         Attack *new;

  273.         new = (Attack *)malloc(sizeof(Attack));

  274.         new->x = X - 1;
  275.         new->y = Y;

  276.         if(HEAD->next == NULL)
  277.         {
  278.                 HEAD->next = new;
  279.         }
  280.         else
  281.         {
  282.                 TAIL->next = new;
  283.         }

  284.         new->next = NULL;
  285.         TAIL = new;

  286.         set_attack(new->x, new->y);

  287.         refresh();
  288. }

  289. void clear_plane(void)
  290. {
  291.         move(X, Y);
  292.         addch(BLACKDROP);

  293.         refresh();
  294. }

  295. int get_move(char move)
  296. {
  297.         int  x, y;
  298.         char a;

  299.         x = X;
  300.         y = Y;

  301.         clear_plane();

  302.         switch(move)
  303.         {
  304.                 case 'w':
  305.                         X--;
  306.                         break;
  307.                 case 'a':
  308.                         Y--;
  309.                         break;
  310.                 case 's':
  311.                         X++;
  312.                         break;
  313.                 case 'd':
  314.                         Y++;
  315.                         break;
  316.                 case 'j':
  317.                         plane_attack();
  318.                         break;
  319.                 case 'q':
  320.                         return 0;
  321.         }

  322.         move(X, Y);

  323.         a = inch();

  324.         if(a == ATTACK1 || a == ENEMY)
  325.         {
  326.                 exit_game();
  327.         }
  328.         if(a == BOUNDARY)
  329.         {
  330.                 X = x;
  331.                 Y = y;
  332.         }


  333.         refresh();

  334.         return 1;
  335. }

  336. void set_plane(void)
  337. {
  338.         move(X, Y);
  339.         addch(PLANE);

  340.         refresh();
  341. }

  342. void printmap(void)
  343. {
  344.         int x, y;

  345.         move(0, 0);
  346.         addstr("      \n      \n ");

  347.         for(x = 0; x <= X_MAX; x++)
  348.         {
  349.                 for(y = 0; y <= Y_MAX; y++)
  350.                 {
  351.                         if(x == 0 || y == 0 || x == X_MAX || y == Y_MAX)
  352.                         {
  353.                                 move(x, y);
  354.                                 addch(BOUNDARY);
  355.                         }
  356.                 }

  357.         }

  358.         move(X_MAX + 1, 0);
  359.         addstr("(w/a/s/d/j/q):");

  360.         refresh();
  361. }

  362. void set_itimerval(struct itimerval *t)
  363. {
  364.         t->it_interval.tv_usec = 200000;
  365.         t->it_interval.tv_sec = 0;
  366.         t->it_value.tv_usec = 10;
  367.         t->it_value.tv_sec = 0;
  368. }

  369. void make_HEAD(void)
  370. {
  371.         HEAD = (Attack *)malloc(sizeof(Attack));
  372.         HEAD->x = 0;
  373.         HEAD->y = 0;
  374.         HEAD->next = NULL;

  375.         EHEAD = (Enemy *)malloc(sizeof(Enemy));
  376.         EHEAD->x = 0;
  377.         EHEAD->y = 0;
  378.         EHEAD->tof = 0;
  379.         EHEAD->next = NULL;

  380.         EAHEAD = (Enemy_attack *)malloc(sizeof(Enemy_attack));
  381.         EAHEAD->x = 0;
  382.         EAHEAD->y = 0;
  383.         EAHEAD->next = NULL;
  384. }

  385. void printmain()
  386. {
  387.         move(0, 0);

  388.         addstr("1.begin\n");
  389.         addstr("2.quit\n");
  390.         addch(':');

  391.         refresh();
  392. }

  393. void my_refresh()
  394. {
  395.         int i = rand()%100;

  396.         attack_refresh();

  397.         if(i >= 0 && i <= 20)
  398.         {
  399.                 add_enemy();
  400.         }

  401.         move_enemy();
  402.         enemy_attack_refresh();

  403.         refresh();
  404. }

  405. int main(void)
  406. {
  407.         struct itimerval t;
  408.         char move;

  409.         initscr();
  410.         cbreak();
  411.         noecho();
  412.         curs_set(0);

  413.         printmain();

  414.         move = getch();

  415.         if(move == '1')
  416.         {
  417.                 make_HEAD();
  418.                 set_itimerval(&t);
  419.                 setitimer(ITIMER_REAL, &t, NULL);
  420.                 signal(SIGALRM, my_refresh);

  421.                 printmap();

  422.                 do
  423.                 {
  424.                         srand(time(NULL));

  425.                         do
  426.                         {
  427.                                 set_plane();
  428.                                 move = getch();
  429.                         }
  430.                         while(move != 'q' && move != 'w' && move != 'a' && move != 's' && move != 'd' && move != 'j');
  431.                 }
  432.                 while(get_move(move));
  433.         }

  434.         endwin();

  435.         return 0;
  436. }
复制代码




小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 04:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表