00. 目录

01. 开发背景

​ 贪吃蛇起源于西方,来自于蛇骗夏娃和亚当偷吃禁果的神话。人们为了说明蛇的一个“贪”字,开发出了贪吃蛇游戏。本公开课使用C语言开发一个贪吃蛇游戏。

​ 贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。

通过本公开课的学习,大家可以学到:

  • Visual Studio 2017开发环境

  • C语言中的三大结构和函数

  • C语言中动态内存申请和释放

  • C语言中文件基本操作

  • C语言中的简单单向链表

  • 控制终端基本设置和监听按键

  • C语言简单游戏开发流程

  • C语言简单游戏开发调试技巧

02. 功能介绍

​ 贪吃蛇的游戏规则也很简单,具体为:蛇出现在封闭的空间中,同时在地图上会随机出现食物,玩家通过键盘上的上下左右方向键来控制蛇的前进方向。蛇头撞到食物,则食物消失,表示被蛇吃掉了,蛇身增加一节,增加玩家的得分。接着又随机出现一个食物,等待蛇来吃。如果蛇在前进的过程中撞到墙或者咬到蛇身或者玩家按下ESC键,则游戏退出。

项目演示

03. 欢迎界面设计

欢迎界面如下

3.1 常用终端控制函数

SetConsoleTextAttribute函数介绍

  1. BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes);
  2. 功能:设置控制台文本属性(颜色),可以设置前景色FOREGROUND(文本颜色)和背景色BACKGROUND

SetConsoleTextAttribute官方文档介绍

参考示例:

  1. HANDLE hOut;
  2. hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */
  3. SetConsoleTextAttribute(hOut, FOREGROUND_BLUE); /* 设置控制台颜色,前景色为蓝色*/
  4. SetConsoleTextAttribute(hOut, BACKGROUND_RED); /* 背景色为红色 */

SetConsoleCursorPosition函数介绍

  1. BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD dwCursorPosition);
  2. 功能:设置控制台光标坐标

SetConsoleCursorPosition官方文档介绍

参考示例:

  1. COORD pos = {x, y};/* x是横坐标 y是纵坐标 */
  2. HANDLE hOut;
  3. hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */
  4. SetConsoleCursorPosition(hOut,pos); /* 设置控制台光标坐标(设备句柄, 光标坐标) */

3.2 设置文本颜色函数

  1. //设置终端字体颜色
  2. int setColor(int c)
  3. {
  4. //GetStdHandle: 获取指定的标准设备的句柄
  5. //STD_OUTPUT_HANDLE 标准输出句柄
  6. //c 颜色值
  7. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
  8. return 0;
  9. }

十进制颜色对照表

3.3 设置光标位置函数

  1. //设置光标的坐标
  2. int gotoXY(int x, int y)
  3. {
  4. COORD c;
  5. //设置横坐标
  6. c.X = x;
  7. //设置纵坐标
  8. c.Y = y;
  9. //设置光标的位置
  10. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
  11. return 0;
  12. }

3.4 绘制字符画(蛇)

参考代码:

  1. //绘制字符画 --蛇
  2. int printSnake(void)
  3. {
  4. //清屏
  5. system("cls");
  6. gotoXY(35, 1);
  7. setColor(6);
  8. printf("/^\\/^\\"); //蛇眼睛
  9. gotoXY(34, 2);
  10. printf("|__| O|"); //蛇眼睛
  11. gotoXY(33, 2);
  12. setColor(2);
  13. printf("_");
  14. gotoXY(25, 3);
  15. setColor(12);
  16. printf("\\/"); //蛇信
  17. gotoXY(31, 3);
  18. setColor(2);
  19. printf("/");
  20. gotoXY(37, 3);
  21. setColor(6);
  22. printf(" \\_/"); //蛇眼睛
  23. gotoXY(41, 3);
  24. setColor(10);
  25. printf(" \\");
  26. gotoXY(26, 4);
  27. setColor(12);
  28. printf("\\____"); //舌头
  29. gotoXY(32, 4);
  30. printf("_________/");
  31. gotoXY(31, 4);
  32. setColor(2);
  33. printf("|");
  34. gotoXY(43, 4);
  35. setColor(10);
  36. printf("\\");
  37. gotoXY(32, 5);
  38. setColor(2);
  39. printf("\\_______"); //蛇嘴
  40. gotoXY(44, 5);
  41. setColor(10);
  42. printf("\\");
  43. gotoXY(39, 6);
  44. printf("| | \\"); //下面都是画蛇身
  45. gotoXY(38, 7);
  46. printf("/ / \\");
  47. gotoXY(37, 8);
  48. printf("/ / \\ \\");
  49. gotoXY(35, 9);
  50. printf("/ / \\ \\");
  51. gotoXY(34, 10);
  52. printf("/ / \\ \\");
  53. gotoXY(33, 11);
  54. printf("/ / _----_ \\ \\");
  55. gotoXY(32, 12);
  56. printf("/ / _-~ ~-_ | |");
  57. gotoXY(31, 13);
  58. printf("( ( _-~ _--_ ~-_ _/ |");
  59. gotoXY(32, 14);
  60. printf("\\ ~-____-~ _-~ ~-_ ~-_-~ /");
  61. gotoXY(33, 15);
  62. printf("~-_ _-~ ~-_ _-~");
  63. gotoXY(35, 16);
  64. printf("~--______-~ ~-___-~");
  65. return 0;
  66. }

