天天看點

【項目實戰】C/C++實作自制遊戲:挑戰六秒!你能挑戰成功嗎?

每天一個程式設計小項目,提升你的程式設計能力!

【項目實戰】C/C++實作自制遊戲:挑戰六秒!你能挑戰成功嗎?

挑戰六秒的說明

編寫這個程式的想法來源于生活中的這個小遊戲,一般商場等地方就會有這樣的一個供路人來玩的“挑戰六秒”的小小的裝置。看誰能夠準确的暫停到六秒整,感覺這個挺有意思,而且很鍛煉人的反應能力和預判能力。

其實編寫這個“挑戰六秒”程式的想法很早就産生了,但是由于各種原因,隻能等到放假空閑下來編寫。編寫過程還算順利,幾乎是一氣呵成,用了半天時間就編寫成功了。

程式編寫過程

首先我需要将程式的架構建構成功,主要過程就是按鍵後程式能夠結束循環并暫停。這個實作後接下來就是設計程式界面。以前設計界面我都是用尺子在紙上進行勾繪。最近我發現 CAD 其實更适用。使用 CAD 可以準确的設計布局,并且可以找準坐标。為了更加真實的模仿“挑戰六秒”,我需要按照電子數字字型繪制數字。我将電子數字字型分成 7 個子產品。并将每個子產品單獨的編寫成函數,每個子產品的繪制是比較耗費時間的,這 7 各子產品可以根據不同的組合組成需要的數字。為了防止出現閃屏的情況,我使用覆寫的方法将每次産生的數字進行覆寫。為了更加精确,我使用了精确延時。至于顔色搭配和布局設計這種,這可能就是小時候辦手抄小報時培養的吧,每個人的審美因人而異。

效果圖

【項目實戰】C/C++實作自制遊戲:挑戰六秒!你能挑戰成功嗎?

簡單了解遊戲後我們就來試試吧!(直接上源碼,大家可以看注釋)

#include<graphics.h>
#include<conio.h>
#include<time.h>

void name();								// 繪制标題提示等
void one(int x, int y);
void two(int x, int y);
void three(int x, int y);
void four(int x, int y);
void five(int x, int y);
void six(int x, int y);
void seven(int x, int y);					// one 到 seven 是組成電子數字的 7 個子產品
void HpSleep(int ms);						// 精确延時
void OUTNUMBER(int number, int x, int y);	// 将 7 個子產品組成數字 0 到 9
void OUTPUT(int i, int j, int k);			// 在螢幕上顯示

int main()
{
	initgraph(800, 600);
	setbkcolor(RGB(6, 31, 62));
	cleardevice();
	name();

	while (true)
	{
		OUTPUT(0, 0, 0);
		_getch();
		bool T = false;
		for (int i = 0; i <= 9; i++)
		{
			if (T)
			{
				break;
			}
			for (int j = 0; j <= 9; j++)
			{
				if (T)
				{
					break;
				}
				for (int k = 0; k <= 9; k++)
				{
					if (_kbhit())
					{
						T = true;
						break;
					}
					OUTPUT(i, j, k);
					HpSleep(10);
				}
			}
		}
		_getch();
		_getch();
	}
	return 0;
}

