百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

C语言项目实战:《自动版贪吃蛇》零基础项目!源码 + 注释

ztj100 2024-10-29 18:21 20 浏览 0 评论

这篇文章主要为大家详细介绍了C语言实现——《进化版贪吃蛇项目》,也就是在我们上一个发布的文章项目分享的基础上,实现贪吃蛇的自动行动,你可以按键也可以不按键,让蛇自己找食物!还是挺好玩的,一起来看看吧!

文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!

项目实现要求:

1.学过C语言

2.熟悉C语言数组

3.熟悉结构体

4.按键交互 程序:1.按键交互 2.鼠标交互

5.创建图形窗口

6.基本绘图

但是这些在我们项目源码里面都会有注释,大家到时候学习的时候千万不要忽略注释,注释可以更好地帮你理解代码,尤其是C语言初学者。

本项目编译环境:VS2019/VS2013;

插件:图形库插件easyX;

效果图演示:

源代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>		//报错:安装图形库插件
#include <time.h>
#define MAX 100				//蛇最大节数
/*
	1.学过C语言
	2.熟悉C语言数组
	3.熟悉结构体
	4.按键交互  程序:1.按键交互   2.鼠标交互
	5.创建图形窗口
	6.基本绘图
*/
//1.把程序所要用的数据抽象出来
typedef struct pointXY
{
	int x;
	int y;
}MYPOINT;
HWND hwnd = NULL;

//蛇
struct mySnake
{
	int num;
	MYPOINT xy[MAX];
	char postion;		//表示方向,标记
}snake;

//食物
struct myFood
{
	MYPOINT foodxy;
	int flag;
	int eatGrade;
}food;

//把方向枚举出来
enum movPostion{right=1,left=2,down=3,up=4};
//整个项目划分
//1.初始化蛇
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.postion = right;

	food.flag = 0;
}
//2.绘制蛇
void drawSnake()
{
	for (int i = 0; i < snake.num; i++)
	{
		setlinecolor(RED);
		setfillcolor(GREEN);
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
	}
}

//3.移动蛇
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.postion)
	{
	case right:
		snake.xy[0].x += 10;
		break;
	case left:
		snake.xy[0].x -= 10;
		break;
	case down:
		snake.xy[0].y += 10;
		break;
	case up:
		snake.xy[0].y -= 10;
		break;
	}


}
//4.按键用户:人玩蛇
void keyDown()
{
	static char userkey = '\0';    //VC  getch不需要加下划线
	//userkey=_getch();		//不可见输入
	//自己生成按键
	switch (snake.postion)
	{
	case right:
	case left:
		if (food.foodxy.y >= snake.xy[0].y)
		{
			userkey = 80;
		}
		else  if (food.foodxy.y<snake.xy[0].y)
		{
			userkey = 72;
		}
		break;
	case up:
	case down:
		if (food.foodxy.x >= snake.xy[0].x)
		{
			userkey = 77;
		}
		else  if (food.foodxy.x < snake.xy[0].x)
		{
			userkey = 75;
		}
		break;
	}
	switch (userkey)
	{
	case 'w':
	case 'W':
	case 72:	//上
		if (snake.postion != down)
		{
			//蛇往上走,你要排除掉蛇本来是朝下
			snake.postion = up;
		}
		break;
	case 's':
	case 'S':
	case 80:	//下
		if (snake.postion != up)
		{
			snake.postion = down;
		}
		break;
	case 'a':
	case 'A':
	case 75:	//左
		if (snake.postion != right)
		{
			snake.postion = left;
		}
		break;
	case 'd':
	case 'D':
	case 77:	//右
		if (snake.postion != left)
		{
			snake.postion = right;
		}
	}
}
//初始化食物
void  initFood()
{
	//0,63    630   640  
	//0,47    470   480
	food.foodxy.x = rand() % 64 * 10;  //只能是10的整数倍,蛇头才能对齐食物
	food.foodxy.y = rand() % 48 * 10;
	food.flag = 1;
	//食物不能出现在蛇身上
	for (int i = 0; i < snake.num; i++)
	{
		if (food.foodxy.x == snake.xy[i].x&&food.foodxy.y == snake.xy[i].y)
		{
			food.foodxy.x = rand() % 64 * 10;  //只能是10的整数倍,蛇头才能对齐食物
			food.foodxy.y = rand() % 48 * 10;
		}
	}
}
//绘制食物
void drawFood()
{
	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.eatGrade += 10;
		food.flag = 0;
	}
}
//蛇死亡判断
int snakeDie()
{
	//显示分数
	char grade[100] = { 0 };
	sprintf(grade, "%d", food.eatGrade);
	setbkmode(TRANSPARENT);
	settextcolor(RED);
	outtextxy(580, 20, "分数:");		//loadimage   
	outtextxy(620, 20, grade);		//
	//判断蛇是否死亡

	//撞墙
	if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
	{
		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()
{
	srand((unsigned int)time(NULL));
	hwnd=initgraph(640, 480);
	setbkcolor(WHITE);
	cleardevice();
	initSnake();
	while (1)
	{
		cleardevice();		//刷掉路径
		if (food.flag == 0)
		{
			initFood();
		}
		drawFood();
		drawSnake();
		if (snakeDie())
		{
			break;
		}
		eatFood();
		moveSnake();
		Sleep(100);			//控制速度
		//while (_kbhit())	//kbhit() 存在按键操作,返回非零
		//{
		//	keyDown();
		//}
		keyDown();
	}
	closegraph();
	printf("GameOver!!!");
	system("pause");
	return 0;
}

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

相关推荐

再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)

在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...

python编程:如何使用python代码绘制出哪些常见的机器学习图像?

专栏推荐...

python创建分类器小结(pytorch分类数据集创建)

简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...

matplotlib——绘制散点图(matplotlib散点图颜色和图例)

绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...

python实现实时绘制数据(python如何绘制)

方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...

简单学Python——matplotlib库3——绘制散点图

前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...

数据分析-相关性分析可视化(相关性分析数据处理)

前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...

免费Python机器学习课程一:线性回归算法

学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...

用Python进行机器学习(2)之逻辑回归

前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...

【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂

一、拟合和回归的区别拟合...

推荐2个十分好用的pandas数据探索分析神器

作者:俊欣来源:关于数据分析与可视化...

向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

用Python进行机器学习(11)-主成分分析PCA

我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...

神经网络基础深度解析:从感知机到反向传播

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

Python实现基于机器学习的RFM模型

CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...

取消回复欢迎 发表评论: