需要的C语言图形库以在
头文件
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h> // 引入图形库头文件
#include<conio.h>
#include<time.h>
HWND hwnd = NULL; // 窗口句柄
enum move {right=77,left=75,down=80,up=72}; // 定义方向的枚举类型
构建代码框架和函数
void init_Snake(); // 初始化蛇
void draw_Snake(); // 绘制蛇
void move_Snake(); // 移动蛇
void keydown(); // 处理键盘按键事件
void init_food(); // 初始化食物
void drawfood(); // 绘制食物
void eatfood(); // 判断是否吃到食物
int snake_die(); // 判断蛇是否死亡
void showGrade(); // 显示分数
void pauseMoment(); // 暂停一段时间
用结构体的构建属性
typedef struct pointX
{
int x;
int y;
}position; // 坐标结构体
struct Snake
{
int num;
position xy[100]; // 蛇的坐标数组
char fangxiang; // 蛇的运动方向
}snake;
struct Food
{
position foodxy; // 食物的坐标
int foodgrade; // 食物的分数
int flag; // 是否被吃掉的标志
}food;
主函数
int main()
{
srand((unsigned int)time(NULL)); // 随机函数种子,以时间作为种子
hwnd = initgraph(640, 480); // 创建图形窗口,设置窗口大小为 640x480 像素
setbkcolor(WHITE); // 设置背景颜色为白色
init_Snake(); // 初始化蛇的位置和状态
settextcolor(LIGHTBLUE); // 设置文字颜色为浅蓝色
cleardevice(); // 清空窗口绘图区域
outtextxy(200, 200, "CYG的项目———贪吃蛇"); // 在指定位置绘制文字
outtextxy(200,301,"请按电源键开始......");
getch(); // 等待用户按下任意键
draw_Snake(); // 绘制蛇
init_food(); // 初始化食物的位置和状态
while (1)
{
BeginBatchDraw(); // 开始批量绘图
if (food.flag == 0)
{
init_food(); // 食物被吃掉后重新生成食物
}
while(kbhit()) // 判断键盘是否有按键按下
{
keydown(); // 处理键盘按键事件
};
move_Snake(); // 移动蛇的位置
showGrade(); // 显示当前分数
draw_Snake(); // 绘制蛇
eatfood(); // 判断是否吃到食物
drawfood(); // 绘制食物
EndBatchDraw(); // 结束批量绘图
Sleep(50); // 程序休眠一段时间,控制蛇的运动速度
if (snake_die()) // 判断蛇是否死亡
{
break; // 如果蛇死亡,则退出循环
}
cleardevice(); // 清空窗口绘图区域,准备下一次绘制
}
return 0;
}
模块一 初始化蛇
void init_Snake()
{
snake.xy[2].x = 0;//xy[2]已经是一个结构数组,.x包含在xy[2]中
snake.xy[2].y = 50;
snake.xy[1].x = 10;
snake.xy[1].y = 50;
snake.xy[0].x = 20;
snake.xy[0].y = 50;
snake.num = 3;
snake.fangxiang = right;
food.foodgrade = 0;
}
模块二
void draw_Snake()
{
for (int i = 0; i < snake.num; i++)
{
setlinecolor(BLACK); // 设置线条颜色为黑色,即矩形边框的颜色
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255)); // 设置填充颜色为随机颜色
fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10); // 绘制蛇的矩形身体
}
}
模块三
void move_Snake()
{
for (int i = snake.num - 1; i > 0; i--)
{
snake.xy[i].x = snake.xy[i - 1].x; // 蛇身体的每一段位置更新为上一段的位置
snake.xy[i].y = snake.xy[i - 1].y;
}
switch (snake.fangxiang)
{
case right:
snake.xy[0].x += 10; // 蛇头向右移动,x坐标增加
break;
case left:
snake.xy[0].x -= 10; // 蛇头向左移动,x坐标减少
break;
case up:
snake.xy[0].y -= 10; // 蛇头向上移动,y坐标减少
break;
case down:
snake.xy[0].y += 10; // 蛇头向下移动,y坐标增加
break;
default:
break;
}
}
模块四
void keydown()
{
char userkey = 0;
userkey = getch(); // 获取用户按下的键盘字符
switch (userkey)
{
case right:
if (snake.fangxiang != left) // 如果当前蛇的方向不是向左,则可以改变方向为向右
snake.fangxiang = right;
break;
case left:
if (snake.fangxiang != right) // 如果当前蛇的方向不是向右,则可以改变方向为向左
snake.fangxiang = left;
break;
case down:
if (snake.fangxiang != up) // 如果当前蛇的方向不是向上,则可以改变方向为向下
snake.fangxiang = down;
break;
case up:
if (snake.fangxiang != down) // 如果当前蛇的方向不是向下,则可以改变方向为向上
snake.fangxiang = up;
break;
}
}
其余模块
void init_food()
{
food.foodxy.x = rand() % 65 * 10; // 随机生成食物的x坐标,范围为0到640
food.foodxy.y = rand() % 48 * 10; // 随机生成食物的y坐标,范围为0到480
food.flag = 1; // 食物被初始化为存在的状态
}
void drawfood()
{
setlinecolor(BLACK); // 设置线条颜色为黑色,即矩形边框的颜色
setfillcolor(GREEN); // 设置填充颜色为绿色
fillrectangle(food.foodxy.x, food.foodxy.y, food.foodxy.x + 10, food.foodxy.y + 10); // 绘制食物的矩形
}
void eatfood()
{
if (snake.xy[0].x == food.foodxy.x && snake.xy[0].y == food.foodxy.y) // 判断蛇是否吃到了食物
{
snake.num++; // 蛇的长度增加
food.foodgrade += 10; // 食物的分数增加
food.flag = 0; // 食物被吃掉的标志设为0,表示已被吃掉
}
}
int snake_die()
{
if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y > 480 || snake.xy[0].y < 0) // 判断蛇头是否撞墙
{
outtextxy(200, 200, "傻逼!!你撞墙了");
MessageBox(hwnd, "GameOver!\n哈哈,这都能撞墙", "撞墙警告",MB_OK); // 显示消息框提示游戏结束
return 1; // 返回1表示蛇已经死亡
}
for (int i = 1;i < snake.num;i++)
if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y) // 判断蛇头是否撞到自己的身体
{
outtextxy(200, 200, "哈哈哈哈 自残行为");
MessageBox(hwnd, "寄了","自残警告",MB_OK); // 显示消息框提示游戏结束
return 1; // 返回1表示蛇已经死亡
}
return 0; // 返回0表示蛇仍然存活
}
void showGrade()
{
char grade[100] = "0";
sprintf(grade, "%d", food.foodgrade); // 将分数转换为字符串形式
setbkmode(TRANSPARENT); // 设置文字的背景模式为透明
settextcolor(BACKUP_DATA); // 设置文字的颜色
outtextxy(560, 20, "GEADE: "); // 显示分数的文本
outtextxy(560 + 50, 20, grade); // 显示实际分数
}
void pauseMoment()
{
if (getch() == 32) // 如果用户按下空格键
{
while (getch() != 32); // 循环等待用户再次按下空格键
}
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h> // 引入图形库头文件
#include<conio.h>
#include<time.h>
HWND hwnd = NULL; // 窗口句柄
enum move {right=77,left=75,down=80,up=72}; // 定义方向的枚举类型
void init_Snake(); // 初始化蛇
void draw_Snake(); // 绘制蛇
void move_Snake(); // 移动蛇
void keydown(); // 处理键盘按键事件
void init_food(); // 初始化食物
void drawfood(); // 绘制食物
void eatfood(); // 判断是否吃到食物
int snake_die(); // 判断蛇是否死亡
void showGrade(); // 显示分数
void pauseMoment(); // 暂停一段时间
typedef struct pointX
{
int x;
int y;
}position; // 坐标结构体
struct Snake
{
int num;
position xy[100]; // 蛇的坐标数组
char fangxiang; // 蛇的运动方向
}snake;
struct Food
{
position foodxy; // 食物的坐标
int foodgrade; // 食物的分数
int flag; // 是否被吃掉的标志
}food;
int main()
{
srand((unsigned int)time(NULL)); // 随机函数种子,以时间作为种子
hwnd = initgraph(640, 480); // 创建图形窗口,设置窗口大小为 640x480 像素
setbkcolor(WHITE); // 设置背景颜色为白色
init_Snake(); // 初始化蛇的位置和状态
settextcolor(LIGHTBLUE); // 设置文字颜色为浅蓝色
cleardevice(); // 清空窗口绘图区域
outtextxy(200, 200, "CYG的项目———贪吃蛇"); // 在指定位置绘制文字
outtextxy(200,301,"请按电源键开始......");
getch(); // 等待用户按下任意键
draw_Snake(); // 绘制蛇
init_food(); // 初始化食物的位置和状态
while (1)
{
BeginBatchDraw(); // 开始批量绘图
if (food.flag == 0)
{
init_food(); // 食物被吃掉后重新生成食物
}
while(kbhit()) // 判断键盘是否有按键按下
{
keydown(); // 处理键盘按键事件
};
move_Snake(); // 移动蛇的位置
showGrade(); // 显示当前分数
draw_Snake(); // 绘制蛇
eatfood(); // 判断是否吃到食物
drawfood(); // 绘制食物
EndBatchDraw(); // 结束批量绘图
Sleep(50); // 程序休眠一段时间,控制蛇的运动速度
if (snake_die()) // 判断蛇是否死亡
{
break; // 如果蛇死亡,则退出循环
}
cleardevice(); // 清空窗口绘图区域,准备下一次绘制
}
return 0;
}
void init_Snake()
{
snake.xy[2].x = 0; // 初始化蛇头的x坐标
snake.xy[2].y = 50; // 初始化蛇头的y坐标
snake.xy[1].x = 10; // 初始化蛇身体的第一个坐标的x坐标
snake.xy[1].y = 50; // 初始化蛇身体的第一个坐标的y坐标
snake.xy[0].x = 20; // 初始化蛇身体的第二个坐标的x坐标
snake.xy[0].y = 50; // 初始化蛇身体的第二个坐标的y坐标
snake.num = 3; // 初始化蛇的长度
snake.fangxiang = right; // 初始化蛇的运动方向为向右
food.foodgrade = 0; // 初始化食物的分数为0
}
void draw_Snake()
{
for (int i = 0; i < snake.num; i++)
{
setlinecolor(BLACK); // 设置线条颜色为黑色,即矩形边框的颜色
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255)); // 设置填充颜色为随机颜色
fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10); // 绘制蛇的矩形身体
}
}
void move_Snake()
{
for (int i = snake.num - 1; i > 0; i--)
{
snake.xy[i].x = snake.xy[i - 1].x; // 蛇身体的每一段位置更新为上一段的位置
snake.xy[i].y = snake.xy[i - 1].y;
}
switch (snake.fangxiang)
{
case right:
snake.xy[0].x += 10; // 蛇头向右移动,x坐标增加
break;
case left:
snake.xy[0].x -= 10; // 蛇头向左移动,x坐标减少
break;
case up:
snake.xy[0].y -= 10; // 蛇头向上移动,y坐标减少
break;
case down:
snake.xy[0].y += 10; // 蛇头向下移动,y坐标增加
break;
default:
break;
}
}
void keydown()
{
char userkey = 0;
userkey = getch(); // 获取用户按下的键盘字符
switch (userkey)
{
case right:
if (snake.fangxiang != left) // 如果当前蛇的方向不是向左,则可以改变方向为向右
snake.fangxiang = right;
break;
case left:
if (snake.fangxiang != right) // 如果当前蛇的方向不是向右,则可以改变方向为向左
snake.fangxiang = left;
break;
case down:
if (snake.fangxiang != up) // 如果当前蛇的方向不是向上,则可以改变方向为向下
snake.fangxiang = down;
break;
case up:
if (snake.fangxiang != down) // 如果当前蛇的方向不是向下,则可以改变方向为向上
snake.fangxiang = up;
break;
}
}
void init_food()
{
food.foodxy.x = rand() % 65 * 10; // 随机生成食物的x坐标,范围为0到640
food.foodxy.y = rand() % 48 * 10; // 随机生成食物的y坐标,范围为0到480
food.flag = 1; // 食物被初始化为存在的状态
}
void drawfood()
{
setlinecolor(BLACK); // 设置线条颜色为黑色,即矩形边框的颜色
setfillcolor(GREEN); // 设置填充颜色为绿色
fillrectangle(food.foodxy.x, food.foodxy.y, food.foodxy.x + 10, food.foodxy.y + 10); // 绘制食物的矩形
}
void eatfood()
{
if (snake.xy[0].x == food.foodxy.x && snake.xy[0].y == food.foodxy.y) // 判断蛇是否吃到了食物
{
snake.num++; // 蛇的长度增加
food.foodgrade += 10; // 食物的分数增加
food.flag = 0; // 食物被吃掉的标志设为0,表示已被吃掉
}
}
int snake_die()
{
if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y > 480 || snake.xy[0].y < 0) // 判断蛇头是否撞墙
{
outtextxy(200, 200, "傻逼!!你撞墙了");
MessageBox(hwnd, "GameOver!\n哈哈,这都能撞墙", "撞墙警告",MB_OK); // 显示消息框提示游戏结束
return 1; // 返回1表示蛇已经死亡
}
for (int i = 1;i < snake.num;i++)
if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y) // 判断蛇头是否撞到自己的身体
{
outtextxy(200, 200, "哈哈哈哈 自残行为");
MessageBox(hwnd, "寄了","自残警告",MB_OK); // 显示消息框提示游戏结束
return 1; // 返回1表示蛇已经死亡
}
return 0; // 返回0表示蛇仍然存活
}
void showGrade()
{
char grade[100] = "0";
sprintf(grade, "%d", food.foodgrade); // 将分数转换为字符串形式
setbkmode(TRANSPARENT); // 设置文字的背景模式为透明
settextcolor(BACKUP_DATA); // 设置文字的颜色
outtextxy(560, 20, "GEADE: "); // 显示分数的文本
outtextxy(560 + 50, 20, grade); // 显示实际分数
}
void pauseMoment()
{
if (getch() == 32) // 如果用户按下空格键
{
while (getch() != 32); // 循环等待用户再次按下空格键
}
}
运行结果
在黑色窗口,输入方向键