c/c++小项目之贪吃蛇1.0

 

1、头文件

#pragma once
#include <windows.h>
#define WIDTH  60              //墙宽
#define HIGH   20			   //墙高
#define XOFFSET 30			   //墙x轴偏移量
#define YOFFSET 2   		   //墙x轴偏移量
typedef struct  _body
{
	int x;
	int y;
}BODY;
typedef struct _snake
{
	BODY bodys[WIDTH * HIGH];    //蛇身体
	int size;					 //蛇大小
	int score;					 //成绩
	int dx;						 //x轴移动量
	int dy;						 //y轴移动量
	BODY food;					 //食物
	BODY tail;					 //尾巴
	COORD coord;				 //光标
}SNAKE;
void hide_cursor();				 //隐藏光标
void show_wall();				 //初始化显示墙
void init_snake(SNAKE*);		 //初始化蛇
void init_food(SNAKE*);			 //初始化食物
void show_ui(SNAKE*);			 //显示ui界面	
void control_snake(SNAKE*);		 //控制移动方向
void updata_snake(SNAKE*);		 //更新蛇位置坐标
void end_game(SNAKE*);			 //结束游戏
void eat_food(SNAKE*);			 //蛇吃到食物
void eat_body(SNAKE* );			 //蛇吃到自己
void start_game(SNAKE*);		 //开始游戏

2、.c文件

#include "snake.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
void hide_cursor()
{
	CONSOLE_CURSOR_INFO cci;
	cci.dwSize = sizeof(cci);
	cci.bVisible = FALSE;
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
void show_wall()
{
	for (int  i = 0; i <= HIGH + YOFFSET; i++)
	{
		for (int j = 0; j <= WIDTH + XOFFSET; j++)
		{
			if (i >= 0 && i < YOFFSET)
			{
				printf(" ");
			}
			else if (i == YOFFSET || i == HIGH + YOFFSET)
			{
				if (j >= 0 && j < XOFFSET)
				{
					printf(" ");
				}
				else
				{
					printf("+");
				}
			}
			else
			{
				if (j == XOFFSET || j == WIDTH + XOFFSET)
				{
					printf("+");
				}
				else
				{
					printf(" ");
				}
			}
		}
		putchar('\n');
	}
}
void init_snake(SNAKE* snake)
{
	snake->bodys[0].x = WIDTH / 2 + XOFFSET;
	snake->bodys[0].y = HIGH / 2 + YOFFSET;
	snake->bodys[1].x = snake->bodys[0].x + 1;
	snake->bodys[1].y = snake->bodys[0].y;
	snake->size = 2;
	snake->dx = 1;
	snake->dy = 0;
	snake->score = 0;
	snake->tail.x = 0;
	snake->tail.y = 0;
	snake->coord.X = 0;
	snake->coord.Y = 0;
}
void init_food(SNAKE* snake)
{
	srand((unsigned int)time(NULL));
	while (1)
	{
		int ret = 0;
		snake->food.x = rand() % 60 + 30;
		snake->food.y = rand() % 20 + 2;
		if (snake->food.x == 30 || snake->food.x == 2)
		{
			continue;
		}
		for (int i = 0; i < snake->size; i++)
		{
			if (snake->food.x == snake->bodys[i].x &&
				snake->food.y == snake->bodys[i].y)
			{
				ret = 1;
				break;
			}
		}
		if (!ret)
		{
			break;
		}
		else
		{
			continue;
		}
	
	}
}
void show_ui(SNAKE* snake)
{
	//显示蛇
	for (int i = 0; i < snake->size; i++)
	{
		//光标移动函数
		snake->coord.X = snake->bodys[i].x;
		snake->coord.Y = snake->bodys[i].y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);
		if (!i)
		{
			printf("@");
		}
		else
		{
			printf("*");
		}
	}
	//显示食物
	snake->coord.X = snake->food.x;
	snake->coord.Y = snake->food.y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);
	printf("$");
	//消除尾巴
	snake->coord.X = snake->tail.x;
	snake->coord.Y = snake->tail.y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);
	printf(" ");
}
void control_snake(SNAKE* snake)
{
	char key = 0;
	while (_kbhit())
	{
		key = _getch();
	}
	switch (key)
	{
	case 'w':
		snake->dx = 0;
		snake->dy = -1;
		break;
	case 'a':
		snake->dx = -1;
		snake->dy = 0;
		break;
	case 's':
		snake->dx = 0;
		snake->dy = 1;
		break;
	case 'd':
		snake->dx = 1;
		snake->dy = 0;
		break;
	}
}
void updata_snake(SNAKE* snake)
{
	snake->tail.x = snake->bodys[snake->size - 1].x;
	snake->tail.y = snake->bodys[snake->size - 1].y;
	for (int i = snake->size - 1; i > 0; i--)
	{
		snake->bodys[i] = snake->bodys[i - 1];
	}
	snake->bodys[0].x += snake->dx;
	snake->bodys[0].y += snake->dy;
}
void end_game(SNAKE* snake)
{
	snake->coord.X = WIDTH / 3 + XOFFSET;
	snake->coord.Y = HIGH  + 2 * YOFFSET;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);
	printf("game over! 成绩为%d\n", snake->score);
	free(snake);
	exit(0);
}
void eat_food(SNAKE* snake)
{
	if (snake->bodys[0].x == snake->food.x &&
		snake->bodys[0].y == snake->food.y)
	{
		snake->size++;
		snake->score += 10;
		updata_snake(snake);
		init_food(snake);
	}

}
void eat_body(SNAKE*  snake)
{
	for (int i = 1; i < snake->size; i++)
	{
		if (snake->bodys[0].x == snake->bodys[i].x && 
			snake->bodys[0].y == snake->bodys[i].y)
		{
			end_game(snake);
		}
	}
	
}
void start_game(SNAKE* snake)
{
	while (snake->bodys[0].x > XOFFSET && snake->bodys[0].x < WIDTH +XOFFSET
		&& snake->bodys[0].y > YOFFSET && snake->bodys[0].y < HIGH + YOFFSET)
	{
		control_snake(snake);
		updata_snake(snake);
		show_ui(snake);
		eat_body(snake);
		eat_food(snake);
		Sleep(150);
	}
	end_game(snake);
}

3、主文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include "snake.h"
int main()
{
	SNAKE* snake = (SNAKE* )malloc(sizeof(SNAKE));
	if (!snake)
	{
		puts("内存分配失败..");
		exit(1);
	}
	hide_cursor();
	show_wall();
	init_snake(snake);
	init_food(snake);
	show_ui(snake);
	start_game(snake);
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值