void name()
{
	RECT r = { 240, 80, 560, 160 };
	settextcolor(RGB(163, 212, 255));
	settextstyle(80, 0, _T("楷體"));
	drawtext(_T("挑戰六秒"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	settextcolor(RGB(254, 218, 168));
	settextstyle(20, 0, _T("楷體"));
	outtextxy(160,450,_T("提示:按“空格鍵”開始,再按暫停,繼續按将置零!"));
	settextcolor(RGB(252, 191, 116));
	outtextxy(160, 480, _T("準确暫停到六秒整挑戰成功!"));
}

void one(int x, int y)
{
	int pts[] = { 36 + x, 14 + y, 59 + x, 39 + y, 118 + x, 39 + y, 138 + x, 15 + y, 131 + x, 9 + y, 41 + x, 9 + y };
	setfillcolor(RGB(176, 215, 254));
	solidpolygon((POINT*)pts, 6);
}

void two(int x, int y)
{
	int pts[] = { 32 + x, 17 + y, 53 + x, 40 + y, 47 + x, 96 + y, 26 + x, 113 + y, 18 + x, 102 + y, 25 + x, 27 + y };
	setfillcolor(RGB(184, 249, 251));
	solidpolygon((POINT*)pts, 6);
}

void three(int x, int y)
{
	int pts[] = { 143 + x, 20 + y, 152 + x, 31 + y, 144 + x, 105 + y, 132 + x, 115 + y, 115 + x, 98 + y, 122 + x, 41 + y, };
	setfillcolor(RGB(187, 250, 255));
	solidpolygon((POINT*)pts, 6);
}

void four(int x, int y)
{
	int pts[] = { 46 + x, 101 + y, 113 + x, 101 + y, 127 + x, 116 + y, 111 + x, 131 + y, 45 + x, 131 + y, 29 + x, 117 + y };
	setfillcolor(RGB(187, 254, 219));
	solidpolygon((POINT*)pts, 6);
}

void five(int x, int y)
{
	int pts[] = { 25 + x, 120 + y, 43 + x, 136 + y, 38 + x, 199 + y, 15 + x, 223 + y, 6 + x, 209 + y, 15 + x, 127 + y };
	setfillcolor(RGB(245, 255, 192));
	solidpolygon((POINT*)pts, 6);
}

void six(int x, int y)
{
	int pts[] = { 132 + x, 119 + y, 144 + x, 128 + y, 136 + x, 213 + y, 129 + x, 222 + y, 107 + x, 201 + y, 115 + x, 134 + y };
	setfillcolor(RGB(245, 255, 190));
	solidpolygon((POINT*)pts, 6);
}

void seven(int x, int y)
{
	int pts[] = { 40 + x, 203 + y, 104 + x, 203 + y, 126 + x, 226 + y, 120 + x, 231 + y, 24 + x, 231 + y, 18 + x, 226 + y };
	setfillcolor(RGB(251, 221, 185));
	solidpolygon((POINT*)pts, 6);
}

void OUTNUMBER(int number, int x, int y)
{
	setfillcolor(RGB(6, 31, 62));
	solidrectangle(x, y, x + 160, y + 240);
	switch (number)
	{
	case 0:one(x, y); three(x, y); six(x, y); seven(x, y); five(x, y); two(x, y); break;
	case 1:three(x, y); six(x, y); break;
	case 2:one(x, y); three(x, y); four(x, y); five(x, y); seven(x, y); break;
	case 3:one(x, y); three(x, y); four(x, y); six(x, y); seven(x, y); break;
	case 4:two(x, y); three(x, y); four(x, y); six(x, y); break;
	case 5:one(x, y); two(x, y); four(x, y); six(x, y); seven(x, y); break;
	case 6:one(x, y); two(x, y); four(x, y); six(x, y); seven(x, y); five(x, y); break;
	case 7:one(x, y); three(x, y); six(x, y); break;
	case 8:one(x, y); three(x, y); six(x, y); seven(x, y); five(x, y); two(x, y); four(x, y); break;
	case 9:one(x, y); three(x, y); six(x, y); seven(x, y); two(x, y); four(x, y); break;
	}
}

void OUTPUT(int i, int j, int k)
{
	OUTNUMBER(i, 80, 180);
	setfillcolor(RGB(64, 157, 254));
	solidcircle(320, 240, 15);
	setfillcolor(RGB(163, 212, 255));
	solidcircle(320, 360, 15);
	OUTNUMBER(j, 400, 180);
	OUTNUMBER(k, 560, 180);
}

// 精确延時函數(可以精确到 1ms,精度 ±1ms)
// 記得加頭檔案 time.h
// by yangw80<[email protected]>, 2011-5-4
void HpSleep(int ms)
{
	static clock_t oldclock = clock();		// 靜态變量,記錄上一次 tick
	oldclock += ms * CLOCKS_PER_SEC / 1000;	// 更新 tick
	if (clock() > oldclock)					// 如果已經逾時,無需延時
		oldclock = clock();
	else
	while (clock() < oldclock)				// 延時
	Sleep(1);								// 釋放 CPU 控制權,降低 CPU 占用率
}           

大家趕緊去動手試試吧!

此外,我也給大家分享我收集的其他資源,幫助大家在學習C語言的道路上披荊斬棘!

【項目實戰】C/C++實作自制遊戲:挑戰六秒!你能挑戰成功嗎?
【項目實戰】C/C++實作自制遊戲:挑戰六秒!你能挑戰成功嗎?

整理分享(多年學習的源碼、項目實戰視訊、項目筆記,基礎入門教程)最重要的是你可以在群裡面交流提問程式設計問題哦!

對于C/C++感興趣可以關注小編在背景私信我:【程式設計交流】一起來學習哦!可以領取一些C/C++的項目學習視訊資料哦!已經設定好了關鍵詞自動回複,自動領取就好了!