经典版:

要求:

1碰到四周和自身游戏结束;

2迟到食物蛇身增长;

3食物吃得越多游戏越快;

4通过w,a,s,d可控制蛇头的方向;

5蛇身颜色不一致。

源码(需要easy-x)

// 贪吃蛇.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<time.h>
#define BLOCK_SIZE 20
#define HEIGHT 30
#define WIDTH 40
int blocks[HEIGHT][WIDTH] = { 0 },cs=0;//储存地图信息和记录吃的食物数量,来控制速度;
char moveDirection;//控制舍身运动方向;
int food_i,food_j;//食物的坐标
int isfailure=0;//是否失败的标识符
void startup() {//初始化函数int i;blocks[HEIGHT / 2][WIDTH / 2] = 1;  //1代表蛇头,给蛇头位置for (i = 1; i < 5; i++) {blocks[HEIGHT/2][WIDTH/2-i] = i+1;}//初始化一个长度为5的蛇身;moveDirection ='d';//初始化蛇身方向为"d";// srand(time(0));//给srand()时间种子,防止随机有规律有寻;food_i = rand() % (HEIGHT - 5) + 2;//初始化食物坐标food_j = rand() % (WIDTH - 5) + 2;initgraph(WIDTH * BLOCK_SIZE, HEIGHT * BLOCK_SIZE);//初始化窗体setlinecolor(RGB(200, 200, 200));//设置地图中每个方块的边界颜色BeginBatchDraw();//开始批量绘制,防止闪屏,必须与FlushBatchDraw()一起使用;
}
void show() {//绘制函数cleardevice();//清屏与绘画搭配使用,做到动画的效果;int i, j;for (i = 0; i < HEIGHT; i++) {for (j = 0; j < WIDTH; j++) {//整个地图遍历if (blocks[i][j] > 0) {setfillcolor(HSVtoRGB(blocks[i][j] * 10, 0.9, 0.7));//蛇身的绘制,并用到HSVTORBG(),使蛇身颜色不一样;}else {setfillcolor(RGB(150, 150, 150));//绘制非蛇身的场景;}fillrectangle(j *BLOCK_SIZE, i * BLOCK_SIZE, (j + 1) * BLOCK_SIZE, (i + 1) * BLOCK_SIZE);//真正的绘制函数;}}setfillcolor(RGB(0, 255, 0));//设置食物颜色fillrectangle(food_j * BLOCK_SIZE, food_i * BLOCK_SIZE, (food_j+ 1) * BLOCK_SIZE, (food_i+ 1) * BLOCK_SIZE);//在食物地址绘制食物;if (isfailure ) {//如果游戏失败,绘制游戏失败标题;setbkmode(TRANSPARENT);settextcolor(RGB(255, 0, 0));settextstyle(80, 0, _T("宋体"));outtextxy(240, 220, _T("游戏失败"));}FlushBatchDraw();//按从BeginBatchDraw()开始的绘制要求绘制
}
void moveSnake() {//控制蛇身动作反应的内在函数int i, j;for (i = 0; i < HEIGHT; i++) {//给所有的蛇身的数组加一for (j = 0; j < WIDTH; j++) {if (blocks[i][j] > 0) {blocks[i][j]++;}}}int oldtial_i, oldtial_j, oldHead_i, oldHead_j;int max = 0;for (i = 0; i < HEIGHT; i++) {for (j = 0; j < WIDTH; j++) {if (max<blocks[i][j]) {//数组中最大的一定是蛇尾,把旧蛇尾的坐标存起来;max = blocks[i][j];oldtial_i = i;oldtial_j = j;}if (blocks[i][j] == 2) {//因为蛇头1加了1,所以为2,借此得到蛇头的位置oldHead_i = i;oldHead_j = j;}}}int newHead_i = oldHead_i; //  设定变量存储新蛇头的位置int newHead_j = oldHead_j;if (moveDirection == 'w') {newHead_i = oldHead_i - 1;//向上新蛇头的位置应该是逻辑上老蛇头的Y坐标减1;}else if (moveDirection == 's') {newHead_i = oldHead_i + 1;//向下新蛇头的位置应该是逻辑上老蛇头的Y坐标加1;}else if (moveDirection == 'a') {newHead_j = oldHead_j - 1;//向左新蛇头的位置应该是逻辑上老蛇头的X坐标减1;}else if (moveDirection == 'd') {newHead_j = oldHead_j +1;//向右新蛇头的位置应该是逻辑上老蛇头的X坐标加1;}if (newHead_i >=HEIGHT || newHead_i <= 0 || newHead_j >=WIDTH || newHead_j <= 0 || blocks[newHead_i][newHead_j]>0) {//蛇头蛇尾出界,以及检查到新蛇头在蛇身上,也就是蛇咬到自己为游戏失败;isfailure = 1;return ;}blocks[newHead_i][newHead_j] = 1;//给新蛇头的位置赋值1;if (newHead_i==food_i && newHead_j==food_j) {//如果新蛇头位置在食物的地方,也就是蛇吃到了食物,并给食物重新给一个位置;food_i = rand() % (HEIGHT - 5) + 2;food_j = rand() % (WIDTH - 5) + 2;cs++;//吃的次数加一;}else blocks[oldtial_i][oldtial_j] = 0;//如果没迟到食物,把旧蛇尾赋值为}
void updateWithoutInput() {if (isfailure) {//游戏未失败继续return;}if (cs > 7) {cs = 7;//防止cs过大而过快}int sx = 10 - cs ;//通过cs来控制刷新率,从而控制速度。static int waitIndex = 1;//设置静态变量,防止调用完该函数调用完后此变量内存空间被舍弃(效果和全局一样)。waitIndex++;if (waitIndex==sx) {//sx帧显示一次;moveSnake();waitIndex = 1;//循环重新开始}
}
void updateWithInput() {if (kbhit() && isfailure == 0) {//如果有输入,且未失败char input = _getch();if (input == 'a' || input == 's' || input == 'w' || input == 'd') {moveDirection = input;moveSnake();}}
}
int main()
{startup();//初始化;while (1) {//不断调用;show();updateWithoutInput();//更新与输入无关的参数;updateWithInput();//更新与输入有关的参数;}return 0;
}

运行结果:

c++实现经典游戏贪吃蛇(超详解)相关推荐

  1. 99行不用指针 c语言贪食蛇,小白99行C代码编写经典游戏贪吃蛇(多关版本)

    文章目录 前言 一.实现原理 1.地图打印 2.蛇身运动 3.方向键操控 4.四种判定 5.函数工具 二.游戏试玩 1.编译环境 2.源代码 三.代码详解 1.游戏配置部分(第1~31行) 2.游戏主 ...

  2. 【Unity实现经典游戏--贪吃蛇】

    作为一个将来想从事游戏行业的人来说,从一些经典游戏来学习Unity是最好不过的了,在这里我就介绍一下这次做的贪吃蛇. 贪吃蛇制作教学 详细的可以从上面链接进去学习,素材也从上方链接中取得.如果只是想了 ...

  3. 经典游戏---贪吃蛇从C++代码实现

    1.   题目描述 小时候都玩过贪吃蛇这个经典的小游戏,在我们的普通手机里似乎都是必备的.它伴随着我们的童年,经历了好多好多时光.它带给我们了许多的乐趣. 学习了c++这门编程语言后,我就想着能不能把 ...

  4. python经典教程游戏软件_手把手带领大家用Python来做经典游戏 — 贪吃蛇

    从头到尾,从无到有,逐步分析每一个环节的实现,旨在让大家真正搞清楚"如何用python做贪吃蛇". 课程内容: 基本逻辑 游戏逻辑 第一步.初始框架 第二步.绘制格子 第三步 ...

  5. c++实现经典游戏——贪吃蛇

    写贪吃蛇的主要难点在于控制转向和自动移动,控制转向可以用switch语句控制,但要特别注意的是当蛇本身在向左走时右转向键是无效的,需要多些一个函数进行判断. 写自动移动的函数的时候只需要对蛇头和蛇尾两 ...

  6. JavaGUI 简易贪吃蛇代码详解+图片素材

    简易贪吃蛇 运行截图 图片素材 代码详解 package com.du.snake; import javax.swing.*; import java.awt.*; import java.awt. ...

  7. C贪吃蛇代码详解(ncurse)

    #include<curses.h> //使用 ncurses 必须调用它的函数库 #include<stdlib.h> #include<time.h>#defi ...

  8. TypeScript实现小游戏---贪吃蛇(超详细)

    目录 项目背景及简介 多模块需求分析 场景模块需求 食物类模块需求 记分牌模块需求 蛇类模块需求 控制模块需求 项目搭建 ts转译为js代码 package.json包配置文件 webpack.con ...

  9. Tkinter模块GUI界面化编程实战(五)——大鱼吃小鱼游戏(含超详解及完整源码、完整程序免费下载链接)

    [上期回顾:Tkinter模块GUI界面化编程实战(四)--随机点名小程序] 这篇博客介绍了如何用Python Tkinter模块编写一个界面化的大鱼吃小鱼游戏,在博客下面有完整的源码,源码中有超详细 ...

最新文章

  1. 捷报!又一名HIV感染者被治愈,干细胞移植再次立功
  2. 张秋余---经典语录
  3. 网络安全:与 TCP 连接管理相关的网络攻击
  4. 特征工程(part2)--数值型数据
  5. System类入门学习
  6. 《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》一一第0章 初识数字图像处理与机器视觉...
  7. linux 复制文件到另一个目录命令_每天一条Linux命令(21) scp (远程文件复制)
  8. 非客观书评(三)——《ARM Cortex-M3 权威指南》
  9. flex sdk中mx_internal function getTextField() 这种函数如何调用?
  10. java代码整洁之道_代码整洁之道——我们是作者
  11. VLC ass字幕文件格式
  12. PMP知识点速记——4.1制定项目章程
  13. 2009 SD 2.0大会北京温都水城盛大召开(10月22日)
  14. 麦德龙的商品供应链管理
  15. 在python里调用c++的DLL出现Windows Error -529697949
  16. 网易云音乐歌单或歌曲封面提取
  17. java进度条_Java web实时进度条整个系统共用(如java上传、下载进度条、导入、导出excel进度条等)...
  18. 4个图片无损压缩工具,快速批量压缩图片,图片高清不糊
  19. 宽带连接连接被远程计算机终止win10,Win10宽带无法连接提示“调制解调器报告了一个错误”怎么解决?...
  20. 函数中arguments是什么?

热门文章

  1. python灰色波浪线_去除pycharm的波浪线
  2. Spine 皮肤Skins
  3. jquery实现手风琴展开效果
  4. 《食品真相大揭秘》摘录
  5. pureftpd mysql 语句_FTP服务器之pure-ftpd常用指令详解
  6. 内存走线 菊花链_[转帖]关于DDR4内存颗粒、单双面、主板布线和双通道的那些事儿...
  7. 北方工业大学计算机考研资料汇总
  8. php怎么把字弄到另一张图片上,怎样把一张图片p到另外一张图片上去
  9. pytorch之迁移学习
  10. cad画1000线太长了_为什么在CAD里面我画50变成了1000?