测试代码如下:

  1. int main()
  2. {
  3. //设置控制台的宽高
  4. system("mode con cols=100 lines=30");
  5. printSnake();
  6. system("pause");
  7. return 0;
  8. }

测试效果如下:

3.5 欢迎界面函数

界面设计分析

参考代码:

  1. //欢迎界面
  2. int welcomGame(void)
  3. {
  4. int i;
  5. int j;
  6. int n = 0;
  7. //绘制字符画蛇
  8. printSnake();
  9. //输出文字
  10. setColor(11);
  11. gotoXY(45, 18);
  12. printf("贪吃蛇游戏");
  13. setColor(14);
  14. //边框范围20--26行 27--74列
  15. for (i = 20; i <= 26; i++)
  16. {
  17. for (j = 27; j <= 74; j++)
  18. {
  19. gotoXY(j, i);
  20. if (i == 20 || i == 26)
  21. {
  22. printf("-");
  23. }
  24. else if (j == 27 || j == 74)
  25. {
  26. printf("|");
  27. }
  28. }
  29. }
  30. setColor(12);
  31. gotoXY(35, 22);
  32. printf("1. 开始游戏");
  33. gotoXY(55, 22);
  34. printf("2. 游戏说明");
  35. gotoXY(35, 24);
  36. printf("3. 退出游戏");
  37. gotoXY(27, 27);
  38. printf("请选择[1 2 3]: ");
  39. scanf("%d", &n);
  40. //清空换行符
  41. getchar();
  42. return n;
  43. }

主函数参考代码如下:

  1. int main()
  2. {
  3. int choice;
  4. //设置控制台的宽高
  5. system("mode con cols=100 lines=30");
  6. while (1)
  7. {
  8. choice = welcomGame();
  9. switch (choice)
  10. {
  11. //开始游戏
  12. case 1:
  13. printf("开始游戏");
  14. break;
  15. //游戏说明
  16. case 2:
  17. printf("游戏说明");
  18. break;
  19. //退出游戏
  20. case 3:
  21. break;
  22. default:
  23. setColor(12);
  24. gotoXY(45, 28);
  25. printf("请做出有效选择[1~3]");
  26. //输入任意键
  27. getchar();
  28. }
  29. }
  30. system("pause");
  31. return 0;
  32. }

04. 游戏帮助界面设计

游戏说明模块如下:

游戏帮助界面参考代码

  1. //游戏帮助界面
  2. int aboutGame(void)
  3. {
  4. int i = 0;
  5. int j = 0;
  6. //清屏
  7. system("cls");
  8. setColor(13);
  9. gotoXY(44, 3);
  10. printf("游戏说明");
  11. setColor(2);
  12. //画出边框
  13. //6~22行 20~75列
  14. for (i = 6; i <= 22; i++)
  15. {
  16. for (j = 20; j <= 75; j++)
  17. {
  18. gotoXY(j, i);
  19. //画上下边框
  20. if (i == 6 || i == 22)
  21. {
  22. printf("=");
  23. }
  24. else if (j == 20 || j == 75)
  25. {
  26. printf("||");
  27. }
  28. }
  29. }
  30. setColor(3);
  31. gotoXY(30, 8);
  32. printf("★ 1.不能撞到墙壁,不能咬到自己");
  33. setColor(5);
  34. gotoXY(30, 11);
  35. printf("★ 2.F1加速前进,F2减速前进");
  36. setColor(11);
  37. gotoXY(30, 14);
  38. printf("★ 3.使用空格暂停游戏和继续游戏");
  39. setColor(13);
  40. gotoXY(30, 17);
  41. printf("★ 4.使用方向键控制前进的方向");
  42. setColor(14);
  43. gotoXY(30, 20);
  44. printf("★ 5.按下ESC键退出游戏");
  45. setColor(12);
  46. gotoXY(22, 24);
  47. printf("按下回车键返回主界面...");
  48. getchar();
  49. return 0;
  50. }

