1、基 于 C 语 言 的 “ 贪 吃 蛇 ” 游 戏 的 设 计 与 实 现摘 3.功 能 描 述 : 本 游 戏 主 要 实 现 以 下 几 种 功 能“ 贪 吃 蛇 ” 游 戏贪吃蛇的控制功能 游戏显示更新功能 游戏分数更新功能图 1.游 戏 功 能 模 块3.1. 贪 吃 蛇 的 控 制 功 能 : 通 过 各 种 条 件 的 判 断 , 实 现 对 游 戏 蛇 的 左 移 、 右 移 、 下 移 、 上移 、 自 由 移 动 , 贪 吃 蛇 的 加 长 功 能 。3.2. 游 戏 显 示 更 新 功 能 : 当 贪 吃 蛇 左 右 移 动 、 上 下 移 动 , 以 及 身 体 加 长
2、时 要 清 除 先 前 的贪 吃 蛇 图 像 , 用 新 坐 标 重 绘 贪 吃 蛇 。3.3. 游 戏 分 数 更 新 功 能 : 在 游 戏 玩 家 进 行 游 戏 过 程 中 , 需 要 按 照 一 定 的 游 戏 规 则 给 游 戏玩 家 计 算 游 戏 分 数 。 比 如 , 贪 吃 蛇 每 吃 到 一 个 事 物 就 加 十 分 。4.数 据 结 构 设 计 :4.1食 物 Food 结 构 体struct Food int x;/*食 物 的 横 坐 标 */int y;/*食 物 的 纵 坐 标 */int yes;/*判 断 是 否 要 出 现 食 物 的 变 量 */foo
3、d;4.2贪 吃 蛇 snake 的 结 构 体struct Snake int xN;int yN;int node;/*蛇 的 节 数 */int direction;/*蛇 移 动 方 向 */int life;/* 蛇 的 生 命 ,0活 着 ,1死 亡 */snake;5.程 序 设 计 实 现 :5.1. 主 函 数 main()Main()函 数 主 要 实 现 了 对 整 个 程 序 的 运 行 控 制 , 以 及 相 关 功 能 模 块 的 调 用 。void Init(void);/*图 形 驱 动 */void Close(void);/*图 形 结 束 */void D
4、rawK(void);/*开 始 画 面 */void GameOver(void);/*结 束 游 戏 */void GamePlay(void);/*玩 游 戏 具 体 过 程 */void PrScore(void);/*输 出 成 绩 */void main(void) Init();/*图 形 驱 动 */DrawK();/*开 始 画 面 */GamePlay();/*玩 游 戏 具 体 过 程 */Close();/*图 形 结 束 */5.2. 图 形 驱 动 init()Init()主 要 功 能 是 初 始 化 屏 幕 为 图 形 模 式 函 数 。void Init(vo
5、id) int gd=DETECT,gm; initgraph(cleardevice();5.3. 开 始 画 面 , 左 上 角 坐 标 为 ( 50, 40) , 右 下 角 坐 标 为 ( 610, 460) 的 围 墙void DrawK(void)/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设 置 线 型 */for(i=50;i0;i-)/*蛇 的 每 个 环 节 往 前 移 动 ,也 就 是 贪 吃 蛇 的 关 键算 法 */ snake.xi=snake.xi
6、-1;snake.yi=snake.yi-1; /*1,2,3,4 表 示 右 ,左 ,上 ,下 四 个 方 向 ,通 过 这 个 判 断 来 移 动 蛇 头 */switch(snake.direction) case 1:snake.x0+=10;break;case 2: snake.x0-=10;break;case 3: snake.y0-=10;break;case 4: snake.y0+=10;break;for(i=3;i595|snake.y0455)/*蛇 是 否 撞 到 墙 壁 */GameOver();/*本 次 游 戏 结 束 */snake.life=1; /*蛇
7、 死 */if(snake.life=1)/*以 上 两 种 判 断 以 后 ,如果 蛇 死 就 跳 出 内 循 环 , 重 新 开 始 */break;if(snake.x0=food.x/*把 画 面 上 的 食 物东 西 去 掉 */rectangle(food.x,food.y,food.x+10,food.y-10);snake.xsnake.node=-20;snake.ysnake.node=-20; /*新 的 一 节 先 放 在 看 不 见 的 位 置 ,下 次 循 环 就 取 前 一 节 的 位 置 */snake.node+;/*蛇 的 身 体 长 一 节 */food.
8、yes=1;/*画 面 上 需 要 出 现 新 的 食 物*/ score+=10;PrScore();/*输 出 新 得 分 */setcolor(4);/*画 出 蛇 */for(i=0;isnake.node;i+)rectangle(snake.xi,snake.yi,snake.xi+10, snake.yi-10);delay(gamespeed);setcolor(0);/*用 黑 色 去 除 蛇 的 的 最 后 一 节*/rectangle(snake.xsnake.node-1,snake.ysnake.node-1,snake.xsnake.node-1+10,snake.
9、ysnake.node-1-10); /*endwhile( ! kbhit) */if(snake.life=1)/*如 果 蛇 死 就 跳 出 循环 */break;key=bioskey(0);/*接 收 按 键 */if(key=ESC)/*按 ESC键 退 出 */break;elseif(key=UPelseif(key=RIGHTelseif(key=LEFTelseif(key=DOWN/*endwhile(1)*/5.5. 游 戏 结 束结 束 游 戏 的 运 行 。void GameOver(void) cleardevice();PrScore();setcolor(RE
10、D); settextstyle(0,0,4);outtextxy(200,200,“GAME OVER“);getch();5.6. 输 出 成 绩其 功 能 是 输 出 玩 家 游 戏 结 束 后 的 分 数 。void PrScore(void) char str10;setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35); setcolor(6);settextstyle(0,0,2);sprintf(str,“score:%d“,score);outtextxy(55,20,str);5.7. 图 形 结 束结 束 图 形 驱 动 函 数
11、, 退 出 程 序 。void Close(void) getch();closegraph(); 6.游 戏 设 计 过 程 与 思 路 :首 先 , 明 确 该 游 戏 所 拥 有 的 功 能 与 游 戏 规 则 。贪 吃 蛇 的 要 求 为 : 一 条 蛇 在 封 密 的 围 墙 内 ,在 围 墙 内 随 机 出 现 一 个 食 物 。 通 过 按 键 盘上 的 四 个 光 标 控 键 控 制 蛇 向 上 下 左 右 四 个 方 向 移 动 ,蛇 头 撞 到 食 物 ,则 表 示 食 物 被 蛇 吃掉 ,这 时 蛇 的 身 体 长 一 节 ,同 时 计 10 分 ,接 着 又 出 现 食
12、 物 ,等 待 被 蛇 吃 掉 。 如 果 蛇 在 移 动过 程 中 ,撞 到 墙 壁 或 蛇 头 撞 到 自 己 身 体 游 戏 结 束 。这 个 程 序 的 关 键 点 是 表 示 蛇 的 图 形 以 及 蛇 的 移 动 。 可 以 用 一 个 小 矩 形 表 示 蛇 的 一 节身 体 ,身 体 每 长 一 节 ,增 加 一 个 矩 形 块 ,蛇 头 用 两 节 表 示 。 移 动 时 必 须 从 蛇 头 开 始 ,所 以 蛇不 能 向 相 反 移 动 ,也 就 是 蛇 尾 不 能 改 作 蛇 头 。 如 果 不 按 任 何 键 ,蛇 自 行 在 当 前 方 向 上 前 移 ,当 游 戏
13、者 按 了 有 效 的 方 向 键 后 ,蛇 头 朝 指 定 的 方 向 移 动 ,一 步 移 动 一 节 身 体 ,所 以 当 按 了有 效 的 方 向 键 后 ,先 确 定 蛇 头 的 位 置 ,然 后 蛇 身 体 随 着 蛇 头 移 动 ,图 形 的 实 现 是 从 蛇 头 的新 位 置 开 始 画 出 蛇 。 这 时 ,由 于 没 有 清 屏 的 原 因 ,原 来 蛇 的 位 置 和 新 蛇 的 位 置 差 一 个 单 位 ,所 以 看 起 来 蛇 会 多 一 节 身 体 ,应 将 蛇 的 最 后 一 节 用 背 景 覆 盖 。 食 物 的 出 现 和 消 失 也 可 以用 画 矩 形
14、 块 和 覆 盖 矩 形 块 方 法 实 现 。 为 了 便 于 理 解 ,可 以 定 义 两 个 结 构 体 : 食 物 和 蛇 。整 个 游 戏 可 分 为 四 个 步 骤 :1 自 行 设 计 开 始 界 面 , 按 键 或 鼠 标 点 击 开 始 游 戏 。2 显 示 游 戏 界 面 , 按 游 戏 规 则 进 行 游 戏 。3 画 面 实 时 显 示 选 手 得 分 , 贪 吃 蛇 每 吃 一 个 食 物 , 蛇 身 长 一 节 。4 结 束 时 给 出 提 示 和 得 分 。7.结 论 :本 文 讲 述 了 贪 吃 蛇 游 戏 的 实 现 原 理 , 对 程 序 的 模 块 设 计
15、 、 数 据 结 构 设 计 做 了 简 单 分析 。 并 通 过 源 码 分 析 讲 述 了 各 个 模 块 的 实 现 方 法 。 在 几 个 模 块 的 实 现 过 程 中 渗 透 了 部 分图 形 功 能 函 数 。 通 过 本 文 的 编 写 过 程 , 掌 握 了 以 下 几 点 知 识 点 :( 1) 图 形 系 统 的 初 始 化 和 关 闭( 2) 各 种 画 图 函 数 的 使 用( 3) 结 构 体 的 定 义( 4) 数 组 定 义 及 应 用( 5) 函 数 嵌 套 及 调 用( 6) 键 盘 操 作参 考 文 献 :【 1】 姜 灵 芝 ,余 健 . C 语 言 课 程 设 计 案 例 精 编 . 清 华 大 学 出 版 社 2008【 2】 何 援 军 .计 算 机 图 形 学 . 机 械 工 业 出 版 社 2002【 3】 谭 浩 强 .C程 序 设 计 ( 第 三 版 ) . 清 华 大 学 出 版 社 2005【 4】 李 春 葆 . 数 据 结 构 教 程 ( 第 二 版 ) . 清 华 大 学 出 版 社 2007.3