【C語言項目】貪吃蛇遊戲(上)

00. 目錄

[TOC]html

01. 開發背景

​ 貪吃蛇起源於西方,來自於蛇騙夏娃和亞當偷吃禁果的神話。人們爲了說明蛇的一個「貪」字,開發出了貪吃蛇遊戲。本公開課使用C語言開發一個貪吃蛇遊戲。windows

​ 貪吃蛇最初爲人們所知的是諾基亞手機附帶的一個小遊戲,它伴隨着諾基亞手機走向世界。如今的貪吃蛇出現了許多衍生版本,並被移植到各類平臺上。函數

經過本公開課的學習,你們能夠學到:學習

  • Visual Studio 2017開發環境測試

  • C語言中的三大結構和函數字體

  • C語言中動態內存申請和釋放spa

  • C語言中文件基本操做設計

  • C語言中的簡單單向鏈表3d

  • 控制終端基本設置和監聽按鍵調試

  • C語言簡單遊戲開發流程

  • C語言簡單遊戲開發調試技巧

02. 功能介紹

​ 貪吃蛇的遊戲規則也很簡單,具體爲:蛇出如今封閉的空間中,同時在地圖上會隨機出現食物,玩家經過鍵盤上的上下左右方向鍵來控制蛇的前進方向。蛇頭撞到食物,則食物消失,表示被蛇吃掉了,蛇身增長一節,增長玩家的得分。接着又隨機出現一個食物,等待蛇來吃。若是蛇在前進的過程當中撞到牆或者咬到蛇身或者玩家按下ESC鍵,則遊戲退出。

項目演示

03. 歡迎界面設計

歡迎界面以下

3.1 經常使用終端控制函數

SetConsoleTextAttribute函數介紹

BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes);
功能:設置控制檯文本屬性(顏色),能夠設置前景色FOREGROUND(文本顏色)和背景色BACKGROUND

SetConsoleTextAttribute官方文檔介紹

參考示例:

HANDLE hOut;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);    		/* 獲取標註輸出句柄 */
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE); /* 設置控制檯顏色,前景色爲藍色*/
SetConsoleTextAttribute(hOut, BACKGROUND_RED);  /* 背景色爲紅色 */

SetConsoleCursorPosition函數介紹

BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD  dwCursorPosition);
功能:設置控制檯光標座標

SetConsoleCursorPosition官方文檔介紹

參考示例:

COORD pos = {x, y};/* x是橫座標 y是縱座標 */
HANDLE hOut;

hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 獲取標註輸出句柄 */
SetConsoleCursorPosition(hOut,pos);     /* 設置控制檯光標座標(設備句柄, 光標座標) */

3.2 設置文本顏色函數

//設置終端字體顏色
int setColor(int c)
{
	//GetStdHandle: 獲取指定的標準設備的句柄
	//STD_OUTPUT_HANDLE 標準輸出句柄
    //c 顏色值
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);

	return 0;
}

十進制顏色對照表

3.3 設置光標位置函數

//設置光標的座標
int gotoXY(int x, int y)
{
	COORD c;
	//設置橫座標
	c.X = x;
	//設置縱座標
	c.Y = y;

	//設置光標的位置
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);

	return 0;
}

3.4 繪製字符畫(蛇)

參考代碼:

//繪製字符畫 --蛇
int printSnake(void)
{
    //清屏
	system("cls");

	gotoXY(35, 1);
	setColor(6);
	printf("/^\\/^\\");      //蛇眼睛

	gotoXY(34, 2);
	printf("|__|  O|");      //蛇眼睛

	gotoXY(33, 2);
	setColor(2);
	printf("_");

	gotoXY(25, 3);
	setColor(12);
	printf("\\/");      	//蛇信

	gotoXY(31, 3);
	setColor(2);
	printf("/");

	gotoXY(37, 3);
	setColor(6);
	printf(" \\_/");     	//蛇眼睛

	gotoXY(41, 3);
	setColor(10);
	printf(" \\");

	gotoXY(26, 4);
	setColor(12);
	printf("\\____");   	//舌頭

	gotoXY(32, 4);
	printf("_________/");

	gotoXY(31, 4);
	setColor(2);
	printf("|");

	gotoXY(43, 4);
	setColor(10);
	printf("\\");

	gotoXY(32, 5);
	setColor(2);
	printf("\\_______");    //蛇嘴

	gotoXY(44, 5);
	setColor(10);
	printf("\\");

	gotoXY(39, 6);
	printf("|     |                  \\");  //下面都是畫蛇身

	gotoXY(38, 7);
	printf("/      /                   \\");

	gotoXY(37, 8);
	printf("/      /                    \\ \\");

	gotoXY(35, 9);
	printf("/      /                       \\ \\");

	gotoXY(34, 10);
	printf("/     /                          \\  \\");

	gotoXY(33, 11);
	printf("/     /             _----_         \\   \\");

	gotoXY(32, 12);
	printf("/     /           _-~      ~-_         |  |");

	gotoXY(31, 13);
	printf("(      (        _-~    _--_    ~-_     _/  |");

	gotoXY(32, 14);
	printf("\\     ~-____-~    _-~    ~-_    ~-_-~    /");

	gotoXY(33, 15);
	printf("~-_           _-~          ~-_       _-~");

	gotoXY(35, 16);
	printf("~--______-~                ~-___-~");

	return 0;
}

