使用C++语言模拟实现贪吃蛇小游戏

需求分析:

    用C++开发一个能在编译窗口中运行的贪吃蛇小游戏,实现环境为:Microsoft visual C++6.0集成开发环境


算法及程序说明:
用类构造蛇 

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class Snake     
  2. {  
  3. public:  
  4.            int head,tail,body[200],length;  
  5. };  
  6.   
  7. Snake T;  
  8. void init()       //初始化函数  
  9. {  
  10.        T.head=3;  
  11.        T.tail=0;  
  12.        memset(T.body,0,sizeof(T.body));       // memset(array,值,count)  
  13. //     此函数功能:将array数组从头到count的内容全部  设置为//这个“值”。  
  14. }  

绘图实现

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int map[100][100];     // 定义一个整形的二维数组做标记  
  2. char maze[100][100];         // 根据map数组的不同数值显示不同符号,   -1表示墙,1表  
  3.    //示食物,0表示空,以此绘图  
  4. for(i=1;i<20;i++)  
  5.     for(j=1;j<40;j++){  
  6.      card[k++]=i*100+j;  
  7.    }//用card数组来存障碍墙内位置的编号  
  8. random_shuffle(card,card+19*39);//打乱编号的次序,用于后//面随机生成食物  
  9. //random_shuffle(card,card+19*39)  
  10. //将card数组中前19*39个数据的顺序打乱  

地图的预处理

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. for(i=0;i<=40;i++)  
  2. map[i][0]=map[20][i]=map[i][40]=map[0][i]=-1;  
  3. memset(maze,' ',sizeof(maze));  
  4. for(i=0;i<=20;i++)  
  5.        for(j=0;j<=40;j++){  
  6.               if(map[i][j]==-1)  
  7.               maze[i][j]='#';  
  8.               else if(map[i][j]==1)  
  9.               maze[i][j]='o';  
  10.        }  
  11.        for(i=T.tail;i!=T.head;){  
  12.               sum=T.body[i];  
  13.               maze[sum/100][sum0]='*';  
  14.               ++i;  
  15.               i%=ML;  
  16.        }  
  17.   
  18. sum=T.body[(i-1+ML)%ML];  
  19. maze[sum/100][sum0]='@';  

最后生成图像

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. for(i=0;i<=20;i++)  
  2. {  
  3.        for(j=0;j<=40;j++)  
  4.        {  
  5.               cout<<maze[i][j];  
  6.        }  
  7.        cout<<endl;  
  8. }  

画面动态显示实现
主要运用system("CLS")的刷屏功能来实现画面的动态效果。
利用临时无穷循环制作刷屏时间控制

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int TM=300;    //300毫秒  
  2. (TM>100)?(TM=300-T.length*10):(TM=100);  
  3. int start=clock();  
  4. while(clock()-start<=TM && !kbhit())     //kbhit()检查当前是否有键盘输入,若有则返回一个非0值,否//则返回0  
  5. {  
  6.               ;  
  7. }  



蛇运动的实现(以向上为例)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. if(order=='w'){  
  2.        jud=order;  
  3.        if(map[sum/100-1][sum0]!=-1){  
  4.               for(i=T.tail;i!=T.head;){                       
  5.                      temp=T.body[i];                           
  6.                      map[temp/100][temp0]=0;             
  7.                      i++;  
  8.                      i%=ML;  
  9.               }  
  10.               up();  
  11.        }else{  
  12.                      system("CLS");//提示游戏结束  
  13.                      break;  
  14.        }  
  15. }  

