在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改。

没有用面向对象的方式来进行封装,下次准备试试。

需要在windows环境下进行编译

 #include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h> using namespace std; #define COUT cout<<"■"
#define MOVE_UP 1
#define MOVE_LEFT 2
#define MOVE_DOWN 3
#define MOVE_RIGHT 4 struct Body {
int x,y;
Body *next;
}; int Food=,Food_x,Food_y,Direction=MOVE_RIGHT,Grade,Score=;
// 定义蛇的头部
Body *body001=new Body[sizeof(Body)]; // 在指定位置输出需要显示的字符
void Position(int x,int y) {
// 定位坐标
COORD pos={y-,x-};
// 把字符输出到屏幕(命令行)
HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);
// 定位光标位置
SetConsoleCursorPosition(Out,pos);
} // 初始化蛇开始时的数量(4)
void CreatSneak() {
// 定义初始状态蛇头后的三个身体
Body *body002=new Body[sizeof(Body)];
Body *body003=new Body[sizeof(Body)];
Body *body004=new Body[sizeof(Body)];
// 固定初始状态的蛇的位置
body001->x=;body001->y=;
body002->x=;body002->y=;
body003->x=;body003->y=;
body004->x=;body004->y=;
// 初始状态的蛇连接(最后一个蛇身体指向即将被连接的身体)
body001->next=body002;
body002->next=body003;
body003->next=body004;
body004->next=NULL;
} // 创建游戏的框体
void Prt_Map() {
int i;
for(i=;i<=;i+=) {
Position(,i);COUT;
Position(,i);COUT;
}//x:2~23 共22个
for(i=;i<=;i++) {
Position(i,);COUT;
Position(i,);COUT;//y:3~55共27个
Position(i,);COUT;
}
} // 创建右侧的分数和选取的速度级别
void Prt_Sneak() {
// 定义蛇并使其指向蛇头
Body *p;
p=body001;
// 通过循环不断指向下一个指针指向的位置来实现蛇的移动
while(p!=NULL) {
Position(p->x,p->y);COUT;
p=p->next;
}
Position(Food_x,Food_y);COUT;
// 实时分数
Position(,);cout<<"Score: "<<Score;
// 选取的速度级别
Position(,);cout<<"Grade: "<<Grade;
} // 是否有异常的操作导致游戏结束
int JudgeOver() {
Body *p;
p=body001->next;
// 如果蛇碰到边框,则游戏结束
if(body001->y==||body001->y==||body001->x==||body001->x==){
return ;
}
// 如果没有碰到自身,那么正常执行
while(!(p->x==body001->x&&p->y==body001->y)) {
if(p->next==NULL) {
return ;
}
p=p->next;
}
// 碰到自身,游戏结束
return ;
} // 创建贪吃蛇的下一个食物
void Creat_Food() {
// 如果页面上没有食物,则创建
if(Food==) {
// 用当前的时间值来作为随机数种子,在随机位置定义
srand((int)time());
// 取随机数定义食物的横轴,后面的数操作是确保生成的食物在游戏框体内
Food_x=rand()%+;
int temp=rand()%+;
// 定义食物的竖轴
if(temp%==) {
Food_y=temp+;
}
else {
Food_y=temp;
}
Food=;
}
} // 操作贪吃蛇随着键盘的移动而移动
void Move() {
Body *p=new Body[sizeof(Body)],*q,*temp=new Body[sizeof(Body)];
// 向上
if(Direction==MOVE_UP) {
if(body001->x==(Food_x+)&&body001->y==Food_y) {
temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
}
else {
temp->x=body001->x-;temp->y=body001->y;temp->next=body001;body001=temp;
q=body001;
while((q->next)->next!=NULL)q=q->next;
Position((q->next)->x,(q->next)->y);cout<<" ";
delete(q->next); q->next=NULL;
}
}
// 向左
if(Direction==MOVE_LEFT) {
if(body001->x==Food_x&&body001->y==(Food_y+)) {
temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
}
else {
temp->x=body001->x;temp->y=body001->y-;temp->next=body001;body001=temp;
q=body001;
while((q->next)->next!=NULL)q=q->next;
Position((q->next)->x,(q->next)->y);cout<<" ";
delete(q->next); q->next=NULL;
}
}
// 向下
if(Direction==MOVE_DOWN) {
if(body001->x==(Food_x-)&&body001->y==Food_y) {
temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
}
else {
temp->x=body001->x+;temp->y=body001->y;temp->next=body001;body001=temp;
q=body001;
while((q->next)->next!=NULL)q=q->next;
Position((q->next)->x,(q->next)->y);cout<<" ";
delete(q->next); q->next=NULL;
}
}
// 向右
if(Direction==MOVE_RIGHT) {
if(body001->x==Food_x&&body001->y==(Food_y-)) {
temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
}
else{
temp->x=body001->x;temp->y=body001->y+;temp->next=body001;body001=temp;
q=body001;
while((q->next)->next!=NULL)q=q->next;
Position((q->next)->x,(q->next)->y);cout<<" ";
delete(q->next); q->next=NULL;
}
}
} // 执行游戏
void Game() {
while() {
// 如果游戏失败,返回
if(JudgeOver()==) {
return;
}
// 键盘操作光标键上
if(GetAsyncKeyState(VK_UP)&&Direction!=MOVE_DOWN) {
Direction=MOVE_UP;
}
// 键盘操作光标键左
if(GetAsyncKeyState(VK_LEFT)&&Direction!=MOVE_RIGHT) {
Direction=MOVE_LEFT;
}
// 键盘操作光标键下
if(GetAsyncKeyState(VK_DOWN)&&Direction!=MOVE_UP) {
Direction=MOVE_DOWN;
}
// 键盘操作光标键右
if(GetAsyncKeyState(VK_RIGHT)&&Direction!=MOVE_LEFT) {
Direction=MOVE_RIGHT;
}
// 创建贪吃蛇的下一个食物
Creat_Food();
// 取得贪吃蛇随着键盘的移动而移动的坐标
Move();
// 移动蛇
Prt_Sneak();
// 根据输入的速度,决定程序执行挂起的时间,以便得到移动速度
Sleep(-Grade*);
}
} void main() {
Position(,);
cout<<"Plese Select Grade:[1~10]";
// 输入蛇的运行速度
cin>>Grade; // 限制速度在1~10
if(Grade<||Grade>) {
system("cls");
Position(,);
cout<<"Wrong Grade!"<<endl;
return;
}
// 清除屏幕上的显示信息
system("cls");
// 创建初始状态的蛇
CreatSneak();
// 创建并显示游戏的框体
Prt_Map();
// 定义蛇的移动,创建右侧的分数和选取的速度级别
Prt_Sneak(); // 运行游戏
Game();
system("cls");
Position(,);
// 如果满屏,则输出成功,反之则输出失误
if (Score >= ) {
cout<<"You Win !"<<endl;
} else {
cout<<"You Lost !"<<endl;
}
Position(,);
cout<<"You Got "<<Score<<" Scores"<<endl;
Position(,);
getch();
}

