c语言贪吃蛇教程在线,C语言简单贪吃蛇学习

刚刚学完C语言想着写个小项目巩固一下基础知识,为下一步学习打下坚实的基础,然后开始在各大网站博客寻找能做的项目,最终选择了贪吃蛇小游戏,大部分都是调用的库函数,没有用到链表,指针等较复杂的知识点。

直接上代码!

#define _CRT_SECURE_NO_WARNINGS //防止编译出错

#include

#include //需按照Easy图形库

#include

#include

#include

typedef struct point

{

int x;

int y;

}mypoint;

//蛇的属性

struct Snake

{

mypoint xy[100]; //蛇身最长100节

int num; //蛇的长度

char position; //方向

}snake;

//食物的属性

struct Food

{

mypoint fdxy;

int flag;

int grade;

}food;

//窗口句柄

HWND hwnd = NULL;

//方向枚举

enum position{up,down,left,right};

//初始化蛇

void initSnake()

{

snake.xy[2].x = 0;

snake.xy[2].y = 0;

snake.xy[1].x = 10;

snake.xy[1].y = 0;

snake.xy[0].x = 20;//初始化坐标

snake.xy[0].y = 0;

snake.num = 3;//初始化长度

snake.position = right; //初始化方向

}

//绘制蛇

void drawSnake()

{

for (int i = 0; i < snake.num; i++)

{

setlinecolor(BLUE); //矩形边框颜色

setfillcolor(RED); //矩形方块颜色

fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);//确定左上角和右下角的坐标绘制矩形

}

}

//移动蛇

void moveSnake()

{

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.position) //移动方向设定

{

case up:

snake.xy[0].y -= 10;

break;

case down:

snake.xy[0].y += 10;

break;

case left:

snake.xy[0].x -= 10;

break;

case right:

snake.xy[0].x += 10;

}

}

//移动控制

void keyDown()

{

char key = _getch(); //获取按键值

switch (key)

{

case 'w':

case 'W':

case 72:

if (snake.position != down)

snake.position = up;

break;

case 's':

case 'S':

case 80:

if (snake.position != up)

snake.position = down;

break;

case 'a':

case 'A':

case 75:

if (snake.position != right)

snake.position = left;

break;

case 'd':

case 'D':

case 77:

if (snake.position != left)

snake.position = right;

break;

}

}

//初始化食物

void initFood()

{

srand((unsigned int)time(NULL));//随机种子

food.fdxy.x = rand() % 80 * 10;//确定随机出现的范围

food.fdxy.y = rand() % 60 * 10;

food.flag = 1;//食物出现标志

for (int i = 0; i < snake.num; i++)//判断蛇是否与食物重合,若重合即重新产生

{

if (food.fdxy.x == snake.xy[i].x&&food.fdxy.y == snake.xy[i].y)

{

food.fdxy.x = rand() % 80 * 10;

food.fdxy.y = rand() % 60 * 10;

}

}

}

//将食物绘制出来

void drawFood()

{

setlinecolor(BLUE);//设置矩形边框线

setfillcolor(BLUE);//设置矩形颜色

fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);

}

//蛇吃食物:判断食物与蛇头的坐标

void eatFood()

{

if (snake.xy[0].x == food.fdxy.x&&snake.xy[0].y == food.fdxy.y)

{

food.flag = 0;//将食物标志位清零

snake.num++;//蛇的长度加一

food.grade += 10; //分数加10

}

}

//显示分数

void showGread()

{

char grade[100] = "";

sprintf(grade, "分数:%d", food.grade);

setbkmode(TRANSPARENT);//将文字类型设置为透明

settextcolor(LIGHTBLUE);//将文字颜色设置为浅蓝

outtextxy(650, 30, grade);//文字显示的具体位置

}

//游戏结束

//1.蛇头的位置超出边框范围

//2.蛇头与蛇身的位置重合

int endSnake()

{

if (snake.xy[0].x < 0 || snake.xy[0].x>800 || snake.xy[0].y < 0 || snake.xy[0].y>600)

{

MessageBox(hwnd, "撞墙,游戏结束!", "游戏结束", 0);

return 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)

{

MessageBox(hwnd, "自杀,游戏结束!", "游戏结束", 0);

return 1;

}

}

return 0;

}

int main()

{

//绘制窗口

hwnd=initgraph(800, 600);

setbkcolor(WHITE);//将窗口背景设置为白色

cleardevice();//刷新界面

initSnake();

while (1)

{

cleardevice();//刷新界面

drawSnake();

moveSnake();

eatFood();

showGread();

drawFood();

//游戏结束就退出

if (endSnake()){

break;

exit(0);

}

//仅当食物被吃掉的时候才产新的食物

if (food.flag == 0){

initFood();

}

//判读键盘是否按下

if (_kbhit()){

keyDown();

}

//设置速度

Sleep(150);

}

_getch();//防止屏幕闪烁

closegraph(); //关闭图形显示模式

return 0;

}

遇到的一些困难:

1.编译器报错

9373aae8df9b68c5b4d4fcf7bb6a4f7c.png

属于编译器问题,在代码上方添加

#define _CRT_SECURE_NO_WARNINGS

2.编译属性报错

04bbed2b4c4715fcc7c906f4c8955f96.png

9a1f213d0467c798fa5d5bdf078f61e5.png

右键打开选择属性->常规->字符集

将字符集改为使用多字符字符集

a05b27889fff8e1191c0b2335a1379b4.png

另外在游戏过程中有些许延迟,望大佬解答!

ec04e0b03bcc7329744a4261f2679e36.png

放在最后:

2018春分版操作相对简单

来源:oschina

链接:https://my.oschina.net/u/4364241/blog/4284831

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值