C语言实现贪吃蛇–1.1.1
实现思路
- 设置一个循环
- 在循环中进行游戏事件的判断和响应
难点解决(以本程序为例)
问:如何实现绘制游戏界面?
答:在Windows下进行贪吃蛇的编写,可以调用Windows提供的一些API和结构
/**********获取句柄**********/
HANDLE Output = GetStdHandle(STD_OUTPUT_HANDLE);
/*将光标移动到指定位置*/
void getPosition(int x, int y) {
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(Output, coord);
}
问:如何存储蛇的信息?
答:自定义一个结构体数组
/*定义一个蛇类型*/
typedef struct sn {
int length;
point position[N];
} sn;
问:如何实现蛇的移动?
答:要实现蛇的移动,可以向蛇的移动方向绘制一个新的蛇头。然后在蛇尾打印空格(如果没有这一步,蛇身会不断变长)
问:如何生成随机食物?
答:可以使用C提供的随机数生成,随机生成食物的坐标,然后打印食物
/*产生食物,食物必须满足特定条件,即不能在蛇身上,也不能在墙壁上*/
void creatFood(){
srand(time(NULL));
while(1){
int flag=1;
food.x=rand()%width;
food.y=rand()%height;
for(int i=0;i<snake.length;i++)
if(food.x==snake.position[i].x&&snake.position[i].y==food.y){
flag=0;
break;
}
if(food.x%2!=0||food.y==0||food.x==0)
flag=0;
if(flag)
break;
}
getPosition(food.x,food.y);
printf("■");
}
问:如何实现蛇吃到食物后身体增长的效果?
答:当蛇吃到食物,不清除蛇尾,可以达到蛇身增长的效果
实现
注意:
以下两种方法只是判定食物被吃后,蛇身如何变化的实现不同
实现方法一(设置 last 保存蛇尾信息)
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>//windows编程头文件
#include <time.h>
#include <conio.h>//控制台输入输出头文件
/*定义蛇的最大长度*/
#define N 20
/**********获取句柄**********/
HANDLE Output = GetStdHandle(STD_OUTPUT_HANDLE);
/*设置蛇运动范围的宽、高*/
const int width = 40, height = 24;
/*设置蛇初始运动方向*/
char key = 'w';
/*定义一个点类型,x、y表示坐标*/
typedef struct point {
int x;
int y;
} point;
/*定义一个蛇类型*/
typedef struct sn {
int length;
point position[N];
} sn;
sn snake;
point food;
/*last保存蛇的最后一节身体信息*/
point last;
/*将光标移动到指定位置*/
void getPosition(int x, int y) {
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(Output, coord);
}
/*隐藏光标*/
void hideHandle() {
CONSOLE_CURSOR_INFO cci;
cci.dwSize = 1; /*设置光标大小*/
cci.bVisible = 0;/*置光标不可见*/
SetConsoleCursorInfo(Output, &cci); /*设置(应用)光标信息*/
}
/*打印地图*/
void printMap() {
getPosition(0, 0);
for (int i = 0; i <= width; i += 2)/*上*/
printf("■");
getPosition(0, height);
for (int i = 0; i <= width; i += 2)/*下*/
printf("■");
for (int i = 0; i < height; i++) {
getPosition(0, i);/*左*/
printf("■");
}
for (int i = 0; i < height; i++) {
getPosition(width, i);/*右*/
printf("■");
}
}
/*判断蛇是否吃了食物,如果吃了,返回 1 */
int eatFood(){
for(int i=0;i<snake.length;i++){
if