C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的示例代碼
一個(gè)簡(jiǎn)單的貪吃蛇游戲本來(lái)代碼就不多,在保證可讀性的情況下,很容易就控制在100以?xún)?nèi)了。
運(yùn)行效果
代碼
#include <Windows.h> #include <stdio.h> #include <conio.h> #include <time.h> #define PANIC(err) (fprintf(stderr,"PANIC Line %d : %s",__LINE__,err),exit(-1),1) #define PANICIFNULL(EXP) ((EXP)==NULL && PANIC("NULL")) typedef enum { EMPTY=0, WALL, BODY, FOOD } MAP; typedef int POSITION; struct { int color; const char* shape; } UI[] = { {2,"■"},{4,"□"},{6,"★"},{4,"●"} }; struct { int WIDTH, HEIGHT, direction, delay; MAP* map; POSITION* body, head, tail, len; } C; void initConsole(int width, int height) { char cmd[100]; sprintf_s(cmd,100, "mode con cols=%d lines=%d && title C語(yǔ)言貪吃蛇 By dreamer2q %s", width, height,__DATE__); system(cmd); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cur_info; GetConsoleCursorInfo(handle, &cur_info); cur_info.bVisible = FALSE; SetConsoleCursorInfo(handle, &cur_info); } void updatePosition(POSITION pos) { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD coord = { (pos % (C.WIDTH)) * 2 ,pos / (C.WIDTH) }; SetConsoleCursorPosition(handle, coord); SetConsoleTextAttribute(handle, UI[C.map[pos]].color); printf("%s", UI[C.map[pos]].shape); } MAP food(int t) { POSITION pos = (rand() % ((C.WIDTH - 2) * (C.HEIGHT - 2))) + C.WIDTH + 1; if (C.map[pos]) return food(t); else return (C.map[pos] = FOOD) ? updatePosition(pos), BODY : BODY; } int init() { C.WIDTH = C.HEIGHT = 30; initConsole(C.WIDTH * 2, C.HEIGHT); PANICIFNULL(C.map = (MAP*)malloc((C.WIDTH) * (C.HEIGHT) * sizeof(MAP))); PANICIFNULL(C.body = (POSITION*)malloc(C.WIDTH * C.HEIGHT * sizeof(POSITION))); C.head = (C.len = 3) - 1; C.direction = (C.tail = 0) + 1; C.delay = -150; memset(C.map, EMPTY, (C.WIDTH) * (C.HEIGHT) * sizeof(MAP)); for (int i = 0; i < (C.WIDTH) * (C.HEIGHT); i++) { i < C.WIDTH && (C.map[i] = C.map[C.WIDTH * (C.HEIGHT - 1) + i] = WALL); i < C.HEIGHT && (C.map[C.WIDTH * i] = C.map[C.WIDTH * i + C.WIDTH - 1] = WALL); i < C.len && (C.map[C.body[i] = C.WIDTH * C.HEIGHT / 2 + C.WIDTH / 2 - 1 + i] = BODY); updatePosition(i); } srand(time(NULL)); return food(0); } int Run(int shit) { int prv = 77; while (1) { if (_kbhit()) { int t = _getch(); if ((prv + t) == 152)continue; switch (t) { case 72:C.direction = -C.WIDTH; break; case 80:C.direction = C.WIDTH; break; case 75:C.direction = -1; break; case 77:C.direction = 1; break; case ' ':C.delay = -C.delay; break; default:continue; } prv = t; } #define INC(p) (((p)+1)%(C.WIDTH*C.HEIGHT)) if (C.delay > 0) Sleep(C.delay); else continue; switch (C.map[C.body[INC(C.head)] = C.body[C.head] + C.direction]) { case FOOD:food(C.len = -C.len - 1); case EMPTY: C.map[C.body[C.head = INC(C.head)]] = BODY; updatePosition(C.body[C.head]); if (C.len > 0) updatePosition((C.map[C.body[C.tail]] = EMPTY) ? BODY : C.body[C.tail]), C.tail = INC(C.tail); else C.len = -C.len; break; case WALL:case BODY: return -1;//dead } } } int main() { while (1) { initConsole(25, 10); printf("\n\tC語(yǔ)言貪吃蛇\(yùn)n\n 1. 開(kāi)始游戲\n 2. 關(guān)于\n q. 退出\n%"); switch (_getch()) { case 'q':return 0; case '2':MessageBoxA(GetConsoleWindow(), MB_OK|MB_ICONASTERISK); continue; case '1':Run(init()); MessageBoxA(GetConsoleWindow(), "SHIT", MB_OK | MB_ICONERROR); } } }
到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的示例代碼的文章就介紹到這了,更多相關(guān)C語(yǔ)言貪吃蛇游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語(yǔ)言統(tǒng)計(jì)素?cái)?shù)之和的實(shí)例
這篇文章主要介紹了c語(yǔ)言統(tǒng)計(jì)素?cái)?shù)之和的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12C語(yǔ)言 二叉樹(shù)的鏈?zhǔn)酱鎯?chǔ)實(shí)例
本篇文章主要介紹C語(yǔ)言中二叉樹(shù)的鏈?zhǔn)酱鎯?chǔ),這里提供了一個(gè)實(shí)例代碼進(jìn)行參考,這樣對(duì)二叉樹(shù)的鏈?zhǔn)酱鎯?chǔ)有更深入的了解,希望能幫到學(xué)習(xí)這塊知識(shí)的同學(xué)2016-07-07Qt使用SQLite數(shù)據(jù)庫(kù)存儲(chǔ)管理圖片文件
這篇文章主要為大家詳細(xì)介紹了Qt如何使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)存儲(chǔ)管理圖片文件的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04C++中四種對(duì)象生存期和作用域以及static的用法總結(jié)分析
以下是對(duì)C++中四種對(duì)象生存期和作用域以及static的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09利用C++單例模式實(shí)現(xiàn)高性能配置管理器
這篇文章主要為大家詳細(xì)介紹了如何利用C++單例模式實(shí)現(xiàn)高性能配置管理器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04C++ throw關(guān)鍵字實(shí)現(xiàn)拋出異常和異常規(guī)范
本文主要介紹了C++ throw關(guān)鍵字實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08