主函数代码修改如下:

  1. int main()
  2. {
  3. int choice;
  4. //设置控制台的宽高
  5. system("mode con cols=100 lines=30");
  6. while (1)
  7. {
  8. choice = welcomGame();
  9. switch (choice)
  10. {
  11. //开始游戏
  12. case 1:
  13. printf("开始游戏");
  14. break;
  15. //游戏说明
  16. case 2:
  17. aboutGame();
  18. break;
  19. //退出游戏
  20. case 3:
  21. break;
  22. default:
  23. setColor(12);
  24. gotoXY(45, 28);
  25. printf("请做出有效选择[1~3]");
  26. //输入任意键
  27. getchar();
  28. }
  29. }
  30. system("pause");
  31. return 0;
  32. }

05. 退出游戏实现

在主菜单中, 当用户选择3的时候,直接退出游戏

在主函数case 3中添加如下代码:

  1. //退出游戏
  2. case 3:
  3. exit(0);
  4. break;

大学生C/C++开发交流群

【C语言项目】贪吃蛇游戏(上)的更多相关文章

  1. C语言实现贪吃蛇游戏

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/times.h> ...

  2. 小项目特供 贪吃蛇游戏(基于C语言)

    C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...

  3. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  4. 贪吃蛇游戏——C语言双向链表实现

    采用了双向链表结点来模拟蛇身结点: 通过C语言光标控制函数来打印地图.蛇身和食物: /************************** *************************** 贪吃 ...

  5. 贪吃蛇游戏(printf输出C语言版本)

    这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...

  6. Love2D游戏引擎制作贪吃蛇游戏

    代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查 ...

  7. 使用Love2D引擎开发贪吃蛇游戏

    今天来介绍博主近期捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章其中我们将会涉及到贪吃蛇的基本算 ...

  8. WebGL实现HTML5的3D贪吃蛇游戏

    js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...

  9. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

随机推荐

  1. pl/sql 远程连接oracl服务器方法

    在Oracle/network/admin中的tnsnames.ora中添加对应的如下代码: LISTENER_ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = ...

  2. JAVA基础--面向对象09

    一.适配器设计模式 1.适配器模式 adapter:适配器: 电脑电源适配器:作用:转换电压,将不符合使用要求的220伏特的市电转换成我们电脑可以使用的电压: 适配器:将不符合使用要求的东西转换成符合 ...

  3. 51nod 1574 排列转换(猜结论)

    分析 猜了一下结论,居然对了..........具体操作是:假设排列s是1,2,3,...,nk为排列p中最大的 没有放到正确位置的数,k的位置为posk的右边一定有一个数x<=pos(因为&l ...

  4. Codeforces277A 【dfs联通块】

    题意: 给出n个人会的语言类型,然后问这n个人里面还需要几个人学习一下语言就可以n个直接互通了.a会1,2,b会2,3,c会4,那么只要C学一下1或者2,或者3就好了...大致就是这个意思. 思路: ...

  5. BestCoder Round #74 (div.1) 1002Shortest Path(hdoj5636)

    哈哈哈哈,我就知道这道题目再扔给我,我还是不会,就是这么菜,哈哈哈 一开始官方题解就没搞懂-然后就看了一下别人的代码,水水过就算了.今天拿到-GG: 题意: 一开始,有一张原图,有一条长度为n的链. ...

  6. poj1015【DP.......无奈了】

    首先,读题,真是一窍不通.后来看完程序的意思,才明白吧.. 题意: n个人中选m个,条件是取sum|D-P|最小,当有|D-P|相同的时候取|D+P|最大的.然后输出那些m个人的sumD,sumP,最 ...

  7. python 可迭代对象与迭代器之间的转换

    列表: >>> l = [1, 2, 3, 4] >>> l_iter = iter(l) >>> l_iter <list_iterato ...

  8. thinkphp5升级版开源框架tpframe v2.1发布

    免费开源框架tpframe是一款以thinkphp5为驱动,在此基础上进行进一步的完善与改进的框架,保持了ThinkPHP5原有的所有特性,优化核心,减少依赖,为个人或企业建站提供高效.快速解决的方案 ...

  9. wordpress数据库结构及表说明

    数据表结构: wp_commentmeta:存储评论的元数据wp_comments:存储评论wp_links:存储友情链接(Blogroll)wp_options:存储WordPress系统选项和插件 ...

  10. 关于long long int和__int64用%I64d和%lld输出在不同编译语言下的正确性

    http://blog.csdn.net/febr2/article/details/52068357 这个网址最下面