# Minor progress **Repository Path**: garfield-cat-fighting/minor-progress ## Basic Information - **Project Name**: Minor progress - **Description**: 本仓库主要为学习过程中所学习到的代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-25 - **Last Updated**: 2023-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 贪吃蛇 ```c void gotoxy(int x, int y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } ``` 如上这个函数是一个控制光标移动的函数,COORD结构用于表示一个二维坐标 ```c while (1) { srand(time(NULL)); food.x = rand() % (116) + 2;//随机生成食物 food.y = rand() % (28) + 1; if (food.x % 2 == 0)break; } ``` 随机生成食物,横坐标必须是偶数,为了防止蛇头只吃到食物的一半 ```c if (getstar == 0) { gotoxy(snake.x[snake.len-1], snake.y[snake.len-1]); printf(" "); } for (int i = snake.len-1;i>0;i--) { snake.x[i] = snake.x[i - 1]; snake.y[i] = snake.y[i - 1]; } ``` 以上代码用来模仿贪吃蛇吃到食物和没有吃到食物的移动过程,如果没有吃到食物则将尾部的方块变成空格,在蛇头前在打印一个方块,如果吃到了食物则蛇尾不去除,蛇头前再打印一个方块 ```c if (rekey == 72 && key == 80) key =72 ; if (rekey == 80 && key == 72) key = 80; if (rekey == 75 && key == 77) key = 75; if (rekey == 77 && key == 75) key = 77; switch (key) { case 72:snake.y[0]--; break; case 80:snake.y[0]++; break; case 75:snake.x[0] -= 2; break; case 77:snake.x[0] += 2; break; } ``` 这个步骤是为了防止玩家输入与蛇移动相反的方向,如果输入相反方向则无效,继续以之前的方向移动 ```c for (int i = 0; i < snake.len; i++) { if (snake.x[i] == food.x && snake.y[i] == food.y) { flog = 0; break; } } if (flog && food.x % 2 == 0) { break; } ``` 这是吃到食物以后再次生成食物的代码,第一个if语句是为了防止食物生成到蛇的身体里面,第二个if语句是让食物的横坐标为偶数 ```c snake.len++;//使得在dircection中,在蛇吃到star的时候,让蛇的长度加1即让snake.x和snake.y的容量变大。就可以让尾巴不变成空格的时候snake.x最后的坐标依旧是之前没有吃到star时尾巴的坐标 getstar = 1; score += 10; snake.speed -= 5; ``` /使得在dircection中,在蛇吃到star的时候,让蛇的长度加1即让snake.x和snake.y的容量变大。就可以让尾巴不变成空格的时候snake.x最后的坐标依旧是之前没有吃到star时尾巴的坐标, **截图展示** > ![img](https://minio.adongoss.top/imagecloud/liujiafei/20231125222022.png) 个人收获: 1. COORD结构的用法表示一个二维坐标,SetConsoleCursorPosition函数用于光标的移动 2. _kbhit()函数的用法,用于检测键盘是否有被按下,fflush(stdin)用于清空缓冲区, _getch()从键盘中读取一个字符但不会显示在控制台上 3. 方向键一般需要扫描两次才能得到准确的输入值