c语言实现贪吃蛇

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<locale.h>
#include<stdbool.h>
#include<time.h>
enum direction//蛇的方向
{
	up,
	down,
	left,
	right
};
//蛇的状态,存活,撞墙,撞自己,正常退出
enum Status
{
	ok,
	killwall,
	killself,
	endnormal,
};
//蛇的节点
typedef struct node
{
	int x;
	int y;
	struct node* next;
}node, * pnode;
typedef struct snake
{
	pnode phead;//蛇头
	pnode pfood;//食物
	enum direction dir;//蛇的方向
	enum Status status;//游戏的状态
	int food_score;//食物的分数
	int sleep;
	int sum;//总成绩
}Snake, * pSnake;
void setpos(short x, short y);
void gamestart(pSnake psnake);
void initsnake(pSnake psnake);
void creatfood(pSnake psnake);
void gamerun(pSnake psnake);
void killbywall(pSnake psnake);
void killbyself(pSnake psnake);
void gameover(pSnake psnake);
#define she L'●'
#define wall L'■'
#define food L'★'
#define keypress(vk) ((GetAsyncKeyState(vk)&1)?1:0)//判断是否按过某一个按键,1表示按过,0表示没按过
void setpos(short x, short y)//设置光标的位置
{
	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos = { x,y };
	SetConsoleCursorPosition(houtput, pos);
}
void initsnake(pSnake psnake)
{
	for (int i = 0; i < 6; i++)
	{
		pnode pcur = (pnode)malloc(sizeof(node));
		if (pcur == NULL)
		{
			perror("malloc");
			return;
		}
		pcur->next = NULL;
		pcur->x = 24 + 2 * i;
		pcur->y = 5;
		if (psnake->phead == NULL)
			psnake->phead = pcur;
		else
		{
			pcur->next = psnake->phead;
			psnake->phead = pcur;
		}
	}
	pnode pcur = psnake->phead;
	while (pcur)
	{
		setpos(pcur->x, pcur->y);
		wprintf(L"%lc", she);
		pcur = pcur->next;
	}
	psnake->dir = right;
	psnake->sum = 0;
	psnake->food_score = 10;
	psnake->sleep = 200;//ms
	psnake->status = ok;
}
void creatfood(pSnake psnake)
{
	int x = 0;
	int y = 0;
again:
	do
	{
		x = rand() % 53 + 2;
		y = rand() % 25 + 1;
	} while (x % 2 != 0);
	//不能与蛇重合
	pnode pcur = psnake->phead;
	while (pcur)
	{
		if (x == pcur->x && y == pcur->y)
			goto again;
		pcur = pcur->next;
	}
	//创建食物节点
	pnode pfood = (pnode)malloc(sizeof(node));
	if (pfood == NULL)
	{
		perror("malloc");
		return;
	}
	pfood->x = x;
	pfood->y = y;
	pfood->next = NULL;
	setpos(x, y);
	wprintf(L"%lc", food);
	psnake->pfood = pfood;
}
void gamestart(pSnake psnake)
{
	system("mode con cols=100 lines=30");
	system("title Hungry Snake!");
	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cursorinf;
	GetConsoleCursorInfo(houtput, &cursorinf);
	cursorinf.bVisible = false;
	SetConsoleCursorInfo(houtput, &cursorinf);
	// 1.打印欢迎界面,功能介绍
	setpos(40, 14);
	printf("welcom to hungry snake");
	setpos(42, 20);
	system("pause");
	system("cls");
	setpos(25, 13);
	wprintf(L"用↑ ↓ ← →来控制蛇的移动方向,按F3加速,F4减速\n");
	setpos(35, 14);
	wprintf(L"加速能获得更高的分数\n");
	setpos(42, 20);
	system("pause");
	system("cls");
	// 3.绘制地图
	for (int i = 0; i < 29; i++)
		wprintf(L"%lc", L'■');
	setpos(0, 26);
	for (int i = 0; i < 29; i++)
		wprintf(L"%lc", L'■');
	for (int i = 1; i <= 25; i++)
	{
		setpos(0, i);
		wprintf(L"%lc", L'■');
	}
	for (int i = 1; i <= 25; i++)
	{
		setpos(56, i);
		wprintf(L"%lc", L'■');
	}
	// 4.创建蛇
	initsnake(psnake);
	// 5.创建食物
	creatfood(psnake);
}
void printinfo()
{
	setpos(64, 10);
	printf("%s", "不能穿墙,不能碰到自己\n");
	setpos(64, 11);
	printf("用↑ ↓ ← →来控制蛇的移动方向\n");
	setpos(64, 12);
	printf("按F3加速,F4减速\n");
	setpos(64, 13);
	printf("按ESC退出游戏,空格暂停游戏\n");
	setpos(64, 19);
	printf("VE出品必精品\n");
}
void snakemove(pSnake psnake)
{
	pnode newnode = (pnode)malloc(sizeof(node));
	if (newnode == NULL)
	{
		perror("malloc");
		return;
	}
	switch (psnake->dir)
	{
	case up:
		newnode->x = psnake->phead->x;
		newnode->y = psnake->phead->y - 1;
		break;
	case down:
		newnode->x = psnake->phead->x;
		newnode->y = psnake->phead->y + 1;
		break;
	case right:
		newnode->x = psnake->phead->x + 2;
		newnode->y = psnake->phead->y;
		break;
	case left:
		newnode->x = psnake->phead->x - 2;
		newnode->y = psnake->phead->y;
		break;
	}
	if ((psnake->pfood->x) == newnode->x && (psnake->pfood->y) == newnode->y)//吃到食物
	{
		psnake->pfood->next = psnake->phead;
		psnake->phead = psnake->pfood;
		free(newnode);
		newnode = NULL;
		pnode pcur = psnake->phead;
		while (pcur)
		{
			setpos(pcur->x, pcur->y);
			wprintf(L"%lc", she);
			pcur = pcur->next;
		}
		psnake->sum += psnake->food_score;
		creatfood(psnake);
	}
	else
	{
		newnode->next = psnake->phead;
		psnake->phead = newnode;
		pnode pcur = psnake->phead;
		while (pcur->next->next)
		{
			setpos(pcur->x, pcur->y);
			wprintf(L"%lc", she);
			pcur = pcur->next;
		}
		setpos(pcur->next->x, pcur->next->y);
		printf("  ");
		free(pcur->next);
		pcur->next = NULL;
	}
	if (psnake->phead->x == 0 || psnake->phead->x == 56 ||
		psnake->phead->y == 0 || psnake->phead->y == 26)
	{
		psnake->status = killwall;
		return;
	}
	else
	{
		pnode cur = psnake->phead->next;
		while (cur)
		{
			if (cur->x == psnake->phead->x && cur->y == psnake->phead->y)
			{
				psnake->status = killself;
				return;
			}
			cur = cur->next;
		}
	}
}
void gamerun(pSnake psnake)
{
	printinfo();
	do
	{
		setpos(64, 8);
		printf("总分:%d\n", psnake->sum);
		setpos(64, 9);
		printf("食物的分数:%2d\n", psnake->food_score);
		if (keypress(VK_UP) && psnake->dir != down)
			psnake->dir = up;
		else if (keypress(VK_DOWN) && psnake->dir != up)
			psnake->dir = down;
		else if (keypress(VK_RIGHT) && psnake->dir != left)
			psnake->dir = right;
		else if (keypress(VK_LEFT) && psnake->dir != right)
			psnake->dir = left;
		else if (keypress(VK_SPACE))
		{
			while (1)
			{
				Sleep(200);
				if (keypress(VK_SPACE))
					break;
			}
		}
		else if (keypress(VK_ESCAPE))
			psnake->status = endnormal;
		else if (keypress(VK_F3))
		{
			if (psnake->food_score < 22)
			{
				psnake->sleep -= 30;
				psnake->food_score += 2;
			}
		}
		else if (keypress(VK_F4))
		{
			if (psnake->food_score > 2)
			{
				psnake->sleep += 30;
				psnake->food_score -= 2;
			}
		}
		snakemove(psnake);
		Sleep(psnake->sleep);
	} while (psnake->status == ok);
}
void gameover(pSnake psnake)
{
	setpos(24, 12);
	switch (psnake->status)
	{
	case(endnormal):
		printf("主动退出游戏\n");
		break;
	case(killself):
		printf("已经紫砂\n");
		break;
	case(killwall):
		printf("一头撞死了\n");
		break;
	}
	pnode pcur = psnake->phead;
	while (pcur)
	{
		pSnake ret = pcur->next;
		free(pcur);
		pcur = ret;
	}
}
void test()
{
	char ch = 0;
	do//创建蛇
	{
		system("cls");
		Snake snake = { 0 };
		//初始化游戏
		gamestart(&snake);
		//运行游戏
		gamerun(&snake);
		//结束游戏
		gameover(&snake);
		setpos(20, 15);
		printf("再来一把,多好玩(Y/N):");
		ch = getchar();
		getchar();//清理\n 
	} while (ch == 'Y'||ch=='y');
	setpos(0, 27);
}
int main()
{  
	//设置适配本地环境
	setlocale(LC_ALL, "");
	srand((unsigned int)time(NULL));
	test();
	return 0;
}








基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值