• C语言控制台贪吃蛇全部代码


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <conio.h>
      5 #include <windows.h>
      6 #include <time.h>
      7 
      8 typedef int bool;
      9 #define true 1
     10 #define false 0
     11 
     12 //三件套:添加音乐的函数
     13 #include <Windows.h>
     14 #include <mmsystem.h>
     15 #pragma comment(lib,"winmm.lib")
     16 
     17 #define DEF_SNAKE_LONG 20
     18 
     19 //定义边框数组
     20 char g_strgameback[20][48] = { 
     21     "■■■■■■■■■■■■■■■■■■■■■■■
    ",
     22     "■                                          ■
    ",
     23     "■                                          ■
    ",
     24     "■                                          ■
    ",
     25     "■                                          ■
    ",
     26     "■                                          ■
    ",
     27     "■                                          ■
    ",
     28     "■                                          ■
    ",
     29     "■                                          ■
    ",
     30     "■                                          ■
    ",
     31     "■                                          ■
    ",
     32     "■                                          ■
    ",
     33     "■                                          ■
    ",
     34     "■                                          ■
    ",
     35     "■                                          ■
    ",
     36     "■                                          ■
    ",
     37     "■                                          ■
    ",
     38     "■                                          ■
    ",
     39     "■                                          ■
    ",
     40     "■■■■■■■■■■■■■■■■■■■■■■■
    "};
     41 
     42 //定义蛇数组
     43 int g_arrSnake[DEF_SNAKE_LONG][3] = {0};
     44 
     45 //蛇方向
     46 enum {to_east = 2, to_west = -2, to_south = 1, to_north = -1};
     47 
     48 int g_nSnakeDir = to_west;
     49 
     50 bool g_bIsProFood = true;
     51 
     52 int g_nRow;//定义全局横纵坐标的变量
     53 int g_nCol;
     54 
     55 //蛇长度
     56 int g_nSnakelen = 2;
     57 
     58 //计分
     59 int g_nScore = 0;
     60 
     61 void Cover();//显示首页
     62 void BGM();//播放音乐
     63 void ButtonTest();//显示首页
     64 void ShowBack();//打印游戏边框
     65 void SetSnakeRandPos();//为蛇产生随机位置
     66 void DrawSnake();//将蛇显示到背景上
     67 void Snakemove();//蛇动起来
     68 void Clean();//销毁残留蛇身
     69 void SnakeDir();//改变蛇的方向
     70 bool IsSnakeDie();//蛇死亡判断
     71 void ProduceFood();//产生食物
     72 void SnakeGrowUp();//蛇吃食物变长
     73 void Score();//计分
     74 
     75 int main()
     76 {
     77     BGM();//播放音乐
     78     Cover();//显示首页
     79     ButtonTest();//检测按键
     80     PlaySound(NULL, 0, 0);//停止播放
     81     system("cls");//清屏
     82 
     83     SetSnakeRandPos();//为蛇产生随机位置
     84     ShowBack();
     85 
     86     while(1)
     87     {
     88         system("cls");
     89 
     90         ProduceFood();//产生食物
     91         SnakeGrowUp();//蛇变长
     92         SnakeDir();//改变蛇的方向
     93         
     94         if(false == IsSnakeDie())//蛇死亡判断
     95         {
     96             printf("Game Over
    ");
     97             break;
     98         }
     99 
    100         Snakemove();//蛇动
    101         ShowBack();//显示背景
    102         Score();//计分
    103         Sleep(500);
    104     }
    105 
    106     system("pause");
    107     return 0;
    108 }
    109 
    110 //显示首页
    111 void Cover()
    112 {
    113     printf("
    
    
    			       <<SNAKE>>
    
    ");
    114     printf("
    
    
    			<<W,S,A,D control move>>
    
    ");
    115     printf("
    
    
    			    <<space begin>>
    
    
    
    ");
    116 }
    117 
    118 //播放音乐
    119 void BGM()
    120 {
    121     PlaySound("C:\Windows\Media\Alarm03.wav" , NULL, SND_FILENAME | SND_ASYNC);
    122     //以C盘系统文件中.wav文件为例
    123 }
    124 
    125 //检测按键
    126 void ButtonTest()
    127 {
    128     char chinput;
    129 
    130     //检测空格
    131     while(1)
    132     {
    133         chinput = _getch();
    134         if(' ' == chinput)
    135         {
    136             break;
    137         }
    138     }
    139 }
    140 
    141 //打印游戏边框
    142 void ShowBack()
    143 {
    144     int i = 0;
    145 
    146     for(; i < 20; i++)
    147     {
    148         printf(g_strgameback[i]);
    149     }
    150 }
    151 
    152 //为蛇产生随机位置
    153 void SetSnakeRandPos()
    154 {
    155     int nX = -1;
    156     int nY = -1;
    157 
    158     //产生随机数
    159     srand((unsigned int)time(NULL));//中种子
    160     nX = rand()%19 + 1;//对19取余得0~18,+1得0~19
    161     nY = rand()%18 + 1;
    162 
    163     //初始化的三个节点
    164     g_arrSnake[0][0] = nY;        //
    165     g_arrSnake[0][1] = nY*2;    //
    166     g_arrSnake[0][2] = to_west;    //方向
    167 
    168     g_arrSnake[1][0] = nY;        
    169     g_arrSnake[1][1] = nY*2 + 2;    
    170     g_arrSnake[1][2] = to_west;    
    171 
    172     g_arrSnake[2][0] = nY;        
    173     g_arrSnake[2][1] = nY*2 + 4;    
    174     g_arrSnake[2][2] = to_west;    
    175 
    176     //将蛇显示到背景上
    177     DrawSnake();
    178 }
    179 
    180 //将蛇显示到背景上
    181 void DrawSnake()
    182 {
    183     int i = 0;
    184     for(; g_arrSnake[i][0] != 0; i++)//遍历每行,遇到初始蛇的位置拷贝方块
    185     {
    186         strncpy(&g_strgameback[g_arrSnake[i][0]][g_arrSnake[i][1]], "", 2);
    187     }
    188 }
    189 
    190 //蛇动起来
    191 void Snakemove()
    192 {
    193     int i = DEF_SNAKE_LONG - 1;
    194 
    195     Clean();//销毁残留蛇身
    196 
    197     //从后向前遍历
    198     for(; i >= 1; i--)
    199     {
    200         //过滤掉非法蛇身
    201         if(0 == g_arrSnake[i][1])
    202         {
    203             continue;
    204         }
    205         //把前面一个节点的值赋给前一个节点
    206         g_arrSnake[i][0] = g_arrSnake[i-1][0];
    207         g_arrSnake[i][1] = g_arrSnake[i-1][1];
    208         g_arrSnake[i][2] = g_arrSnake[i-1][2];
    209     }
    210 
    211     g_arrSnake[0][2] = g_nSnakeDir;
    212 
    213     //处理蛇头
    214     if(to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
    215     {
    216         g_arrSnake[0][1] += g_arrSnake[0][2];
    217     }
    218     else
    219     {
    220         g_arrSnake[0][0] += g_arrSnake[0][2];
    221     }
    222 
    223     //画蛇
    224     DrawSnake();
    225 }
    226 
    227 //销毁残留蛇身
    228 void Clean()
    229 {
    230     //同画蛇的代码,只不过拷贝上的是空格
    231     int i = 0;
    232     for(; g_arrSnake[i][0] != 0; i++)//遍历每行,遇到初始蛇的位置拷贝方块空格
    233     {
    234         strncpy(&g_strgameback[g_arrSnake[i][0]][g_arrSnake[i][1]], "  ", 2);
    235     }
    236 }
    237 
    238 //改变蛇的方向
    239 void SnakeDir()
    240 {
    241     if(GetAsyncKeyState('W'))
    242     {
    243         g_nSnakeDir = to_north;
    244     }
    245     else if(GetAsyncKeyState('S'))
    246     {
    247         g_nSnakeDir = to_south;
    248     }
    249     else if(GetAsyncKeyState('A'))
    250     {
    251         g_nSnakeDir = to_west;
    252     }
    253     if(GetAsyncKeyState('D'))
    254     {
    255         g_nSnakeDir = to_east;
    256     }
    257 }
    258 
    259 //蛇死亡判断
    260 bool IsSnakeDie()
    261 {
    262     //判断蛇头方向
    263     if(to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
    264     {
    265         if(0 == strncmp(&g_strgameback[g_arrSnake[0][0]][g_arrSnake[0][1] + g_arrSnake[0][2]], "", 2))
    266         {
    267             return false;
    268         }
    269     }
    270     else 
    271     {
    272         if(0 == strncmp(&g_strgameback[g_arrSnake[0][0] + g_arrSnake[0][2]][g_arrSnake[0][1]], "", 2))
    273         {
    274             return false;
    275         }
    276     }
    277 
    278     return true;
    279 }
    280 
    281 //产生食物
    282 void ProduceFood()
    283 {
    284     int i;
    285 
    286     //判断是否产生新的食物
    287     if(false == g_bIsProFood)
    288     {
    289         return ;
    290     }
    291 
    292     //产生随机坐标
    293     srand((unsigned int)time(NULL));
    294     
    295     while(1)
    296     {
    297         bool bFlag = true;
    298 
    299         g_nRow = rand()%18 + 1;
    300         g_nCol = rand()%20 + 1;
    301 
    302         for(i = 0; g_arrSnake[i][0] != 0; i++)
    303         {
    304             if(g_nRow == g_arrSnake[i][0] && g_nCol == g_arrSnake[i][0])
    305             {
    306                 bFlag = false;
    307                 break ;
    308             }
    309         }
    310 
    311         if(true == bFlag)
    312         {
    313             break;
    314         }
    315     }
    316 
    317     //坐标画食物
    318     strncpy(&g_strgameback[g_nRow][g_nCol*2], "", 2);
    319 
    320     g_bIsProFood = false;
    321 }
    322 
    323 //蛇吃食物变长
    324 void SnakeGrowUp()
    325 {
    326     //蛇头光标跟坐标相等
    327     if(g_nRow == g_arrSnake[0][0] && g_nCol*2 == g_arrSnake[0][1])
    328     {
    329         //蛇长大
    330         if(to_east == g_arrSnake[g_nSnakelen][2])
    331         {
    332             g_arrSnake[g_nSnakelen+1][0] = g_arrSnake[g_nSnakelen][0];
    333             g_arrSnake[g_nSnakelen+1][1] = g_arrSnake[g_nSnakelen][0] - 2;
    334             g_arrSnake[g_nSnakelen+1][2] = g_arrSnake[g_nSnakelen][0];
    335         }
    336         else if(to_west == g_arrSnake[g_nSnakelen][2])
    337         {
    338             g_arrSnake[g_nSnakelen+1][0] = g_arrSnake[g_nSnakelen][0];
    339             g_arrSnake[g_nSnakelen+1][1] = g_arrSnake[g_nSnakelen][0] + 2;
    340             g_arrSnake[g_nSnakelen+1][2] = g_arrSnake[g_nSnakelen][0];
    341         }
    342         else if(to_north == g_arrSnake[g_nSnakelen][2])
    343         {
    344             g_arrSnake[g_nSnakelen+1][0] = g_arrSnake[g_nSnakelen][0];
    345             g_arrSnake[g_nSnakelen+1][1] = g_arrSnake[g_nSnakelen][0] + 1;
    346             g_arrSnake[g_nSnakelen+1][2] = g_arrSnake[g_nSnakelen][0];
    347         }
    348         else if(to_south == g_arrSnake[g_nSnakelen][2])
    349         {
    350             g_arrSnake[g_nSnakelen+1][0] = g_arrSnake[g_nSnakelen][0];
    351             g_arrSnake[g_nSnakelen+1][1] = g_arrSnake[g_nSnakelen][0] - 1;
    352             g_arrSnake[g_nSnakelen+1][2] = g_arrSnake[g_nSnakelen][0];
    353         }
    354 
    355         g_nSnakelen++;
    356         g_bIsProFood = true;
    357         g_nScore++;
    358     }
    359 }
    360 
    361 //计分
    362 void Score()
    363 {
    364     COORD rd;
    365     rd.X = 55;
    366     rd.Y = 8;
    367     //设置光标位置
    368     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),rd);
    369 
    370     printf("Score Is :  ");
    371 
    372     rd.X = 56;
    373     rd.Y = 9;
    374 
    375     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),rd);
    376 
    377     printf("%d",g_nScore*10);
    378 }
  • 相关阅读:
    石家庄地铁线路查询系统(补)
    构建之法阅读笔记03
    构建之法阅读笔记02
    Day 3-3 内置方法
    Day3-2 函数之递归
    Day3-1 函数
    Day2 列表,元组,字典,集合
    Day1 基础知识
    Day1. Python基础知识
    iptables防火墙配置
  • 原文地址:https://www.cnblogs.com/WinonaJia/p/7750563.html
Copyright © 2020-2023  润新知