新四季網

小遊戲穩定不掉大包的方法(項目實戰CC)

2023-11-10 08:04:40 3

每天一個C語言小項目,提升你的編程能力!

一、遊戲說明

本遊戲仿造 4399 的小遊戲-圍住神經貓。

遊戲操作:通過滑鼠點擊操作,設置路障,圍住神經貓,當成功圍住神經貓時,遊戲勝利。當神經貓逃離地圖邊緣,遊戲失敗。

二、遊戲截圖

三、實現思路

1. 地圖還原:

首先是遊戲的道路,這裡我們採用繪製灰白色的圓來表示可走的路,用黃色的圓來表示已存在的障礙物。同時還需要注意奇偶行需要交錯排列。

2. 貓的移動:

這裡我們採用廣度優先搜索求最短路徑。"貓"在一個位置,能夠移動的方向有6個,需要注意的是:

由於奇偶行交替排列,導致奇偶行貓的可行路徑是不一樣的,奇數行:上,下,左,右,左下,左上。

偶數行:上,下,左,右,右下,右上。剩下的就是常規的求最短路徑即可。

註:代碼中所用圖片,請見文末

四、完整代碼

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

/////////////////////////////////////////////////////////// 程序名稱:圍住神經貓// 編譯環境 Visual Studio2019(C 語言標準選擇C 17),EasyX// C語言/C 編程交流Q群:734106058#include #include #include #include #include #pragma comment( lib, "MSIMG32.LIB")#define pix 50 // 像素比例#define hight (14 * pix)#define width (10 * pix)using namespace std;int stepS; // 記錄已經走的步數int startBarrier; // 開始的障礙物數目wchar_t Score_[30];MOUSEMSG m; // 滑鼠操作IMAGE pig, bkimg;; // 加載圖片enum class picture{ none, barrier};struct XY{ int x, y; int lastX, lastY; //記錄上一個點的坐標}cat;struct node{ int x, y; //坐標,圓心位置 picture pic; //當前位置的圖片內容};node canvas[10][10]; // 地圖bool visit[10][10]; // 記錄是否訪問過地圖中的元素int path[10][10][2]; // 記錄上一個位置//注意:因為地圖是交錯排列的,奇數列與偶數列貓的移動不同int dirOdd[6][2]{ 1,0,-1,0,0,1,0,-1,-1,-1,-1,1 }; //控制方向奇數列int dirEven[6][2]{ 1,0,-1,0,0,1,0,-1,1,-1,1,1 }; //控制方向偶數列int main;//貼圖函數void transparentimage(IMAGE* dstimg, int x, int y, IMAGE* srcimg,int direction){ HDC dstDC = GetImageHDC(dstimg); HDC srcDC = GetImageHDC(srcimg); int w = 50; int h = 100; // 使用 Windows GDI 函數實現透明位圖 if (direction == 0) TransparentBlt(dstDC, x, y, w, h, srcDC, 0, 0, w, h, 0); else TransparentBlt(dstDC, x, y, w, h, srcDC, 10, 187, w, h, 0);}//遊戲初始化void initial{ srand(time(0)); stepS = 0; startBarrier = rand % 6 8; //障礙物數量 loadimage(&pig, L"pig.png"); loadimage(&bkimg, L"bkground.jpg", width, hight, true); initgraph(width, hight); HWND wnd = GetHWnd; SetWindowText(wnd, L"圍住神經貓");//設置文章標題 for (int i = 1; i <= 9; i) for (int j = 1; j <= 9; j) { if (i & 1) //如果是奇數行 canvas[i][j] = node{ j * pix - pix / 4, pix * 4 i * pix ,picture::none }; else canvas[i][j] = node{ j * pix pix / 4, pix * 4 i * pix ,picture::none }; } cat.x = 5; cat.y = 5; //貓最開始的地方 while (startBarrier--) { int bx, by; //設置初始障礙 do { bx = rand % 10; by = rand % 10; } while (canvas[by][bx].pic == picture::barrier || (by == cat.y && bx == cat.x)); canvas[by][bx].pic = picture::barrier; } setbkmode(TRANSPARENT); BeginBatchDraw;}//繪製遊戲畫面, 白色:空 黃色:障礙物 void show{ putimage(0, 0, &bkimg); setbkcolor(WHITE); settextstyle(20, 0, L"微軟雅黑"); outtextxy(200, 170, L"重玩"); outtextxy(250, 180, L"步數: "); swprintf(Score_, 29, L"%d", stepS); outtextxy(290, 180, Score_); for (int i = 1; i <= 9; i) { for (int j = 1; j <= 9; j) { if (canvas[i][j].pic == picture::barrier) setfillcolor(YELLOW); else setfillcolor(LIGHTGRAY); solidcircle(canvas[i][j].x, canvas[i][j].y, (pix - 4) / 2); } } if (cat.y & 1) //奇數列 transparentimage(NULL, cat.x * pix - pix / 4 - 25, pix * 3 cat.y * pix - 21, &pig,0); else //偶數列 transparentimage(NULL, cat.x * pix - 25 pix / 4, pix * 3 cat.y * pix - 21, &pig,1); FlushBatchDraw;}//尋找下一個點的位置struct LastOrder{ int x, y;};vector vec;void findNextXY(int x, int y){ if (x == cat.x && y == cat.y) { vec.push_back({ x,y }); return; } else { findNextXY(path[y][x][0], path[y][x][1]); vec.push_back({ x,y }); }}//利用廣度優先搜索求最短路徑,xy為數組的i,j下標,注意傳參void bfs(XY xy){ //每次搜索時初始化數組 memset(visit, false, sizeof(visit)); memset(path, 0, sizeof(path)); bool tag = true; queue que; que.push(xy); visit[xy.y][xy.x] = true; while (!que.empty) { XY temp = que.front; que.pop; //如果找到出口 if (temp.x == 1 || temp.x == 9 || temp.y == 1 || temp.y == 9) { findNextXY(temp.x, temp.y); cat.x = vec[1].x; cat.y = vec[1].y; vec.clear; tag = false; break; } int dx, dy; //尋找可走的路 for (int i = 0; i < 6; i) { if (temp.y & 1) { dx = temp.x dirOdd[i][0]; dy = temp.y dirOdd[i][1]; } else { dx = temp.x dirEven[i][0]; dy = temp.y dirEven[i][1]; } if (dx >= 1 && dx <= 9 && dy >= 1 && dy <= 9 && !visit[dy][dx] && canvas[dy][dx].pic == picture::none) { visit[dy][dx] = true; path[dy][dx][0] = temp.x; path[dy][dx][1] = temp.y; que.push({ dx,dy,temp.x,temp.y }); } } } if (tag) //如果沒找到出口 { show; HWND wnd = GetHWnd; swprintf(Score_, 29, L"你共用了%d步,重玩一局嗎", stepS); FlushBatchDraw; if (MessageBox(wnd, Score_, L"成功", MB_YESNO | MB_ICONQUESTION) == IDYES) main; else exit(-1); }}//滑鼠操作void dataChangeWithMouseHit{ while (true) { m = GetMouseMsg; if (m.x >= 200 && m.x <= 230 && m.y >= 170 && m.y = 200 && m.x <= 230 && m.y >= 170 && m.y <= 200) main; for (int i = 1; i <= 9; i) for (int j = 1; j <= 9; j) //如果在當前方格內,則改變信息 if (canvas[i][j].pic != picture::barrier && (m.x - canvas[i][j].x) * (m.x - canvas[i][j].x) (m.y - canvas[i][j].y) * (m.y - canvas[i][j].y) <= (pix - 4) * (pix - 4) / 4) { canvas[i][j].pic = picture::barrier; stepS ; bfs({ cat.x,cat.y,0,0 }); return; } } }}//不需要滑鼠的操作,判斷貓是否跑掉void dataChangeWithoutMouseHit{ if (cat.x == 1 || cat.y == 1 || cat.x == 9 || cat.y == 9) { show; HWND wnd = GetHWnd; if (MessageBox(wnd, L"遊戲結束。\n神經貓跑掉了!,重玩一局嗎", L"詢問", MB_YESNO | MB_ICONQUESTION) == IDYES) main; else exit(-1); }}int main{ initial; while (true) { show; dataChangeWithMouseHit; dataChangeWithoutMouseHit; Sleep(20); } return 0;}

