标题:c语言贪吃蛇 要怎么重新开始 要怎么写
只看楼主
kobekobecurr
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2018-7-4
结帖率:0
已结贴  问题点数:20 回复次数:2 
c语言贪吃蛇 要怎么重新开始 要怎么写
#include <stdio.h>
 #include <stdlib.h>
 #include <conio.h>
 #include <windows.h>
 #include <mmsystem.h>
 #include <time.h>
 #include <string.h>
  char arr_block[20][48] = { "■■■■■■■■■■■■■■■■■■■■■■■\n",                        //字符串数组,一个■占两个字节,要显示20*23的边框
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■                                          ■\n",
                             "■■■■■■■■■■■■■■■■■■■■■■■\n"};




 int arr_snack[20][3]={0};                                   //蛇身的每一节需要横纵坐标以及移动方向3个值,用二维数组存放
                                                             //arr_snack[n][0]存放第n-1节蛇身的纵坐标
                                                             //arr_snack[n][1]存放第n-1节蛇身的横坐标
                                                             //arr_snack[n][2]存放第n-1节蛇身的移动方向
                                                             //蛇身可以很多节,在此使用20节,代表蛇身最长为20节


 enum{to_east = 2,to_west = -2,to_south = 1,to_north = -1};  //枚举四个方向,东西方向移动一次是一个■所以是2


 int snackdirection = to_west;                               //蛇第一次出现时默认方向是向西
 bool foodflag = true; //为1时调用food函数生成食物,为0时跳过该函数
 int row ;    //食物所在的行
 int col ;    //食物所在的列
 int length = 2;//初始化时蛇为三节,代表蛇尾数组下标,用于growup函数


 void welcome();
 void start();
 void block();
 void randomposition();
 void displaysnack();
 void dropsnack();
 void move();
 void direction();
 bool gameover();
 void food();
 void growup();
 int bitself();
 void pause();


 int main()
 {
     welcome();//显示游戏操作提示

     start(); //按回车开始游戏

     randomposition(); //随机生成一个三节蛇的位置

     while(1)
     {
     system("cls");//清屏
     direction();
     growup();
     food();
     if(gameover()==false)
     {
         printf("\t\t你撞墙了\n");
         printf("\t\tgame over\n");
         printf("\t\t你的得分:%d\n",10*(length-2));
         break;
     }
     if(bitself()==0)
     {
         printf("\t\t你咬到自己的尾巴了\n");
         printf("\t\tgame over\n");
         printf("\t\t你的得分:%d\n",10*(length-2));
         break;
     }
     move();
     block();
 printf("\t\tscore:%d",10*(length-2));
     Sleep(500);
     pause();
     }

     system("pause");
     system("cls");
     return main();
 }






 /**************************
 welcome
 显示欢迎界面和操作说明
 **************************/
 void welcome()
 {
     printf("\t\t\t《欢迎来到贪吃蛇游戏世界》\n");
     printf("\t\t\t 按键操作:上下左右:WSAD\n");
     printf("\t\t\t 按回车开始游戏\n");
     printf("\t\t\t 按空格键暂停游戏 按任意键继续游戏\n");
     printf("\t\t\t 游戏下方会显示你的得分\n");
 }
 /**************************
 start
 按' '开始游戏
 **************************/
 void start()
 {
     char s;
     while(1)
     {
         s = _getch();
         if(s == '\r'||s=='\n')
         {
             break;
         }
     }
 }


 /**************************
 block
 显示■障碍物
 打印字符串数组,displaysnack和dropsnack都是改变字符串数组中的元素,并不显示
 **************************/
  void block()//显示四周障碍物,■占两个字节
 {
      int i=0;
      for(i = 0;i < 20;i ++)
      {
          printf("%s",arr_block[i]);
      }
 }
 /**************************
 randomposition
 在■障碍里随机生成一条三节蛇
 生成横纵坐标的随机数并初始化其方向为西
 从西向东依次为第一节,第二节,第三节
 **************************/
  void randomposition()//只在游戏刚开始时调用一次= -1
  {
     int X ;
     int Y ;
     srand((unsigned int)time(NULL));
     X = rand()%16 + 1;  //蛇第一次出现有三节,X坐标范围1-19
     Y = rand()%16 + 2;  //Y坐标范围1-18
     //第一节
     arr_snack[0][0] = Y;
     arr_snack[0][1] = X * 2; //■占两个字节
     arr_snack[0][2] = to_west;
     //第二节
     arr_snack[1][0] = Y;
     arr_snack[1][1] = (X + 1) * 2;
     arr_snack[1][2] = to_west;
     //第三节
     arr_snack[2][0] = Y;
     arr_snack[2][1] = (X + 2) * 2;
     arr_snack[2][2] = to_west;


     displaysnack();
  }


 /**************************
 displaysnack
 显示蛇
 即在原本显示障碍的字符串数组中,在蛇的横纵坐标处用"■"替换原有的"  "
 **************************/
  void displaysnack()
  {
      int i;
      for(i = 0;arr_snack[i][0] != 0;i++)//有值的时候复制
      {
          strncpy(&arr_block[arr_snack[i][0]][arr_snack[i][1]],"■",2);
      }
  }


 /**************************
 dropsnack
 显示蛇
 即在原本显示障碍和蛇身的字符串数组中,在蛇的横纵坐标处用"  "替换原有的"■"
 **************************/
  void dropsnack()
  {
      int i;
      for(i = 0;arr_snack[i][0] != 0;i++)//有值的时候复制
      {
          strncpy(&arr_block[arr_snack[i][0]][arr_snack[i][1]],"  ",2);
      }
  }


 /**************************
 move
 让蛇移动
 若不处理蛇头,只相当于蛇所有的值向后移动一节,蛇头的值不变
 **************************/
  void move()
 {
     dropsnack();
     int i;
     for(i = 19;i >= 1;i --)
     {
         if(arr_snack[i][0] == 0)  //遍历过于浪费,过滤空的节
             continue;
         arr_snack[i][0] = arr_snack[i-1][0];//将蛇身前一节的三个元素分别赋给该节蛇身的后一节
         arr_snack[i][1] = arr_snack[i-1][1];
         arr_snack[i][2] = arr_snack[i-1][2];
     }

     arr_snack[0][2] = snackdirection;

     if(arr_snack[0][2] == to_west || arr_snack[0][2] == to_east)
     {
         arr_snack[0][1] += arr_snack[0][2];
     }
     else
     {
         arr_snack[0][0] += arr_snack[0][2];
     }
     displaysnack();
 }


 /**************************
 direction
 检测按键输入,控制蛇头方向
 控制蛇头的方向就能通过move里的赋值改变整个蛇身的方向
 蛇不能按照原方向掉头,所以要另加判断
 **************************/
 void direction()
 {
     if(GetAsyncKeyState('W'))
     {
         if(arr_snack[0][2] != to_south)
         snackdirection = to_north;
     }
     if(GetAsyncKeyState('S'))
     {
         if(arr_snack[0][2] != to_north)
         snackdirection = to_south;
     }
     if(GetAsyncKeyState('A'))
     {
         if(arr_snack[0][2] != to_east)
         snackdirection = to_west;
     }
     if(GetAsyncKeyState('D'))
     {
         if(arr_snack[0][2] != to_west)
         snackdirection = to_east;
     }
 }


 /**************************
 gameover
 如果蛇头再走一步碰到■就跳出
 **************************/
