贪吃蛇

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>

enum snakePosition { up, down, left, right };
typedef struct Point {
	int x, y;
	int sum;
	char position;
	int point;
}MYPOINT;
//初始化边界坐标
void initside(MYPOINT *sidexy) {
	int i, j, sum = 0;
	for (i = 0; i <= 15; i++) {
		sidexy[sum].x = 0;
		sidexy[sum].y = i * 2;
		sum++;
	}
	for (i = 0; i <= 15; i++) {
		sidexy[sum].x = 15;
		sidexy[sum].y = i * 2;
		sum++;
	}
	for (i = 0; i <= 14; i++) {
		sidexy[sum].x = i;
		sidexy[sum].y = 0;
		sum++;
	}
	for (i = 0; i <= 14; i++) {
		sidexy[sum].x = i;
		sidexy[sum].y = 30;
		sum++;
	}
}
//定义位置
void gotoxy(int x, int y){
	COORD position = { y,x };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}
//打印首页
void menu() {
	printf("□□□□□□□□□□□□□□□□\n");
	printf("□                            □\n");
	printf("□  欢迎运行 贪吃蛇 游戏程序  □\n");
	printf("□                            □\n");
	printf("□   制作:2019020171 JHZ      □\n");
	printf("□                            □\n");
	printf("□  操作方法: 上:w   下:s    □\n");
	printf("□             左:a   右:d    □\n");
	printf("□  难度:1简单 2中等 3巨难   □\n");
	printf("□                            □\n");
	printf("□  规则:头碰身、墙则游戏失败 □\n");
	printf("□                            □\n");
	printf("□ ※  数字键选择“难度”  ※ □\n");
	printf("□                            □\n");
	printf("□ 注:Ctrl+滚轮 放大游戏窗口 □\n");
	printf("□                            □\n");
	printf("□□□□□□□□□□□□□□□□\n");
	gotoxy(17, 2);
	printf("※ ※  祝您玩的愉快  ※ ※");
	
}
//隐藏光标
void HideCursor() {//隐藏光标 
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
//刷新游戏边界
void game_side(MYPOINT *sidexy) {
	int i;
	for (i = 0; i < 63; i++) {
		gotoxy(sidexy[i].x, sidexy[i].y);
		printf("□");
	}
}
//创建第一只蛇
void firstsnake(MYPOINT *body) {
	body[0].x = 1;
	body[0].y = 8;
	body[1].x = 1;
	body[1].y = 6;
	body[2].x = 1;
	body[2].y = 4;
	body[3].x = 1;
	body[3].y = 2;
	body->sum = 4;
	body->position = right;
}
//按键反应
void keyboard(MYPOINT *body) {
	char poz = _getch();
	switch (poz)
	{
	case VK_UP:
	case'w':
	case'W':
		if (body->position != down)
			body->position = up;
		break;
	case VK_DOWN:
	case's':
	case'S':
		if (body->position != up)
			body->position = down;
		break;
	case VK_LEFT:
	case'a':
	case'A':
		if (body->position != right)
			body->position = left;
		break;
	case VK_RIGHT:
	case'd':
	case'D':
		if (body->position != left)
			body->position = right;
		break;
	}
}
//蛇的移动
void snakemove(MYPOINT *body) {
	//身体
	int i;
	for (i = body->sum - 1; i > 0; i--)
	{
		body[i].x = body[i - 1].x;
		body[i].y = body[i - 1].y;
	}
	//蛇头
	switch (body->position)
	{
	case up:
		body[i].x -= 1;
		break;
	case down:
		body[i].x += 1;
		break;
	case right:
		body[i].y += 2;
		break;
	case left:
		body[i].y -= 2;
		break;
	}
}
//游戏结束
int gameover(MYPOINT *body, MYPOINT *sidexy, MYPOINT *egg) {
	int i;
	int flag = 0;
	if (body[0].x == egg->x&&body[0].y == egg->y) return 1;
	for (i = 0; i < 63; i++) {
		if (body[0].x == sidexy[i].x&&body[0].y == sidexy[i].y)return 1;
	}
	for (i = 1; body[i].x != '\0' && body[i].y != '\0'; i++) {
		if (body[0].x == body[i].x&&body[0].y == body[i].y) return 1;
	}
	return 0;
}
//分数总结目录
void point_summary(MYPOINT *body) {
	system("color 0B");
	if(body->sum<=10)printf("□□□□□□□□□□□□□□□□□\n");
	else printf("□□□□□□□□□□□□□□□□\n");
	printf("□                            □\n");
	printf("□           贪吃蛇           □\n");
	printf("□                            □\n");
	printf("□          游戏结束          □\n");
	printf("□                            □\n");
	printf("□  您最后的分数是:          □\n");
	printf("           >   %4d   <      \n",body->point);
	printf("□                            □\n");
	printf("□  蛇最后的长度为:          □\n");
	printf("           >   %4d   <      \n",body->sum);
	printf("□                            □\n");
	printf("□    ※ 任意键关闭窗口 ※    □\n");
	printf("□                            □\n");
	printf("□    制作:2019020171 JHZ    □\n");
	printf("□                            □\n");
	printf("□□□□□□□□□□□□□□□□\n");
	gotoxy(18, 0);
	printf("   现在时间: ");
	system("date /T");
	_getch();
}

int main() {
	//x是行,,y是列
	int flag , lon;
	int limit[14] = { 2,4,6,8,10,12,14,16,18,20,22,24,26,28 };
	int level;
	MYPOINT sidexy[63];
	MYPOINT body[196] = {'\0'};
	MYPOINT egg;
	initside(sidexy);
	HideCursor();
	srand((unsigned int)time(NULL));//产生随机数
	system("mode con cols=32 lines=19");//初始化界面 宽 、高
	system("color 0B");//首页前景背景颜色 
	menu(); //目录 
	level = _getch();
	switch (level) {
		case '1':level = 150; break;
		case '2':level = 100; break;
		case '3':level = 50; break;
		default:level = 100;
	}
	system("cls");
	system("color 3F");//游戏界面前景背景颜色 
	egg.x = rand() % 14 + 1;
	egg.y = (rand() % 14)*2 + 2;
	body->point = 0;
	firstsnake(body);
	while (1) {
		flag = 0;
		snakemove(body);
		for (lon = 0; body[lon].x != '\0'&&body[lon].y != '\0'; lon++) {
			gotoxy(body[lon].x, body[lon].y);
			printf("■");
		}
		gotoxy(egg.x, egg.y);
		printf("■");
		game_side(sidexy);
		if (_kbhit()) {
			keyboard(body);
		}
		
		if (egg.x == body[0].x&&egg.y == body[0].y)
		{
			body->point += 10;
			body->sum++;
			flag = 1;
		}
		gotoxy(17, 2);
		
		printf(" ※ 蛇的长度:%d 分数:%d ※ ", body->sum, body->point);
		if (flag) {
			egg.x = rand() % 13 + 1;
			egg.y = limit[rand()%14];
		}
		flag = 0;
		if (gameover(body,sidexy,&egg))break;
		Sleep(level);
		system("cls");
	}

	point_summary(body);


	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值