UP()函数

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void up()  
  2. {  
  3.        int sum,i;  
  4.        sum=T.body[(T.head-1+ML)%ML]-100;  
  5.        if(map[sum/100][sum0]==1){  
  6.               T.length++;  
  7.               T.body[T.head++]=sum;  
  8.               T.head%=ML;  
  9.               map[sum/100][sum0]=0;  
  10.               for(i=T.tail;i!=T.head;){  
  11.                      sum=T.body[i];  
  12.                      map[sum/100][sum0]=-1;  
  13.                      i++;  
  14.                      i%=ML;  
  15.               }  
  16.                             while(1){  
  17.                      sum=getnum();  
  18.                      if(map[sum/100][sum0]==0){  
  19.                             map[sum/100][sum0]=1; break;  
  20.                      }  
  21.               }  
  22.               for(i=T.tail;i!=T.head;){  
  23.                      sum=T.body[i];  
  24.                      map[sum/100][sum0]=0;  
  25.                      i++;  
  26.                      i%=ML;  
  27.               }  
  28.        }else{  
  29.               T.body[T.head++]=sum;  
  30.               T.head%=ML;  
  31.               T.tail=(++T.tail)%ML;  
  32.        }  
  33. }  


测试报告

游戏开始时,score为0;小蛇默认从左上角向右走。
每吃一个食物,蛇身长度+1,score+10。
 


当蛇头触碰到四周墙壁或触碰到蛇身时,游戏结束,显示最终得分。


当蛇吃食物的个数到达程序中设定的某个值时,挑战游戏成功。