bool gameover()
 {
    int i;
     if(arr_snack[0][2] == to_west || arr_snack[0][2] == to_east)
     {
         if(strncmp(&arr_block[arr_snack[0][0]][arr_snack[0][1] + arr_snack[0][2]],"■",2) == 0)
         {
             return false;
         }
     }
     else
     {
         if(strncmp(&arr_block[arr_snack[0][0] + arr_snack[0][2]][arr_snack[0][1]],"■",2) == 0)
         {
             return false;
         }
         
     }
     return true;
     
 }
 /**************************
 food
 随机产生食物,要避免与蛇身和障碍重合
 **************************/
 void food()
 {
     int i;
     int temp = false;
     if(foodflag == true)
     {
         srand((unsigned int)time(NULL));
         while(1)
         {
             row = rand()%16 + 2;  //row坐标范围1-19
             col = rand()%18 + 2;  //col坐标范围1-21
             for(i = 0;arr_snack[i][0] != 0;i++)//有值的时候复制
             {
                 if(arr_snack[i][0] != row && arr_snack[i][1] != col * 2)
                 {
                    temp = true;
                 }
             }
             if(temp == true)
                 break;
         }


         strncpy(&arr_block[row][col * 2],"★",2);


     }
     foodflag = false;
 }
/***蛇身边长**/

 void growup()
 {
     if(arr_snack[0][0] == row && arr_snack[0][1] == col*2)//蛇头和食物重合就变长
     {
         if(arr_snack[length][2] == to_east)
         {
             arr_snack[length+1][0] = arr_snack[length][0];
             arr_snack[length+1][1] = arr_snack[length][1] - 2;
             arr_snack[length+1][2] = arr_snack[length][2];
         }
         if(arr_snack[length][2] == to_west)
         {
             arr_snack[length+1][0] = arr_snack[length][0];
             arr_snack[length+1][1] = arr_snack[length][1] + 2;
             arr_snack[length+1][2] = arr_snack[length][2];
         }
         if(arr_snack[length][2] == to_north)
         {
             arr_snack[length+1][0] = arr_snack[length][0] + 1;
             arr_snack[length+1][1] = arr_snack[length][1];
             arr_snack[length+1][2] = arr_snack[length][2];
         }
         if(arr_snack[length][2] == to_south)
         {
             arr_snack[length+1][0] = arr_snack[length][0] - 1;
             arr_snack[length+1][1] = arr_snack[length][1];
             arr_snack[length+1][2] = arr_snack[length][2];
         }
         length ++;
         foodflag = true;
     }
 }
 int bitself()
 {
      int i;
      for(i=1;arr_snack[i][0] != 0;i++)
      {
          if(arr_snack[0][0]==arr_snack[i][0]&&arr_snack[0][1]==arr_snack[i][1])
              return 0;

      }
 }
 void pause()
{
    if(GetAsyncKeyState(VK_SPACE))
    {
                system("pause");               
    }
}
搜索更多相关主题的帖子: int 坐标 length void printf 
2018-07-04 11:17
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:10 
2018-07-04 11:22
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:10 
回复 2楼 自学的数学
大佬
那个是要安装easyx图形库的,感觉楼主那个代码更适合于直接用windows.h里面的函数写
还是这个贴比较适合
https://bbs.bccn.net/viewthread.php?tid=442229&highlight=%2Bwmf2014

~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-07-04 16:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488368-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.127967 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved