中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現簡單的貪吃蛇游戲

發布時間:2023-01-13 09:45:24 來源:億速云 閱讀:127 作者:iii 欄目:開發技術

本篇內容主要講解“C語言如何實現簡單的貪吃蛇游戲”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C語言如何實現簡單的貪吃蛇游戲”吧!

運行效果

C語言如何實現簡單的貪吃蛇游戲

代碼

#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語言貪吃蛇 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語言貪吃蛇\n\n    1. 開始游戲\n    2. 關于\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);
		}
	}
}

到此,相信大家對“C語言如何實現簡單的貪吃蛇游戲”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高尔夫| 霍山县| 临沭县| 北川| 新干县| 崇阳县| 泗洪县| 苏州市| 贡山| 盐亭县| 泰和县| 怀来县| 通化市| 体育| 化州市| 哈密市| 龙里县| 桂阳县| 朝阳区| 徐闻县| 赫章县| 吉林市| 隆昌县| 洪雅县| 禄丰县| 平乡县| 武安市| 黄冈市| 双牌县| 应城市| 姚安县| 高青县| 邵武市| 交口县| 甘肃省| 霸州市| 开远市| 西平县| 阜新市| 轮台县| 岱山县|