C++ VS2013 貪喫蛇小遊戲

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
void gotoxy(int x, int y)//位置函數
{
	COORD pos;
	pos.X = 2 * x;
	pos.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void color(int a)//顏色函數
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
void init(int apple[2])//初始化函數(初始化圍牆、顯示信息、蘋果)
{
	int i, j;//初始化圍牆
	int wall[N + 2][N + 2] = { { 0 } };
	for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= N; j++)
			wall[i][j] = 1;
	}
	color(11);
	for (i = 0; i<N + 2; i++)
	{
		for (j = 0; j<N + 2; j++)
		{
			if (wall[i][j])
				std::cout << "■";
			else std::cout << "□";
		}
		std::cout << std::endl;
	}
	gotoxy(N + 3, 1);//顯示信息
	color(20);
	std::cout << "按 W S A D 移動方向" << std::endl;
	gotoxy(N + 3, 2);
	color(20);
	std::cout << "按任意鍵暫停" << std::endl;
	gotoxy(N + 3, 3);
	color(20);
	std::cout << "得分:" << std::endl;
	apple[0] = rand() % N + 1;//蘋果
	apple[1] = rand() % N + 1;
	gotoxy(apple[0], apple[1]);
	color(12);
	std::cout << "●" << std::endl;
}
int main()
{
	int i, j;
	int** snake = NULL;
	int apple[2];
	int score = 0;
	int tail[2];
	int len = 3;
	char ch = 'p';
	srand((unsigned)time(NULL));
	init(apple);
	snake = (int**)realloc(snake, sizeof(int*)*len);
	for (i = 0; i<len; i++)
		snake[i] = (int*)malloc(sizeof(int)* 2);
	for (i = 0; i<len; i++)
	{
		snake[i][0] = N / 2;
		snake[i][1] = N / 2 + i;
		gotoxy(snake[i][0], snake[i][1]);
		color(14);
		std::cout << "★" << std::endl;
	}
	while (1)//進入消息循環
	{
		tail[0] = snake[len - 1][0];
		tail[1] = snake[len - 1][1];
		gotoxy(tail[0], tail[1]);
		color(11);
		std::cout << "■" << std::endl;
		for (i = len - 1; i>0; i--)
		{
			snake[i][0] = snake[i - 1][0];
			snake[i][1] = snake[i - 1][1];
			gotoxy(snake[i][0], snake[i][1]);
			color(14);
			std::cout << "★" << std::endl;
		}
		if (_kbhit())
		{
			gotoxy(0, N + 2);
			ch = _getche();
		}
		switch (ch)
		{
		case 'w':snake[0][1]--; break;
		case 's':snake[0][1]++; break;
		case 'a':snake[0][0]--; break;
		case 'd':snake[0][0]++; break;
		default: break;
		}
		gotoxy(snake[0][0], snake[0][1]);
		color(14);
		std::cout << "★" << std::endl;
		Sleep(abs(200 - 0.5*score));
		if (snake[0][0] == apple[0] && snake[0][1] == apple[1])//喫掉蘋果後蛇分數加1,蛇長加1
		{
			score++;
			len++;
			snake = (int**)realloc(snake, sizeof(int*)*len);
			snake[len - 1] = (int*)malloc(sizeof(int)* 2);
			apple[0] = rand() % N + 1;
			apple[1] = rand() % N + 1;
			gotoxy(apple[0], apple[1]);
			color(12);
			std::cout << "●" << std::endl;
			gotoxy(N + 5, 3);
			color(20);
			std::cout << score << std::endl;
		}
		if (snake[0][1] == 0 || snake[0][1] == N || snake[0][0] == 0 || snake[0][0] == N)//撞到圍牆後失敗
		{
			gotoxy(N / 2, N / 2);
			color(30);
			std::cout << "失敗!!!" << std::endl;
			for (i = 0; i<len; i++)
				free(snake[i]);
			Sleep(INFINITE);
			exit(0);
		}
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章