[010]转+修正---C++的贪吃蛇程序(未用面向对象封装)的更多相关文章

  1. 一个简单的c# 贪吃蛇程序

    一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...

  2. C#简单实现贪吃蛇程序(LinQ + Entity)

    做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...

  3. 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)

    最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...

  4. Java小游戏贪吃蛇

    package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...

  5. UI创意求助:手机贪吃蛇游戏方向控制键设计

    继上一片博文<做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)>之后,尝试做一个手机版本,大部分的功能都已经实现了.但在贪吃蛇的方向控制设计上一直不太满意.由于手机界面的大 ...

  6. 关于用Java写的贪吃蛇游戏的一些感想

    学习Java有那么一个月了,兴趣还是挺高的.然而最近老师布置的一个迷宫问题,着实让我头疼了一两个礼拜,以至于身心疲惫,困扰不安.无奈,暂且先放下这个迷宫问题,写个简单点的贪吃蛇程序,以此来提高低落的情 ...

  7. 如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  8. Devc++贪吃蛇

    使用Devc++写的一个简单版贪吃蛇程序,不过,在未配置之前,是不包含图形库的,所以需要自己配置新的环境 ----------------------------------------------- ...

  9. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

随机推荐

  1. ShareSDK 实现新浪微博分享(微信,QQ,新浪微博类似)

    1 . 分享(前提是集成了sdk,配置好了Key),只要实现点击事件,调用shareSina(); ShareSDK.initSDK(this); private void shareSina() { ...

  2. oracle 导入导出数据

    Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中.利用 ...

  3. Annotation介绍@interface

    Annotation是继承自java.lang.annotation.Annotation的类,用于向程序分析工具或虚拟机提供package class field methed 等方面的信息,它和其 ...

  4. [面试题] for() while() 条件判断 赋值问题

    http://group.jobbole.com/7963/#comm-11311 [题目]:下列for循环的循环体执行次数为 for(int i=10, j=1; i=j=0; i++, j--)( ...

  5. 在windows10+word2010中完美使用北大方正word公式输入法总结

    如果在安装输入法时遇到了无法安装的情况,请首先百度下VC运行库安装下(32位64位都安就是),然后安装北大方正word公式输入法,此时不会再提示无法安装,接着(关键)在word应用程序图标右键-> ...

  6. HUST 1017 Exact cover dance links

    学习:请看 www.cnblogs.com/jh818012/p/3252154.html 模板题,上代码 #include<cstdio> #include<cstring> ...

  7. 对单片机的modbus RTU的详细解释(转载)

    Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看协议资料 ...

  8. temorrow read

    http://blog.csdn.net/yimiyangguang1314/article/details/6268177 http://www.cnblogs.com/killmyday/arch ...

  9. faplayer编译配置经验

    最近在做在线m3u8类格式的视频直播应用, 在获取m3u8的文件之后,如果采用Android系统播放器来播,会有各种各样的问题,容易卡死.不连续,也不能自定义一些选项.查找资料以后,决定采用fapla ...

  10. javascript设计模式8

    桥接模式(将抽象与其实现隔离开来,以便二者独立变化) function sendInfo(element){ var id=element.id; ajax("GET"," ...