• C程序设计 贪吃蛇分析(3)


    显示模仿别人,然后是自己做了点修改,包括游戏结束和界面上。。

    这个终于写出来了。

    早上的时间没有白费。

      1 //Lee. 控制台 贪吃蛇
      2 //测试版本
      3 
      4 
      5 #include<stdio.h>
      6 #include<windows.h>
      7 #include<conio.h>
      8 #include<time.h>
      9 #include<stdlib.h>
     10 
     11 #define UP 72        //定义上下左右常量
     12 #define DOWN 80
     13 #define LEFT 75
     14 #define RIGHT 77
     15 
     16 int X, Y;//食物坐标
     17 
     18 int Map[79][24]={{0}};    //    地图尺寸,其实有食物记为1
     19 int over=0;             //用来标记游戏结束
     20 
     21 struct Snake
     22 {
     23     int x, y;            //坐标
     24     int direction;        //方向
     25 }Snake[100];            //蛇最多100个节点
     26 
     27 int length = 3;            //初始化蛇的长度为3
     28 
     29 void GamePrint();        //游戏开始画面函数
     30 void Gameinit();        //游戏初始化函数
     31 void Sweep_Screem();    //清屏函数
     32 void Gotoxy(int , int); //光标移动函数
     33 void Hid_Cursor();        //光标隐藏函数
     34 void Snake_Move();        //蛇运动函数
     35 void Create_Food();        //食物产生函数
     36 void Pwall();            //画墙函数
     37 void Key();                //键盘操作函数
     38 void Hit_Wall();        //判断是否撞墙
     39 void Eat_Itself();        //判断是否咬到自己
     40 void Whether_Eat();        //判断蛇是否吃到食物
     41 void GameRun();            //游戏运行函数
     42 
     43 int main()
     44 {
     45     Hid_Cursor();
     46     GamePrint();
     47     Gameinit();        //游戏初始化函数
     48     GameRun();
     49 
     50     return 0;
     51 }
     52 
     53 
     54 
     55 
     56 void GamePrint()        //游戏开始画面函数
     57 {
     58     Gotoxy(30,9);
     59         printf("Welcome to RedSnake.");
     60     Gotoxy(36,12);
     61         printf("by_Lee.");
     62     Sleep(2000);
     63     Sweep_Screem();
     64     Gotoxy(30, 11);
     65     printf("方向键 ↑ 向上");
     66     Gotoxy(30, 12);
     67     printf("方向键 ↓ 向下");
     68     Gotoxy(30, 13);
     69     printf("方向键 ← 向左");
     70     Gotoxy(30, 14);
     71     printf("方向键 → 向右");
     72     Gotoxy(30, 15);
     73     printf("按 ESC 键 退出游戏");
     74     Sleep(2000);   
     75     Sweep_Screem();
     76     Pwall();            //画墙函数
     77     Sleep(1300);
     78 }
     79 
     80 
     81 void Gameinit()
     82 {
     83     Snake[0].x = 10;
     84     Snake[0].y = 12;
     85     Snake[1].x = 8;
     86     Snake[1].y = 12;
     87     Snake[2].x = 6;
     88     Snake[2].y = 12;
     89     Snake[0].direction = RIGHT;
     90     Gotoxy(10, 12);
     91     printf("");
     92     Gotoxy(8, 12);
     93     printf("");
     94     Gotoxy(6, 12);
     95     printf("");
     96 }
     97 
     98 
     99 void Sweep_Screem()//清屏函数
    100 {
    101     int i;
    102     Gotoxy(0, 0);
    103     for(i = 0;i < 25; i++)
    104     {
    105         printf("                                                                                ");
    106     }
    107 }
    108 
    109 void Gotoxy(int x, int y)//移动光标
    110 {
    111     COORD coord; 
    112     coord.X=x;
    113     coord.Y=y;
    114     SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
    115 }
    116 
    117 void Hid_Cursor()        //光标隐藏函数
    118 {
    119     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    120     CONSOLE_CURSOR_INFO cci;
    121     GetConsoleCursorInfo(hOut,&cci);
    122     cci.bVisible=0;//赋1为显示,赋0为隐藏
    123     SetConsoleCursorInfo(hOut,&cci);
    124 }
    125 
    126 void Snake_Move()        //蛇运动函数
    127 {
    128     int i;
    129     Gotoxy(Snake[0].x, Snake[0].y);
    130         printf("");
    131     Gotoxy(Snake[1].x, Snake[1].y);
    132         printf("");
    133     Gotoxy(Snake[length].x, Snake[length].y);
    134         printf(" ");
    135     Whether_Eat();                    //判断蛇是否吃到食物
    136     Eat_Itself();                    //判断蛇是否咬到自己
    137     for(i = length; i > 0; i--)        //移动蛇的坐标
    138         Snake[i] = Snake[i-1];
    139     Key();                            //判断用户的键盘输入
    140     switch(Snake[0].direction)
    141     {
    142         case 72: Snake[0].y-=1; break;
    143         case 80: Snake[0].y+=1; break;
    144         case 75: Snake[0].x-=2; break;
    145         case 77: Snake[0].x+=2; break;
    146     }    
    147 }
    148 
    149 
    150 void Create_Food()    //食物产生函数
    151 {
    152     int i;
    153     if(Map[X][Y] == 0)
    154     {
    155         srand((unsigned int)time(0) + X);
    156         X = (rand() % 38 + 1) * 2;
    157         srand((unsigned int)time(0) + Y + rand());
    158         Y = rand() % 23 + 1;
    159         for(i = 0; i < length; i++)
    160             if(Snake[i].x == X && Snake[i].y == Y)
    161             {
    162                 i = -1;
    163                 break;
    164             }
    165             if(i != -1)
    166             {
    167                 Map[X][Y] = 1;
    168                 Gotoxy(X, Y);
    169                 printf("");
    170             }
    171     }
    172 }
    173 
    174 void Whether_Eat()            //判断蛇是否吃到食物
    175 {
    176     if(Map[Snake[0].x][Snake[0].y] == 1)
    177     {    
    178         length++;
    179         Map[Snake[0].x][Snake[0].y] = 0;
    180     }
    181 }
    182 
    183 void Eat_Itself()            //判断蛇是否咬到自己
    184 {
    185     int i;
    186     for(i = 3; i < length; i++)
    187     {
    188         if(Snake[0].x == Snake[i].x && Snake[0].y == Snake[i].y)
    189         {
    190             over=1;
    191             break;
    192         }
    193     }
    194 }
    195 
    196 
    197 void Hit_Wall()            //判断是否撞墙
    198 {
    199     if(Snake[0].x == 0)        Snake[0].x = 76;
    200     if(Snake[0].x == 78)    Snake[0].x = 2;
    201     if(Snake[0].y == 0)        Snake[0].y = 23;
    202     if(Snake[0].y == 24)    Snake[0].y = 1;
    203 }
    204 
    205 
    206 void Key()//用户是否操作键盘
    207 {
    208     if(_kbhit())//判断是否按键
    209     {              
    210         int ch = _getch();
    211         if(ch == 224)//判断按的是不是方向键
    212         {
    213            ch = _getch();
    214            if(ch+Snake[0].direction != 152)//判断按键是否是反方向
    215            Snake[0].direction = ch;//如果不是就改变蛇头方向
    216         }
    217         else if(ch == 27)//判断用户是否退出
    218         {
    219             exit(0);
    220         }
    221     }
    222 }
    223 
    224 void Pwall()//画墙函数
    225 {
    226     int i, j;
    227     for(i = 39,j = 0; j < 39; i--, j++)
    228     {
    229         Gotoxy(j*2, 0);
    230         printf("");
    231         if(j < 24)
    232         {
    233             Gotoxy(78, j);
    234             printf("");
    235         }
    236         Gotoxy(i*2, 24);
    237         printf("");
    238         if(i > 15)
    239         {
    240             Gotoxy(0, i-15);
    241             printf("");
    242         }
    243         Sleep(50);
    244     }
    245     Gotoxy(52,24);
    246     printf("RedSnake v1.0 by_Lee");
    247 }
    248 
    249 void GameRun()        //游戏运行函数
    250 {
    251     while(1)
    252     {
    253         Snake_Move();        //控制蛇的运动
    254         Hit_Wall();            //判断是否撞墙
    255         Create_Food();        //随机产生食物
    256 
    257         if(length == 99)
    258         {
    259             Sweep_Screem();
    260             Gotoxy(28, 12);
    261             printf("You Win.");
    262             Sleep(2000);
    263             break;
    264         }
    265         if(over)
    266         {
    267             Sweep_Screem();
    268             Gotoxy(28, 12);
    269             printf("Game Over.");
    270         }
    271         Sleep(80);
    272     }
    273 }

    测试结果如下

  • 相关阅读:
    ffmpeg推流
    linux nfs挂载根文件系统失败
    ffmpeg nginx rtmp推流
    sql 随机生成NewId
    C#/.NET 异步操作会生成新线程吗
    SQLServer的数据库邮件和SQLServer代理(作业)
    C# ThreadPool类(线程池)
    SQL Server查看执行计划
    从0开始基于Webpack5 搭建HTML+Less 前端工程
    Vue 父子级的相互调用
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3141758.html
Copyright © 2020-2023  润新知