贪食蛇的程序

来源:互联网 发布:unity3d和php开发网站 编辑:程序博客网 时间:2024/04/29 13:45


无聊,分析了一个用C语言写的贪食蛇的程序。

写的非常简练,就是函数的名字起得不是很好。


[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. #include <windows.h>  
  3.   
  4. #define KUAN 20         //地图的大小  
  5. int iz[KUAN][KUAN];     //地图  
  6.   
  7. struct _JieDian            //蛇的结点位置,使用链表结构来存储蛇身上各结点的位置  
  8. {  
  9.     _JieDian *pNext;       //下一个结点  
  10.     POINT pt;              //在地图中的位置  
  11. };  
  12.   
  13. POINT ptShiWu;                      //食物的位置  
  14.   
  15. struct _She    
  16. {  
  17.     _JieDian *SheTou;           //蛇头  
  18.     _JieDian *SheWei;           //蛇尾  
  19.     int iFangXiang;              //移动方向  
  20. }She;                           //蛇的结构体  
  21.   
  22. //初始化函数,用来初始化蛇的位置和移动方向  
  23. //以及随机产生食物的位置  
  24. void ChuShiHua()             //在Main中调用  
  25. {  
  26.     She.SheTou=new _JieDian;   //创建蛇头  
  27.     She.SheTou->pNext=NULL;    //初始蛇没有身体,只有一个蛇头结点  
  28.     She.SheTou->pt.x=6;        //初始化蛇头的位置x,y  
  29.     She.SheTou->pt.y=6;  
  30.     She.SheWei=She.SheTou;     //初始化蛇尾=蛇头,说明蛇还没有身体  
  31.     She.iFangXiang=0;          //初始化方向  
  32.     ptShiWu.x=rand()%20;            //随机产生食物的位置   
  33.     ptShiWu.y=rand()%20;            //随机产生食物的位置   
  34.     iz[She.SheTou->pt.y][She.SheTou->pt.x]=1;   //在地图上标记1,表示蛇头,用于后面的显示  
  35.     iz[ptShiWu.y][ptShiWu.x]=2;                 //在地图上标记2,表示食物,用于后面的显示  
  36. }  
  37.   
  38. void pr()                  //在Move中调用,pr是print的缩写,用来画图的  
  39. {  
  40.     printf("\n\n");           //两行空白  
  41.     for (int i=0;i<KUAN;i++)  
  42.     {  
  43.         printf("\t\t");          //两个制表符  
  44.         for (int j=0;j<KUAN;j++)  
  45.         {  
  46.             //地图中存0表示空白█,2表示食物☆,1表示蛇□  
  47.             printf(iz[i][j]==0?"█":iz[i][j]==2?"☆":"□");        //画地图,有食物,蛇和空白  
  48.         }  
  49.         printf("\n");           //画完了一行  
  50.     }  
  51. }  
  52.   
  53. // 蛇吃食物函数  
  54. // 需要增加蛇身,重新随机生成食物  
  55. void SheChiShi()               //在Move中调用,    
  56. {  
  57.     if(iz[She.SheWei->pt.y][She.SheWei->pt.x]!=2)  //蛇尾的位置不是食物的位置则返回  
  58.         return;  
  59.     _JieDian *p=new _JieDian;        //创建一个蛇身结点  
  60.     p->pNext=NULL;                    //下一结点为空  
  61.     p->pt=ptShiWu;                    //在食物的位置  
  62.     switch(She.iFangXiang)            //蛇的移动方向,根据移动方向来改变位置  
  63.     {  
  64.     case 1:p->pt.y--;break;          //上移一个  
  65.     case 2:p->pt.x--;break;          //左移一个  
  66.     case 3:p->pt.x++;break;          //右移一个  
  67.     case 4:p->pt.y++;break;          //下移一个  
  68.     }  
  69.     iz[p->pt.y][p->pt.x]=1;          //标记蛇头的新位置  
  70.     She.SheWei->pNext=p;             //加入蛇的尾部  
  71.     She.SheWei=p;                    //作为新的蛇尾  
  72.     iz[ptShiWu.y][ptShiWu.x]=1;      //食物的位置变成了蛇的身体  
  73.     ptShiWu.x=rand()%KUAN;           //生成新的食物位置  
  74.     ptShiWu.y=rand()%KUAN;  
  75.     iz[ptShiWu.y][ptShiWu.x]=2;      //在地图上标记食物的位置  
  76. }  
  77.   
  78. //蛇的移动  
  79. //这里的蛇头其实是链表的头部,实际是蛇的尾部,链表是从蛇的尾部指向蛇头部的  
  80. void Move()               //在Main中调用  
  81. {  
  82.     _JieDian *p1=She.SheTou;                            //保存蛇链表头结点  
  83.     if(iz[She.SheTou->pt.y][She.SheTou->pt.x]==1 )      //如果头结点的位置为1,则变成0,表示蛇移走了  
  84.         iz[She.SheTou->pt.y][She.SheTou->pt.x]=0;  
  85.     She.SheTou->pt=She.SheWei->pt;                  //头结点位置指向链表尾,这是真的蛇头位置                  
  86.     switch(She.iFangXiang)                          //蛇的移动方向,改变头结点位置  
  87.     {  
  88.     case 1:She.SheTou->pt.y=(She.SheWei->pt.y+KUAN-1)%KUAN;break;     //上y-1  
  89.     case 2:She.SheTou->pt.x=(She.SheWei->pt.x+KUAN-1)%KUAN;break;     //左x-1  
  90.     case 3:She.SheTou->pt.x=(She.SheWei->pt.x+1)%KUAN;break;        //右x+1  
  91.     case 4:She.SheTou->pt.y=(She.SheWei->pt.y+1)%KUAN;break;        //下y-1  
  92.     }  
  93.     She.SheWei->pNext=She.SheTou;               //将新走的一步结点加入链表尾部  
  94.     She.SheWei=She.SheTou;                      //产生新的链表尾部  
  95.     if(She.SheTou->pNext!=NULL)                   
  96.         She.SheTou=She.SheTou->pNext;             //重新指回链表头部  
  97.     p1->pNext=NULL;                                  //链表尾的指针清空                  
  98.     if(iz[She.SheWei->pt.y][She.SheWei->pt.x]==0)   //地图上添加蛇链表尾的位置,也就是新走的一步产生的蛇的身体  
  99.         iz[She.SheWei->pt.y][She.SheWei->pt.x]=1;  
  100.     SheChiShi();                                    //蛇吃食物  
  101.     pr();                                           //打印地图  
  102. }  
  103.   
  104. void main()  
  105. {  
  106.     ChuShiHua();                                    //初始化  
  107.     while (1)  
  108.     {  
  109.         //下面函数的参数参考:http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx  
  110.         if(GetAsyncKeyState(87)&0x8000)She.iFangXiang=1;            //W键,蛇向上移动  
  111.         else if(GetAsyncKeyState(65)&0x8000)She.iFangXiang=2;       //A键,蛇向左移动  
  112.         else if(GetAsyncKeyState(68)&0x8000)She.iFangXiang=3;       //D键,蛇向右移动  
  113.         else if(GetAsyncKeyState(83)&0x8000)She.iFangXiang=4;       //S键,蛇向下移动  
  114.         system("cls");                   //清屏  
  115.         Move();                          //移动蛇  
  116.         Sleep(60);                       //挂起60ms  
  117.     }  
  118. }  


此文章来自于【http://blog.csdn.net/huangxy10/article/details/8040101】

0 0
原创粉丝点击