文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言如何实现简单的贪吃蛇游戏

2023-07-04 23:30

关注

本篇内容主要讲解“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语言如何实现简单的贪吃蛇游戏”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