经典贪吃蛇游戏

上源码

#include <iostream>
#include <ctime>
#include <windows.h>
#pragma comment(lib,"User32.lib")
using namespace std;#define U 1
#define D 2
#define L 3
#define R 4 //蛇的状态 U:上 D:下 L:左 R:右//蛇身的一个节点
struct snake
{int x;int y;struct snake *next;
};int score = 0, add = 10;//总得分与每次吃食物得分
int status, sleeptime = 200;//每次运行方向和时间间隔
snake *head, *food;//蛇头指针和食物指针
snake *q;//遍历蛇的时候用到的指针
int endgamestatus = 0;//游戏结束的情况 1:撞到墙 2:咬到自己 3:主动退出游戏//设置光标位置
void Pos(int x, int y)
{COORD pos;pos.X = x;pos.Y = y;HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, pos); // 移动光标
}//开始界面
void welcometogame()
{Pos(34, 10);cout << "*******************************" << endl;Pos(40, 12);cout << "欢迎来到贪吃蛇游戏!" << endl;Pos(34, 14);cout << "*******************************" << endl;Pos(39, 16);cout << "Programed By ITHusky" << endl;Pos(40, 18);system("pause");system("cls"); // 清屏Pos(44, 9);cout << "游戏规则如下" << endl;Pos(30, 10);cout << "****************************************" << endl;Pos(31, 12);cout << "用 ↑.↓.←.→ 分 别 控 制 蛇 的 移 动" << endl;Pos(37, 14);cout << "F1 为 加 速,F2 为 减 速" << endl;Pos(33, 16);cout << "加 速 将 能 得 到 更 高 的 分 数" << endl;Pos(30, 18);cout << "****************************************" << endl;Pos(40, 20);system("pause");system("cls");
}//创建地图
void creatMap()
{int i;for (i = 0; i < 58; i += 2)//打印上下边框{Pos(i, 0);cout << "■";Pos(i, 26);cout << "■";}for (i = 1; i < 26; i++)//打印左右边框{Pos(0, i);cout << "■";Pos(56, i);cout << "■";}
}//初始化蛇身
void initsnake()
{snake *tail;int i;tail = (snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置tail->x = 24;tail->y = 5;tail->next = NULL;for (i = 1; i <= 4; i++)//蛇初始长度{head = (snake*)malloc(sizeof(snake));head->next = tail;head->x = 24 + 2 * i;head->y = 5;tail = head;}while (tail != NULL)//从头到尾,输出蛇身{Pos(tail->x, tail->y);cout << "■";tail = tail->next;}
}//随机出现食物
void createfood()
{snake *food_1;srand((unsigned)time(NULL));food_1 = (snake*)malloc(sizeof(snake));while ((food_1->x % 2) != 0)//保证为偶数,使得食物能与蛇头对齐{food_1->x = rand() % 52 + 3;}food_1->y = rand() % 24 + 1;q = head;while (q->next == NULL){if (q->x == food_1->x && q->y == food_1->y)//判断蛇身是否与食物重合{free(food_1);createfood();//递归}q = q->next;}if (food_1->x == 0 || food_1->x >= 58)//修改随机生成的数字food_1->x = 2;if (food_1->y == 0 || food_1->y >= 26)food_1->y = 2;Pos(food_1->x, food_1->y);food = food_1;cout << "■";
}//游戏初始化
void gamestart()
{system("mode con cols=100 lines=30");//调整控制台尺寸welcometogame();creatMap();initsnake();createfood();
}//结束游戏
void endgame()
{system("cls");Pos(28, 10);cout << "*****************************************" << endl;Pos(34, 12);if (endgamestatus == 1){cout << "对不起,您撞到墙了。游戏结束!" << endl;}else if (endgamestatus == 2){cout << "对不起,您咬到自己了。游戏结束!" << endl;}else if (endgamestatus == 3){cout << "您已经结束了游戏";}Pos(34, 14);cout << "您的得分是:" << score;Pos(28, 16);cout << "*****************************************" << endl;Pos(34, 18);system("pause");exit(0);
}//不能穿墙
void cantcrosswall()
{if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26){endgamestatus = 1;endgame();}
}//判断是否咬到了自己
int biteself()
{snake *self;self = head->next;while (self != NULL){if (self->x == head->x && self->y == head->y){return 1;}self = self->next;}return 0;
}//蛇前进:上U 下D 左L 右R
void snakemove()
{cantcrosswall();snake *nexthead;nexthead = (snake*)malloc(sizeof(snake));if (status == U){nexthead->x = head->x;nexthead->y = head->y - 1;if (nexthead->x == food->x && nexthead->y == food->y)//如果下一个有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);cout << "■";q = q->next;}score = score + add;createfood();}else//如果没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);cout << "■";q = q->next;}Pos(q->next->x, q->next->y);cout << "  ";free(q->next);q->next = NULL;}}if (status == D){nexthead->x = head->x;nexthead->y = head->y + 1;if (nexthead->x == food->x && nexthead->y == food->y)//有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);cout << "■";q = q->next;}score = score + add;createfood();}else//没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);cout << "■";q = q->next;}Pos(q->next->x, q->next->y);cout << "  ";free(q->next);q->next = NULL;}}if (status == L){nexthead->x = head->x - 2;nexthead->y = head->y;if (nexthead->x == food->x && nexthead->y == food->y)//有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);cout << "■";q = q->next;}score = score + add;createfood();}else//没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);cout << "■";q = q->next;}Pos(q->next->x, q->next->y);cout << "  ";free(q->next);q->next = NULL;}}if (status == R){nexthead->x = head->x + 2;nexthead->y = head->y;if (nexthead->x == food->x && nexthead->y == food->y)//有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);cout << "■";q = q->next;}score = score + add;createfood();}else//没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);cout << "■";q = q->next;}Pos(q->next->x, q->next->y);cout << "  ";free(q->next);q->next = NULL;}}if (biteself() == 1)//判断是否会咬到自己{endgamestatus = 2;endgame();}
}//暂停
void pause()
{while (1){Sleep(300);if (GetAsyncKeyState(VK_SPACE)){break;}}
}//控制游戏
void gamecircle()
{Pos(64, 15);cout << "不能穿墙,不能咬到自己" << endl;Pos(64, 16);cout << "用↑.↓.←.→分别控制蛇的移动!";Pos(64, 17);cout << "F1 为加速,F2 为减速" << endl;Pos(64, 18);cout << "ESC:退出游戏,space:暂停游戏!";status = R;//初始运动方向while (true){Pos(64, 10);cout << "得分:" << score;Pos(64, 11);cout << "每个食物得分:" << add;if (GetAsyncKeyState(VK_UP) && status != D){status = U;}else if (GetAsyncKeyState(VK_DOWN) && status != U){status = D;}else if (GetAsyncKeyState(VK_LEFT) && status != R){status = L;}else if (GetAsyncKeyState(VK_RIGHT) && status != L){status = R;}else if (GetAsyncKeyState(VK_SPACE)){pause();}else if (GetAsyncKeyState(VK_ESCAPE)){endgamestatus = 3;break;}else if (GetAsyncKeyState(VK_F1)){if (sleeptime >= 50)//运行时间间隔最小值50ms{sleeptime = sleeptime - 30;add = add + 2;//单个食物加2分if (sleeptime == 320){add = 2;//防止减到1之后再加回来有错}}}else if (GetAsyncKeyState(VK_F2)){if (sleeptime < 350)//运行时间间隔最大值350ms{sleeptime = sleeptime + 30;add = add - 2;if (sleeptime == 350){add = 1;//保证最低分为1}}}Sleep(sleeptime);snakemove();}
}void main()
{gamestart();gamecircle();endgame();
}

参考转载请附上本文链接

C++ 实现贪吃蛇游戏(免费附源码)相关推荐

  1. python小程序贪吃蛇_微信小程序实现的贪吃蛇游戏【附源码下载】

    本文实例讲述了微信小程序实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: 界面布局 pages/snake/snake/snake.wxml: snake 得分 ...

  2. c语言程序员写贪吃蛇代码28,厉害了,程序员28行代码写贪吃蛇游戏,附源码!...

    对于贪吃蛇游戏,大家基本上都玩过,但是作为一个程序员,大家是否想过要自己去写一个贪吃蛇,毕竟玩别人写的游戏和自己写的游戏是两种截然不同的感受,而且也可以通过制作来提升自己的技术! 其实贪吃蛇的逻辑并不 ...

  3. 记事本贪吃蛇游戏代码_厉害了,程序员28行代码写贪吃蛇游戏,附源码!

    对于贪吃蛇游戏,大家基本上都玩过,但是作为一个程序员,大家是否想过要自己去写一个贪吃蛇,毕竟玩别人写的游戏和自己写的游戏是两种截然不同的感受,而且也可以通过制作来提升自己的技术! 其实贪吃蛇的逻辑并不 ...

  4. 如何使用javascript制作一个网页端3D贪吃蛇游戏(附源码及链接)

    先来看游戏的最终效果: 3D网页版贪吃蛇游戏 下面来具体讲一下如何实现. 该游戏使用Hightopo的SDK制作,总共100多行代码,没有WebGL基础的同学们也可很快掌握. 场景初始化 首先,我们对 ...

  5. 贪吃蛇游戏(附源码)

    #include <stdio.h>   #include <conio.h>   #include <stdlib.h>   #include <time. ...

  6. C语言小游戏大全,C语言贪吃蛇小游戏(附源码)

    一.C语言小游戏大全,C语言贪吃蛇小游戏(附源码) 贪吃蛇小游戏源码和更多C语言课设项目小游戏源码免 费 下 载 链 接 如下: c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载 ...

  7. 小鸟飞行游戏【附源码】

    小鸟飞行游戏,java精品项目,毕业设计,计算机系,计算机毕业设计,程序设计,设计与实现,源码, 小鸟飞行游戏[附源码] 我的网站已经上线了 http://javapub.net.cn/ 博主介绍:

  8. 吃豆人游戏【附源码】

    吃豆游戏[附源码] 吃豆人游戏[附源码] 我的网站已经上线了 http://javapub.net.cn/ 博主介绍:

  9. java贪吃蛇游戏代码下载_java实现贪吃蛇游戏代码(附完整源码)

    免费资源网,https://freexyz.cn/ 先给大家分享源码,喜欢的朋友点此处下载. 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing ...

  10. java贪吃蛇代码_java实现贪吃蛇游戏代码(附完整源码)

    先给大家分享源码,喜欢的朋友点此处下载. 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame = ...

最新文章

  1. 用c# 实现设计器 DesignSurface
  2. 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )
  3. 【转】Spring 的下载、安装和使用
  4. 自然语言处理-nltk学习(二)
  5. 领域驱动设计,让程序员心中有码(二)
  6. 必填字段的自定义JSF验证器
  7. moodle架构分析---表现层的设计(二)
  8. python flask api 统计_python之restful api(flask)获取数据
  9. 巴菲特曾说过,如果一个人身上有以下几个恶习
  10. 巴蒂尔7个三分火箭破网 麦蒂战表兄取缺姚后首胜
  11. limbo pc for android,「Limbo PC emulator」可以让安卓手机安装 Windows 10 了
  12. Extjs4创建简单的图片上传
  13. mysql 端口关闭了_关闭MySQL的3306端口
  14. 三个重要的事件来看软件测试的重要性和软件测试的行情
  15. 排序算法(三)—— 插入法排序算法
  16. 工具使用 - IDA使用
  17. java飞机大战设计收获_飞机大战编写以及Java的面向对象总结
  18. 高新技术企业认定条件
  19. NMAP扫描基本操作
  20. php查询数据库表中的id个数,GitHub - xindong/easy-total: 一个可以对预先设定的sql语句进行实时数据统计并输出结果的服务...

热门文章

  1. 小学生的游戏 FZU - 1575
  2. IPhone4S自定义铃声
  3. 机器学习-有监督学习-分类算法:SVM/支持向量机【SVM:高维空间里用于二分类的超平面;支持向量:超平面附近隔离带边界上的样本】【求参数(ω,b)使超平面y(x)=Φ(x)·ω+b能最优分隔两集合】
  4. Hadoop3.2.0 Web应用程序代理
  5. FTP上传和WEB上传的区别
  6. 【设计模式】:单例设计模式深究
  7. linux let命令详解,Linux命令:let(示例代码)
  8. 北京摇号新政发布!每人只留一指标 60%新能源指标优先无车家庭
  9. 注册一个北京公司可以申请办理京牌吗,好申请吗?
  10. Proxmox监视器