C实战——高配版贪吃蛇游戏设计

本文分享了一个C语言实现的贪吃蛇游戏项目,详细介绍了绘制字符画、欢迎界面、蛇的初始化、随机食物生成、蛇的移动等关键功能。项目采用循环链表管理蛇身,实现了动态增减节点,并通过键盘控制蛇的方向。文章提供了完整源码,包括snake.c、main.c和snake.h三个文件,便于读者理解和实践。

↘话不多说,先上图为敬(●´∀`●)ノ

主界面游戏截图
与君の勉:贪吃蛇Demo作为一个C语言的经典开发项目,比较适合初学者练习。透过程序看本质,该项目有种许多可供我们学习、提高的知识点:数组、指针、循环链表、多文件操作、三大结构运用……等等。“理论+实践”,相信入门的你通过该Demo会对C有更尽一层的理解。
由于最近其他事情耽搁,完整的设计流程笔记小编还未完成,不过我会尽快补更,就先把源码分享给大家,期待共同学习交流。


✅单独提出一些有趣且值得参考部分,完整源码及编译运行使用详见文末附件

1.绘制字符画–蛇

//绘制字符画--蛇
int printSnake(void){
   
   
	//清屏
	system("cls");

	gotoXY(35, 1);
	setColor(6);
	printf("/^\\/^\\");      //蛇眼

	gotoXY(34, 2);
	printf("|__|  0");      //蛇眼

	gotoXY(33, 2);
	setColor(2);
	printf("_");

	gotoXY(25, 3);
	setColor(12);
	printf("\\/");        //蛇信

	gotoXY(31, 3);
	setColor(2);
	printf("/");

	gotoXY(37, 3);
	setColor(6);
	printf("\\_/");       //蛇眼

	gotoXY(41, 3);
	setColor(10);
	printf("\\");

	gotoXY(26, 4);
	setColor(12);
	printf("\\____");     //舌头

	gotoXY(32, 4);
	printf("_________/");

	gotoXY(31, 4);
	setColor(2);
	printf("|");

	gotoXY(42, 4);
	setColor(10);
	printf("\\");

	gotoXY(31, 5);
	setColor(2);
	printf("\\_______");     //蛇嘴

	gotoXY(43, 5);
	setColor(10);
	printf("\\");

	gotoXY(38, 6);
	printf(" |    |                               \\");
	//下面都是画蛇身

	gotoXY(38, 7);
	printf(" /    /                               \\ \\");

	gotoXY(37, 8);
	printf(" /    /                                \\  \\");

	gotoXY(36, 9);
	printf(" /    /                                  \\  \\");

	gotoXY(35, 10);
	printf(" /    /                                    \\  \\");

	gotoXY(34, 11);
	printf(" /    /                _----_                \\  \\");

	gotoXY(33, 12);
	printf(" /    /             _--~       --_            |   |");

	gotoXY(33, 13);
	printf("(    (        _----~     _--_      --_      _/    |");

	gotoXY(34, 14);
	printf("\\    ~-——-~     --~---    ~--      ~-_-~       /");

	gotoXY(35, 15);
	printf("\\           -—~              ~—-         -—~");

	gotoXY(36, 16);
	printf("~—-----—~                      ~—---—~        ");

	return 0;

}

2.欢迎界面

int i, j;

	int n;

	//显示字符画
	printSnake();

	//输出标题
	setColor(11);
	//移动光标
	gotoXY(49, 18);
	printf("贪吃蛇游戏\n");

	//设置文本颜色
	setColor(14);

	//打印游戏边框
	for (i = 20; i <= 26; i++){
   
                 //控制行
		for (j = 27; j <= 74; j++)           //控制列
		{
   
   
			//定位光标
			gotoXY(j, i);
			if (i == 20 || i == 26){
   
   
				printf("-");
			}
			else if (j == 27 || j == 74){
   
   
				printf("|");
			}
			else{
   
   
				printf(" ");
			}

		}
	}

	//输出菜单
	//设置文本颜色
	setColor(12);
	gotoXY(35, 22);
	printf("1. 开始游戏");

	gotoXY(55, 22);
	printf("2. 游戏说明");

	gotoXY(35, 24);
	printf("3. 退出游戏");

	gotoXY(35, 24);
	printf("3. 退出游戏");

	//输出用户选择提示
	gotoXY(27, 27);
	printf("请选择[1 2 3]:");

	//等待用户输入一个数字
	scanf("%d", &n);

	//读取回车字符
	getchar();
	return n;
}

3.初始化蛇

//初始化蛇
int initSnake(void)
{
   
   
	int i = 0;
	snake_t  *new = NULL;
	snake_t  *tmp = NULL;

	//循环创建4各结点
	for (i = 0; i < 4; i++){
   
   
		//分配空间
		new = malloc(sizeof(snake_t));
		if (NULL == new)
		{
   
   
			printf("malloc failed…\n");
			break;
		}
		memset(new, 0, sizeof(snake_t));

		//初始化列 是个偶数
		new->x = 24 + i * 2;
		//初始化行
		new->y = 5;

		//头插法
		new->next = head;
		head = new;
	}

	//绘制蛇
	tmp = head;
	while (NULL != tmp)
	{
   
   
		//设置蛇的颜色为黄色
		setColor(14);
		gotoXY(tmp->x, tmp->y);

		//如果是第一个节点  输出圆形符号
		if (head == tmp)
		{
   
   
			printf("●");
		}
		else
		{
   
   
			printf("★");
		}

		//指向下一个节点
		tmp = tmp->next;
	}
	return 0;
}

4.随机食物

//随机食物
//随机食物
int randFood(void)
{
   
   
	snake_t *new = NULL;
	snake_t *tmp = NULL;

	//分配空间
	new = malloc(sizeof(snake_t));
	if (NULL == new)
	{
   
   
		printf("malloc failed…\n");
		return -1;
	}

	//循环随机食物  保证食物没有在蛇身
	while (1)
	{
   
   
		//清零
		memset(new, 0, sizeof(snake_t));
		//随机x值
		while (1)
		{
   
   
			//随机x值    是一个偶数(2,54)
			//rand() %53 -->(0,  52)      -->+2   -->(2,54)
			new->x = rand() % 53 + 2;
			if (new->x % 2 == 0)
			{
   
   
				break;
			}
		}

		//rand()产生一个随机数
		//(1,25)
		//rand( ) % 25 --> (0,24)     -->+1   -->(1,25)
		new->y = rand() % 25 + 1;

		//判断食物不能在蛇身上
		tmp = head;
		while (NULL != tmp)
		{
   
   
			if ((tmp->x == new->x) && (tmp->y == new->y))
			{
   
   
				break;
			}
			tmp = tmp->next;
		
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值