大家趕緊去動手試試吧!

此外,我也給大家分享我收集的其他資源,從最零基礎開始的教程到C語言C 項目案例,幫助大家在學習C語言的道路上披荊斬棘!

編程學習書籍分享:

編程學習視頻分享:

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

對於C/C 感興趣可以關注小編在後臺私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回復,自動領取就好了!

,
同类文章
貓咪多久需要擠肛門腺(貓咪肛門腺到底要不要擠)

貓咪多久需要擠肛門腺(貓咪肛門腺到底要不要擠)

鏟屎官最近聞到自家的貓咪散發出一股臭味,久久揮散不去,走哪帶哪。 貓咪也開始頻繁在地上摩擦自己的屁股,這是貓咪需要擠肛門腺了嘛? 鏟屎官立刻就某度了一下,結果有人說要擠!有人說不要擠!這給人整暈乎了,到底是擠還是不擠啊! 本篇文章就幫鏟屎官們理理清楚,先出結論:不用擠!
寧波流浪狗愛心救助直播(寧波最暖心物業)

寧波流浪狗愛心救助直播(寧波最暖心物業)

救人一命 勝造七級浮屠 那救狗一命呢? 天熱了 小動物們都很愛折騰啊 論壇上剛來了一隻最不要臉的邊牧犬 現在又有了一隻錯估自己頭型 伸進欄杆卻出不來的流浪狗 …… (拍的略糊,可這小眼神看著又慘又想笑) 東論網友@quyd拍攝 終於,這副慘狀引來好心
蜘蛛俠新角色首曝(蜘蛛俠新女友黑貓)