測試代碼以下:

int main()
{

	//設置控制檯的寬高
	system("mode con cols=100 lines=30");

	printSnake();

	system("pause");
	return 0;
}

測試效果以下:

3.5 歡迎界面函數

界面設計分析

參考代碼:

//歡迎界面
int welcomGame(void)
{
	int i;
	int j;

	int n = 0;

	//繪製字符畫蛇
	printSnake();

	//輸出文字
	setColor(11);
	gotoXY(45, 18);
	printf("貪吃蛇遊戲");

	setColor(14);

	//邊框範圍20--26行  27--74列
	for (i = 20; i <= 26; i++)
	{
		for (j = 27; j <= 74; j++)
		{
			gotoXY(j, i);
			if (i == 20 || i == 26)
			{
				printf("-");
			}
			else if (j == 27 || j == 74)
			{
				printf("|");
			}
		}
	}

	setColor(12);
	gotoXY(35, 22);
	printf("1. 開始遊戲");

	gotoXY(55, 22);
	printf("2. 遊戲說明");

	gotoXY(35, 24);
	printf("3. 退出遊戲");

	gotoXY(27, 27);
	printf("請選擇[1 2 3]: ");

	scanf("%d", &n);
	//清空換行符
	getchar();
	
	return n;
}

主函數參考代碼以下:

int main()
{
	int choice;

	//設置控制檯的寬高
	system("mode con cols=100 lines=30");

	while (1)
	{
		choice = welcomGame();

		switch (choice)
		{
			//開始遊戲
		case 1:
			printf("開始遊戲");
			break;

			//遊戲說明
		case 2:
			printf("遊戲說明");
			break;

			//退出遊戲
		case 3:
			break;
		default:
			setColor(12);
			gotoXY(45, 28);
			printf("請作出有效選擇[1~3]");
			//輸入任意鍵
			getchar();
		}
	}

	system("pause");
	return 0;
}

04. 遊戲幫助界面設計

遊戲說明模塊以下:

遊戲幫助界面參考代碼

//遊戲幫助界面
int aboutGame(void)
{
	int i = 0;
	int j = 0;

	//清屏
	system("cls");

	setColor(13);
	gotoXY(44, 3);
	printf("遊戲說明");

	setColor(2);
	//畫出邊框
	//6~22行   20~75列
	for (i = 6; i <= 22; i++)
	{
		for (j = 20; j <= 75; j++)
		{
			gotoXY(j, i);
			//畫上下邊框
			if (i == 6 || i == 22)
			{
				printf("=");
			}
			else if (j == 20 || j == 75)
			{
				printf("||");
			}
		}
	}

	setColor(3);
	gotoXY(30, 8);
	printf("★ 1.不能撞到牆壁,不能咬到本身");

	setColor(5);
	gotoXY(30, 11);
	printf("★ 2.F1加速前進,F2減速前進");

	setColor(11);
	gotoXY(30, 14);
	printf("★ 3.使用空格暫停遊戲和繼續遊戲");

	setColor(13);
	gotoXY(30, 17);
	printf("★ 4.使用方向鍵控制前進的方向");

	setColor(14);
	gotoXY(30, 20);
	printf("★ 5.按下ESC鍵退出遊戲");

	setColor(12);
	gotoXY(22, 24);
	printf("按下回車鍵返回主界面...");

	getchar();

	return 0;
}

主函數代碼修改以下:

int main()
{
	int choice;

	//設置控制檯的寬高
	system("mode con cols=100 lines=30");

	while (1)
	{
		choice = welcomGame();

		switch (choice)
		{
			//開始遊戲
		case 1:
			printf("開始遊戲");
			break;

			//遊戲說明
		case 2:
			aboutGame();
			break;

			//退出遊戲
		case 3:
			break;
		default:
			setColor(12);
			gotoXY(45, 28);
			printf("請作出有效選擇[1~3]");
			//輸入任意鍵
			getchar();
		}
	}

	system("pause");
	return 0;
}

05. 退出遊戲實現

在主菜單中, 當用戶選擇3的時候,直接退出遊戲

在主函數case 3中添加以下代碼:

//退出遊戲
case 3:
	exit(0);
	break;

大學生C/C++開發交流羣

原文出處:https://www.cnblogs.com/szitcast/p/11081773.html

相關文章
相關標籤/搜索