zoukankan      html  css  js  c++  java
  • C语言 小游戏之贪吃蛇

            还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路。

    前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来。

    如今大三,经过了这一年半的编程,如今认为这个C语言的贪吃蛇还是比較简单的,花的时间不非常多!

    我认为主要是思路正确,基本上就米什么大的问题。 

    如今贴上我的代码和我的详解,希望大家多交流。

    首先说下我这个贪吃蛇仅仅是一个简单的,游戏结束有2种可能:一碰墙,二自杀即蛇头碰到蛇身。

    如有不好之处,请见谅把。

     

    首先说下我这个贪吃蛇仅仅是一个简单的,游戏结束有2种可能:一碰墙,二自杀即蛇头碰到蛇身。
    如有不好之处,请见谅把。
     
    
    
    //*******************************************************
    //**************版权所有***2011.9.20***咸鱼**************
    //*******************************************************
    //*友情提示:如想速度快点,请改小_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("
    ");
     }
      
     printf("
    小小C语言贪吃蛇
    ");
     printf("按随意方向键開始游戏
    ");
     
     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("
    **游戏结束**
    ");
       printf("     >_<
    ");
       getchar();
          break;
      }
      system("cls");   //清空地图再显示刷新吼的地图
      for(i = 0; i < H; i++) 
      { 
       for(j = 0; j < L; j++)
        printf("%c", GameMap[i][j]);
       printf("
    ");
      }
      
      printf("
    小小C语言贪吃蛇
    ");
      printf("按随意方向键開始游戏
    ");
     }
    }
    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;
    }



     

  • 相关阅读:
    CSS3动画设置后台登录页背景切换图片
    类别联动下拉菜单
    自己写的一个逻辑分页
    TP5多入口设置
    zabbix安装配置界面点击next step没反应
    nginx访问不了zabbix安装配置界面
    mount挂载问题
    linux下ssh的几种验证方式
    linux下nat配置
    Linux命令行上程序执行的那一刹那!
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3853520.html
Copyright © 2011-2022 走看看