完整代码:    》仅供参考,如有错误尽请谅解《

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<iostream>  
  2. #include<cstdlib>//该函数主要可以提供一些函数与符号常量  
  3. #include<algorithm>//提供大量基于迭代器的非成员模版函数  
  4. #include<conio.h>//其中定义了通过控制台进行数据输入和数据输出的函数  
  5. #include<time.h>//日期和时间头文件  
  6. #include<windows.h>  
  7. #define ML 100     
  8. using namespace std;  
  9. class Snake    //声明一个类Snake  
  10. {  
  11. public:  
  12.     int head,tail,body[200],length;  
  13. };  
  14. Snake T;              //定义一个对象T  
  15. int map[100][100];      //定义一个整形的二维数组做标记用  
  16. char maze[100][100];    //根据map数组的不同数值显示不同符号,以此绘图  
  17. void init()         //初始化函数  
  18. {  
  19.     T.head=3;  
  20.     T.tail=0;  
  21. //  T.length=0;  
  22.     memset(T.body,0,sizeof(T.body));  
  23. }  
  24. int card[800];  
  25. char order;     //接收指令  
  26. int getnum()  
  27. {  
  28.     static int n=0;  
  29.     n++;  
  30.     n=n%800;  
  31.     return card[n];  
  32. }  
  33.   
  34. void up()  
  35. {  
  36.     int sum,i;  
  37.     sum=T.body[(T.head-1+ML)%ML]-100;  
  38.     if(map[sum/100][sum%100]==1)  
  39.     {  
  40.         T.length++;  
  41.         T.body[T.head++]=sum;  
  42.         T.head%=ML;  
  43.         map[sum/100][sum%100]=0;  
  44.         for(i=T.tail;i!=T.head;)  
  45.         {  
  46.             sum=T.body[i];  
  47.             map[sum/100][sum%100]=-1;  
  48.             i++;  
  49.             i%=ML;  
  50.         }  
  51.         while(1)  
  52.         {  
  53.             sum=getnum();  
  54.             if(map[sum/100][sum%100]==0)  
  55.             {  
  56.                 map[sum/100][sum%100]=1;  
  57.                 break;  
  58.             }  
  59.         }  
  60.         for(i=T.tail;i!=T.head;)  
  61.         {  
  62.             sum=T.body[i];  
  63.             map[sum/100][sum%100]=0;  
  64.             i++;  
  65.             i%=ML;  
  66.         }  
  67.     }  
  68.     else  
  69.     {  
  70.         T.body[T.head++]=sum;  
  71.         T.head%=ML;  
  72.         T.tail=(++T.tail)%ML;  
  73.     }  
  74. }  
  75. void down()  
  76. {  
  77.     int sum,i;  
  78.     sum=T.body[(T.head-1+ML)%ML]+100;  
  79.     if(map[sum/100][sum%100]==1)  
  80.     {  
  81.         T.length++;  
  82.         T.body[T.head++]=sum;  
  83.         T.head%=ML;  
  84.         map[sum/100][sum%100]=0;  
  85.         for(i=T.tail;i!=T.head;)  
  86.         {  
  87.             sum=T.body[i];  
  88.             map[sum/100][sum%100]=-1;  
  89.             i++;  
  90.             i%=ML;  
  91.         }  
  92.         while(1)  
  93.         {  
  94.             sum=getnum();  
  95.             if(map[sum/100][sum%100]==0)  
  96.             {  
  97.                 map[sum/100][sum%100]=1;  
  98.                 break;  
  99.             }  
  100.         }  
  101.         for(i=T.tail;i!=T.head;)  
  102.         {  
  103.             sum=T.body[i];  
  104.             map[sum/100][sum%100]=0;  
  105.             i++;  
  106.             i%=ML;  
  107.         }  
  108.     }  
  109.     else  
  110.     {  
  111.         T.body[T.head++]=sum;  
  112.         T.head%=ML;  
  113.         T.tail=(++T.tail)%ML;  
  114.     }  
  115. }  
  116. void right()  
  117. {  
  118.     int sum,i;  
  119.     sum=T.body[(T.head-1+ML)%ML]+1;  
  120.     if(map[sum/100][sum%100]==1)  
  121.     {  
  122.         T.length++;  
  123.         T.body[T.head++]=sum;  
  124.         T.head%=ML;  
  125.         map[sum/100][sum%100]=0;  
  126.         for(i=T.tail;i!=T.head;)  
  127.         {  
  128.             sum=T.body[i];  
  129.             map[sum/100][sum%100]=-1;  
  130.             i++;  
  131.             i%=ML;  
  132.         }  
  133.         while(1)  
  134.         {  
  135.             sum=getnum();  
  136.             if(map[sum/100][sum%100]==0)  
  137.             {  
  138.                 map[sum/100][sum%100]=1;  
  139.                 break;  
  140.             }  
  141.         }  
  142.         for(i=T.tail;i!=T.head;)  
  143.         {  
  144.             sum=T.body[i];  
  145.             map[sum/100][sum%100]=0;  
  146.             i++;  
  147.             i%=ML;  
  148.         }  
  149.     }  
  150.     else  
  151.     {  
  152.         T.body[T.head++]=sum;  
  153.         T.head%=ML;  
  154.         T.tail=(++T.tail)%ML;  
  155.     }  
  156. }  
  157. void left()  
  158. {  
  159.     int sum,i;  
  160.     sum=T.body[(T.head-1+ML)%ML]-1;  
  161.     if(map[sum/100][sum%100]==1)  
  162.     {  
  163.         T.length++;  
  164.         T.body[T.head++]=sum;  
  165.         T.head%=ML;  
  166.         map[sum/100][sum%100]=0;  
  167.         for(i=T.tail;i!=T.head;)  
  168.         {  
  169.             sum=T.body[i];  
  170.             map[sum/100][sum%100]=-1;  
  171.             i++;  
  172.             i%=ML;  
  173.         }  
  174.         while(1)  
  175.         {  
  176.             sum=getnum();  
  177.             if(map[sum/100][sum%100]==0)  
  178.             {  
  179.                 map[sum/100][sum%100]=1;  
  180.                 break;  
  181.             }  
  182.         }  
  183.         for(i=T.tail;i!=T.head;)  
  184.         {  
  185.             sum=T.body[i];  
  186.             map[sum/100][sum%100]=0;  
  187.             i++;  
  188.             i%=ML;  
  189.         }  
  190.     }  
  191.     else  
  192.     {  
  193.         T.body[T.head++]=sum;  
  194.         T.head%=ML;  
  195.         T.tail=(++T.tail)%ML;  
  196.     }  
  197. }  
  198. int main()  
  199. {  
  200.     memset(map,0,sizeof(map));  
  201.     memset(maze,' ',sizeof(maze));  
  202.     int i,j,sum=0,k=0,temp;  
  203.     for(i=1;i<20;i++)  
  204.         for(j=1;j<40;j++)  
  205.         {  
  206.             card[k++]=i*100+j;  
  207.         }  
  208.     srand(time(0));  
  209.     temp=rand()%10+1;  
  210.     while(temp--)  
  211.     random_shuffle(card,card+19*39);  
  212.     for(i=0;i<=40;i++)  
  213.         map[i][0]=map[20][i]=map[i][40]=map[0][i]=-1;  
  214.     init();  
  215.     T.length=1;  
  216.     T.body[T.head++]=101;  
  217.     T.head%=ML;  
  218.       
  219.     sum=getnum();  
  220.     map[sum/100][sum%100]=1;  
  221.       
  222.     char jud='d';  
  223.     int TM=300,start;  
  224.     while(1)  
  225.     {     
  226.         (TM>100)?(TM=300-T.length*60):(TM=50);  
  227.         start=clock();  
  228.         //利用临时无穷循环制作刷屏时间  
  229.         while(clock()-start<=TM && !kbhit())           //kbhit() 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0  
  230.         {  
  231.             ;  
  232.         }  
  233.         if(kbhit()&&(order=getch(),order=='w'||order=='s'||order=='a'||order=='d'))  
  234.         {  
  235.           
  236.             sum=T.body[(T.head-1+ML)%ML];  
  237.             system("CLS");  
  238.             for(i=T.tail;i!=T.head;)  
  239.             {  
  240.                 temp=T.body[i];  
  241.                 map[temp/100][temp%100]=-1;  
  242.                 i++;  
  243.                 i%=ML;  
  244.             }  
  245.             if(order=='w')  
  246.             {  
  247.                 jud=order;  
  248.                 //cout<<"-->w\n";  
  249.                 if(map[sum/100-1][sum%100]!=-1)  
  250.                 {  
  251.                     for(i=T.tail;i!=T.head;)  
  252.                     {  
  253.                         temp=T.body[i];  
  254.                         map[temp/100][temp%100]=0;  
  255.                         i++;  
  256.                         i%=ML;  
  257.                     }  
  258.                     up();  
  259.                 }  
  260.                 else  
  261.                 {  
  262.                     system("CLS");  
  263.                     cout<<"============================================"<<endl;  
  264.                     cout<<"       很遗憾,你输了!!!最后得分为:"<<T.length*10-10<<endl;  
  265.                     cout<<"============================================"<<endl;  
  266.                     break;  
  267.                 }  
  268.                   
  269.             }  
  270.             else if(order=='a')  
  271.             {  
  272.                 jud=order;  
  273.                 //cout<<"-->a\n";  
  274.                 if(map[sum/100][sum%100-1]!=-1)  
  275.                 {  
  276.                     for(i=T.tail;i!=T.head;)  
  277.                     {  
  278.                         temp=T.body[i];  
  279.                         map[temp/100][temp%100]=0;  
  280.                         i++;  
  281.                         i%=ML;  
  282.                     }  
  283.                     left();  
  284.                 }  
  285.                 else  
  286.                 {  
  287.                     system("CLS");  
  288.                     cout<<"============================================"<<endl;  
  289.                     cout<<"       很遗憾,你输了!!!最后得分为:"<<T.length*10-10<<endl;  
  290.                     cout<<"============================================"<<endl;  
  291.                     break;  
  292.                 }  
  293.             }  
  294.             else if (order=='s')  
  295.             {  
  296.                 jud=order;  
  297.                 //cout<<"-->s\n";  
  298.                 if(map[sum/100+1][sum%100]!=-1)  
  299.                 {  
  300.                     for(i=T.tail;i!=T.head;)  
  301.                     {  
  302.                         temp=T.body[i];  
  303.                         map[temp/100][temp%100]=0;  
  304.                         i++;  
  305.                         i%=ML;  
  306.                     }  
  307.                     down();  
  308.                 }  
  309.                 else  
  310.                 {  
  311.                     system("CLS");  
  312.                     cout<<"============================================"<<endl;  
  313.                     cout<<"       很遗憾,你输了!!!最后得分为:"<<T.length*10-10<<endl;  
  314.                     cout<<"============================================"<<endl;  
  315.                     break;  
  316.                 }  
  317.             }  
  318.             else if(order=='d')  
  319.             {  
  320.                 jud=order;  
  321.                 //cout<<"-->d\n";  
  322.                 if(map[sum/100][sum%100+1]!=-1)  
  323.                 {  
  324.                     for(i=T.tail;i!=T.head;)  
  325.                     {  
  326.                         temp=T.body[i];  
  327.                         map[temp/100][temp%100]=0;  
  328.                         i++;  
  329.                         i%=ML;  
  330.                     }  
  331.                     right();  
  332.                 }  
  333.                 else  
  334.                 {  
  335.                     system("CLS");  
  336.                     cout<<"============================================"<<endl;  
  337.                     cout<<"       很遗憾,你输了!!!最后得分为:"<<T.length*10-10<<endl;  
  338.                     cout<<"============================================"<<endl;  
  339.                     break;  
  340.                 }  
  341.             }  
  342.             memset(maze,' ',sizeof(maze));  
  343.             for(i=0;i<=20;i++)  
  344.                 for(j=0;j<=40;j++)  
  345.                 {  
  346.                     if(map[i][j]==-1)  
  347.                         maze[i][j]='#';  
  348.                     else if(map[i][j]==1)  
  349.                         maze[i][j]='o';  
  350.                 }  
  351.             for(i=T.tail;i!=T.head;)  
  352.             {  
  353.                 sum=T.body[i];  
  354.                 maze[sum/100][sum%100]='*';  
  355.                 ++i;  
  356.                 i%=ML;  
  357.             }  
  358.             sum=T.body[(i-1+ML)%ML];  
  359.             maze[sum/100][sum%100]='@';  
  360.             cout<<"游戏操作:  ↑:w   ↓:s   ←:a   →:d"<<endl;  
  361.             cout<<"score: "<<T.length*10-10<<endl;  
  362.             for(i=0;i<=20;i++)  
  363.             {  
  364.                 for(j=0;j<=40;j++)  
  365.                 {  
  366.                     cout<<maze[i][j];  
  367.                 }  
  368.                 cout<<endl;  
  369.             }  
  370.         }  
  371.         else  
  372.         {  
  373.                 sum=T.body[(T.head-1+ML)%ML];  
  374.                 system("CLS");  
  375.                 for(i=T.tail;i!=T.head;)  
  376.                 {  
  377.                     temp=T.body[i];  
  378.                     map[temp/100][temp%100]=-1;  
  379.                     i++;  
  380.                     i%=ML;  
  381.                 }  
  382.                 if(jud=='w')  
  383.                 {  
  384.                 //cout<<"-->w\n";  
  385.                 if(map[sum/100-1][sum%100]!=-1)  
  386.                 {  
  387.                     for(i=T.tail;i!=T.head;)  
  388.                     {  
  389.                         temp=T.body[i];  
  390.                         map[temp/100][temp%100]=0;  
  391.                         i++;  
  392.                         i%=ML;  
  393.                     }  
  394.                     up();  
  395.                 }  
  396.                 else  
  397.                 {  
  398.                     system("CLS");  
  399.                     cout<<"============================================"<<endl;  
  400.                     cout<<"       很遗憾,你输了!!!最后得分为:"<<T.length*10-10<<endl;  
  401.                     cout<<"============================================"<<endl;  
  402.                     break;  
  403.                 }  
  404.                   
  405.             }  
  406.             else if(jud=='a')  
  407.             {  
  408.                 //cout<<"-->a\n";  
  409.                 if(map[sum/100][sum%100-1]!=-1)  
  410.                 {  
  411.                     for(i=T.tail;i!=T.head;)  
  412.                     {  
  413.                         temp=T.body[i];  
  414.                         map[temp/100][temp%100]=0;  
  415.                         i++;  
  416.                         i%=ML;  
  417.                     }  
  418.                     left();  
  419.                 }  
  420.                 else  
  421.                 {  
  422.                     system("CLS");  
  423.                     cout<<"============================================"<<endl;  
  424.                     cout<<"       很遗憾,你输了!!!最后得分为:"<<T.length*10-10<<endl;  
  425.                     cout<<"============================================"<<endl;  
  426.                     break;  
  427.                 }  
  428.             }                                                         
  429.             else if (jud=='s')  
  430.             {  
  431.                 //cout<<"-->s\n";  
  432.                 if(map[sum/100+1][sum%100]!=-1)  
  433.                 {  
  434.                     for(i=T.tail;i!=T.head;)  
  435.                     {  
  436.                         temp=T.body[i];  
  437.                         map[temp/100][temp%100]=0;  
  438.                         i++;  
  439.                         i%=ML;  
  440.                     }  
  441.                     down();  
  442.                 }  
  443.                 else  
  444.                 {  
  445.                     system("CLS");  
  446.                     cout<<"============================================"<<endl;  
  447.                     cout<<"       很遗憾,你输了!!!最后得分为:"<<T.length*10-10<<endl;  
  448.                     cout<<"============================================"<<endl;  
  449.                     break;  
  450.                 }  
  451.             }  
  452.             else if(jud=='d')  
  453.             {  
  454.                 //cout<<"-->d\n";  
  455.                 if(map[sum/100][sum%100+1]!=-1)  
  456.                 {  
  457.                     for(i=T.tail;i!=T.head;)  
  458.                     {  
  459.                         temp=T.body[i];  
  460.                         map[temp/100][temp%100]=0;  
  461.                         i++;  
  462.                         i%=ML;  
  463.                     }  
  464.                     right();  
  465.                 }  
  466.                 else  
  467.                 {  
  468.                     system("CLS");  
  469.                     cout<<"============================================"<<endl;  
  470.                     cout<<"       很遗憾,你输了!!!最后得分为:"<<T.length*10-10<<endl;  
  471.                     cout<<"============================================"<<endl;  
  472.                     break;  
  473.                 }  
  474.             }  
  475.               
  476.             if(T.length>=20){  
  477.                     system("CLS");  
  478.                     cout<<"============================================"<<endl;  
  479.                     cout<<"                 恭喜,过关!!! "<<endl;  
  480.                     cout<<"============================================"<<endl;  
  481.                     break;  
  482.             }  
  483.   
  484.             memset(maze,' ',sizeof(maze));  
  485.             for(i=0;i<=20;i++)  
  486.                 for(j=0;j<=40;j++)  
  487.                 {  
  488.                     if(map[i][j]==-1)  
  489.                         maze[i][j]='#';  
  490.                     else if(map[i][j]==1)  
  491.                         maze[i][j]='o';  
  492.                 }  
  493.             for(i=T.tail;i!=T.head;)  
  494.             {  
  495.                 sum=T.body[i];  
  496.                 maze[sum/100][sum%100]='*';  
  497.                 ++i;  
  498.                 i%=ML;  
  499.             }  
  500.             sum=T.body[(i-1+ML)%ML];  
  501.             maze[sum/100][sum%100]='@';  
  502.             cout<<"游戏操作:  ↑:w   ↓:s   ←:a   →:d"<<endl;  
  503.             cout<<"score: "<<T.length*10-10<<endl;  
  504.             for(i=0;i<=20;i++)  
  505.             {  
  506.                 for(j=0;j<=40;j++)  
  507.                 {  
  508.                     cout<<maze[i][j];  
  509.                 }  
  510.                 cout<<endl;  
  511.             }  
  512.         }  
  513.           
  514.     }  
  515.     system("pause");  
  516.     return 0;  
  517. }  



 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值