2016年11月17日学习总结

    xiaoxiao2021-11-11  48

    声明:本文转自https://www.oschina.net/code/snippet_919502_25503

    1. [代码]C语言 贪吃蛇游戏   

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 //*******************************************************  //*******************************************************  //******友情提示:如想速度快点,请改小_sleep(500)函数中参数*****  //*******************************************************  //*******************如写的不好,请见谅*********************  //*******************************************************  #include <stdio.h>  #include <stdlib.h>  #include <conio.h>  #include <string.h>  #include <time.h>  const int H = 8;   //地图的高  const int L = 16;  //地图的长  char GameMap[H][L];   //游戏地图  int  key;  //按键保存  int  sum = 1, over = 0;  //蛇的长度, 游戏结束(自吃或碰墙)  int  dx[4] = {0, 0, -1, 1};  //左、右、上、下的方向  int  dy[4] = {-1, 1, 0, 0};  struct Snake   //蛇的每个节点的数据类型  {    int x, y;  //左边位置    int now;   //保存当前节点的方向, 0,1,2,3分别为左右上下  }Snake[H*L];  const char Shead = '@' ;  //蛇头  const char Sbody = '#' ;  //蛇身  const char Sfood = '*' ;  //食物  const char Snode = '.' ;  //'.'在地图上标示为空  void Initial();  //地图的初始化  void Create_Food(); //在地图上随机产生食物  void Show();   //刷新显示地图  void Button();  //取出按键,并判断方向  void Move();   //蛇的移动  void Check_Border();  //检查蛇头是否越界  void Check_Head( int x, int y);   //检查蛇头移动后的位置情况  int main()   {    Initial();    Show();    return 0;  }  void Initial()  //地图的初始化  {    int i, j;    int hx, hy;    system ( "title 贪吃蛇" );  //控制台的标题    memset (GameMap, '.' , sizeof (GameMap));  //初始化地图全部为空'.'    system ( "cls" );    srand ( time (0));   //随机种子    hx = rand ()%H;    //产生蛇头    hy = rand ()%L;    GameMap[hx][hy] = Shead;    Snake[0].x = hx;  Snake[0].y = hy;    Snake[0].now = -1;    Create_Food();   //随机产生食物    for (i = 0; i < H; i++)   //地图显示    {      for (j = 0; j < L; j++)      printf ( "%c" , GameMap[i][j]);     printf ( "\n" );    }          printf ( "\n小小C语言贪吃蛇\n" );    printf ( "按任意方向键开始游戏\n" );         getch();   //先接受一个按键,使蛇开始往该方向走    Button();  //取出按键,并判断方向  }  void Create_Food()  //在地图上随机产生食物  {    int fx, fy;    while (1)    {     fx = rand ()%H;        fy = rand ()%L;           if (GameMap[fx][fy] == '.' )  //不能出现在蛇所占有的位置     {       GameMap[fx][fy] = Sfood;         break ;     }    }  }  void Show()  //刷新显示地图  {    int i, j;    while (1)    {       _sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图     Button();   //先判断按键在移动     Move();     if (over)  //自吃或碰墙即游戏结束     {       printf ( "\n**游戏结束**\n" );      printf ( "     >_<\n" );      getchar ();         break ;     }     system ( "cls" );   //清空地图再显示刷新吼的地图     for (i = 0; i < H; i++)      {       for (j = 0; j < L; j++)       printf ( "%c" , GameMap[i][j]);      printf ( "\n" );     }           printf ( "\n小小C语言贪吃蛇\n" );     printf ( "按任意方向键开始游戏\n" );    }  }  void Button()  //取出按键,并判断方向  {    if (kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0    {      while (kbhit() != 0)  //可能存在多个按键,要全部取完,以最后一个为主         key = getch(); //将按键从控制台中取出并保存到key中     switch (key)     {   //左      case 75:  Snake[0].now = 0;             break ;               //右               case 77:  Snake[0].now = 1;                  break ;               //上      case 72:  Snake[0].now = 2;             break ;               //下      case 80:  Snake[0].now = 3;             break ;     }    }  }  void Move()   //蛇的移动  {    int i, x, y;       int t = sum;  //保存当前蛇的长度    //记录当前蛇头的位置,并设置为空,蛇头先移动    x = Snake[0].x;  y = Snake[0].y;  GameMap[x][y] = '.' ;    Snake[0].x = Snake[0].x + dx[ Snake[0].now ];    Snake[0].y = Snake[0].y + dy[ Snake[0].now ];    Check_Border();   //蛇头是否越界    Check_Head(x, y);  //蛇头移动后的位置情况,参数为: 蛇头的开始位置    if (sum == t)  //未吃到食物即蛇身移动哦       for (i = 1; i < sum; i++)  //要从蛇尾节点向前移动哦,前一个节点作为参照    {     if (i == 1)   //尾节点设置为空再移动      GameMap[ Snake[i].x ][ Snake[i].y ] = '.' ;           if (i == sum-1)  //为蛇头后面的蛇身节点,特殊处理     {      Snake[i].x = x;            Snake[i].y = y;         Snake[i].now = Snake[0].now;     }     else   //其他蛇身即走到前一个蛇身位置     {      Snake[i].x = Snake[i+1].x;            Snake[i].y = Snake[i+1].y;         Snake[i].now = Snake[i+1].now;     }            GameMap[ Snake[i].x ][ Snake[i].y ] = '#' ; //移动后要置为'#'蛇身     }  }  void Check_Border()  //检查蛇头是否越界  {    if (Snake[0].x < 0 || Snake[0].x >= H    || Snake[0].y < 0 || Snake[0].y >= L)        over = 1;  }  void Check_Head( int x, int y)  //检查蛇头移动后的位置情况  {         if (GameMap[ Snake[0].x ][ Snake[0].y ] == '.' )  //为空     GameMap[ Snake[0].x ][ Snake[0].y ] = '@' ;    else     if (GameMap[ Snake[0].x ][ Snake[0].y ] == '*' )  //为食物     {      GameMap[ Snake[0].x ][ Snake[0].y ] = '@' ;        Snake[sum].x = x;   //新增加的蛇身为蛇头后面的那个         Snake[sum].y = y;         Snake[sum].now = Snake[0].now;            GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#' ;       sum++;      Create_Food();  //食物吃完了马上再产生一个食物     }     else      over = 1;  }

    2. [图片] 0_13214197376gGb.gif    

    PS:虽然很多东西我都看不懂,但是觉得很有意思,希望自己也能学的越来越好
    转载请注明原文地址: https://ju.6miu.com/read-678200.html

    最新回复(0)