蜘蛛俠新角色首曝(蜘蛛俠新女友黑貓)

2021年還剩下幾天就將成為過去式,而未來式的2022年也是站在了接力點前,而伴隨著2022年虎年的到來,關於漫威這段時間的很多消息傳聞也是不斷湧現出來,有關於後續的項目作品的,也有關於之前漫威項目新消息的。 所以,今天咱們就來看看,漫威這段時間都有哪些新消息曝光: 【1】8個漫威秘
狗突然的對主人叫心臟都要嚇壞了(主人以為狗狗躺在血泊中)

狗突然的對主人叫心臟都要嚇壞了(主人以為狗狗躺在血泊中)

家裡養了狗,那真就是隨時準備迎接新驚喜,尤其是柯基這種渾身上下散發著「智慧」氣質的狗狗。 這隻超可愛的柯基叫作Cartier,它的主人在泰國大城經營著一家咖啡館兒,平時它就跟主人在店裡呆著,四處遛遛什麼的。 前幾天主人像往常一樣讓Cartier出門自己上廁所然後等它回來。結果等了好久
貓超卡划算嗎(10元貓超卡又來了)

貓超卡划算嗎(10元貓超卡又來了)

前言:收到顯示器,黑色背景下全是彩色亮點,換貨; 不過27寸4K的屏幕,用電腦真的爽,比筆記本爽多了,雖然我這個筆記本是16寸的。01 10元貓超卡又來? 一、活動概覽 活動地址:https://developer.aliyun.com/adc/series/activity/serv
戰神貓熊滿級(娜貓的雙子指令形態登場)

戰神貓熊滿級(娜貓的雙子指令形態登場)

在最新的特攝雜誌上,出現了比較有趣的劇照,首先就是關於女騎假面騎士娜貓的新形態。雖然是女騎,但其實她的新形態比較少,目前一直都是在使用這個節拍形態,終於有了新的形態了。另外就是之前因為基洛利而下線的假面騎士棕熊,似乎並沒有死亡,然後再度歸來。然後就是假面騎士極狐和邪魔徒的立場了,似乎是合作了?因為
世界排名前10最聰明的狗貴賓(能記住一千多個單詞)

世界排名前10最聰明的狗貴賓(能記住一千多個單詞)

2021年5月10日,Hub City Animal Project宣布展出一座銅像,以紀念「世界上最聰明的狗狗」——Chaser。 她有多聰明呢?她在1歲時就能記住約4百個單詞,在三歲時,她的詞彙量已經超過了一千個! Chaser飼主的女兒Bianchi還說道,除了知道哪個單詞對應
淘寶目前暢銷的玩具(天貓618四大類玩具熱賣榜)

淘寶目前暢銷的玩具(天貓618四大類玩具熱賣榜)

截止6月20日23:59,天貓「618年中大促」落下帷幕。與往年鋪天蓋地的宣傳相比,今年整個活動周期都顯得有些安靜,平臺方甚至沒在活動結束第一時間發布最終成交額數據。這不免讓人忐忑:今年的行情是否很差? 從玩具業來看,不是很樂觀。中外玩具全媒體中心記者從部分廠商處獲悉,由於疫情對經濟造成的
愛養貓的女生什麼性格(養女兒如養貓)

愛養貓的女生什麼性格(養女兒如養貓)

在眾多想生兒子的家庭中,不全是因為重男輕女,而是有些夫妻感覺養女兒後經歷失望和傷心,許多方面要比養男孩更操心。 可女兒不是一直被稱為爸爸媽媽的貼心小棉襖嗎?為何會有人這樣比喻女兒呢?這不得不提有些女孩總在感情中犯傻的情況。 不久前的假期我參加了多場婚禮,現場有許多新娘新郎的長輩,在一聲聲祝
已滅絕的金剛鸚鵡(最高可賣上萬歐元)

已滅絕的金剛鸚鵡(最高可賣上萬歐元)

金剛鸚鵡原產於巴西的亞馬遜熱帶雨林地區。圖據《國家地理》網站 金剛鸚鵡是色彩豔麗的大型鸚鵡,羽毛五彩斑斕,像彩虹一樣漂亮。平均體長在90-100釐米左右。它們智商很高,模仿能力超強,平均壽命有65年之久。由於廣受喜歡,金剛鸚鵡長期以來成為不法分子走私的對象。據美國《國家地理》雜誌報導,隨