C语言写贪吃蛇

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

/* 地图长和宽 */
#define MAPHEIGHT 25
#define MAPWIDTH 60
#define SNAKSIZE 50

// 数据结构设计
int changeFlag = 0; // 蛇变化标记
int key = 'w';

// 食物位置
struct _food_
{
	int x;
	int y;
}food;

// 贪吃蛇数据结构
struct snake
{
	int x[SNAKSIZE]; // 蛇坐标
	int y[SNAKSIZE];
	int len; // 当前长度
	int speed; // 移动速度
}mysnake;

// cmd移动辅助函数
void gotoxy(int x, int y)
{
	// 获取cmd窗口句柄
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	// 光标位置
	COORD coord;
	coord.X = x;
	coord.Y = y;
	SetConsoleCursorPosition(handle, coord);
}

// 绘制地图
void drawMap()
{
	srand((unsigned int)time(NULL));
	// 食物
	// 1.食物属性
	food.x = rand() % (MAPWIDTH - 4) + 2;
	food.y = rand() % (MAPHEIGHT - 2) + 1;
		// 2.画食物
	gotoxy(food.x, food.y);
	printf("⊙");

	// 蛇
	// 1.蛇属性
	mysnake.x[0] = MAPWIDTH / 2; // 定位在中间
	mysnake.y[0] = MAPHEIGHT / 2;

	// 2.画蛇
	gotoxy(mysnake.x[0], mysnake.y[0]);
	printf("■");
	mysnake.len = 3;
	mysnake.speed = 100;
	for (int i = 1; i < mysnake.len; ++i) {
		mysnake.x[i] = mysnake.x[i - 1] + 2;
		mysnake.y[i] = mysnake.y[i - 1];
		gotoxy(mysnake.x[i], mysnake.y[i]);
		printf("■");
	}

	// 边框
	// 1.左右
	for (int i = 0; i < MAPHEIGHT; ++i) {
		gotoxy(0, i);
		printf("■");
		gotoxy(MAPWIDTH, i);
		printf("■");
	}

	// 2.上下
	for (int i = 0; i < MAPWIDTH; ++i) {
		gotoxy(i, 0);
		printf("■");
		gotoxy(i, MAPHEIGHT);
		printf("■");
	}
}

// 按键检测
void keyDown()
{
	key = _getch();
	switch (key)
	{
	case 'w':
	case 'W':
	case 72:
		mysnake.y[0]--;
		break;
	case 's':
	case 'S':
	case 80:
		mysnake.y[0]++;
		break;
	case 'a':
	case 'A':
	case 75:
		mysnake.x[0] -= 2;
		break;
	case 'd':
	case 'D':
	case 77:
		mysnake.x[0] += 2;
		break;
	default:
		return;
	}
	gotoxy(mysnake.x[0], mysnake.y[0]);
	printf("■");
	changeFlag = 0;
	gotoxy(MAPHEIGHT + 2, 0);
}

// 产生食物
void createFood()
{
	if (mysnake.x[0] == food.x && mysnake.y[0] == food.y)
	{
		srand((unsigned int)time(NULL));
		while (1) 
		{
			int flag = 1;
			food.x = rand() % (MAPWIDTH - 4) + 2;
			food.y = rand() % (MAPHEIGHT - 2) + 1;
			for (int i = 0; i < mysnake.len; ++i) {
				if (mysnake.x[i] == food.x && mysnake.y[i] == food.y) {
					flag = 0;
					break;
				}
			}
			// 食物坐标要为偶数且不能在蛇的身上
			if (flag && food.x % 2 == 0)
				break;
		}
		gotoxy(food.x, food.y);
		printf("⊙");
		mysnake.len++;
		changeFlag = 1;
	}
}

// 蛇状态
int snakeStatus()
{
	if (mysnake.x[0] == 0 || mysnake.x[0] == MAPHEIGHT - 2 
		|| mysnake.y[0] == MAPWIDTH - 2 || mysnake.y[0] == 0) 
	{
		return 0;
	}
	for (int i = 1; i < mysnake.len; ++i) {
		if (mysnake.x[i] == mysnake.x[0] && mysnake.y[i] == mysnake.y[0])
			return 0;
	}
	return 1;

}

int main()
{
	drawMap();
	while (1)
	{
		createFood();
		Sleep(mysnake.speed);
		keyDown();
		if (!snakeStatus())
			break;
	}
	MessageBox(NULL, TEXT("GameOver"), TEXT("提示"), MB_OK | MB_ICONWARNING);
	return 0;
}

  

posted @ 2020-05-24 11:26  veis  阅读(47)  评论(0编辑  收藏