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

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

需要在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. 判断String为空

    1.  et_string.equals("")|| et_string==null 2.  ""用equal.null用== TextUtils.isEmpt ...

  2. 中国Azure媒体服务RESTAPI的Endpoint

    Amber Zhao  Thu, Feb 26 2015 4:09 AM 由于海外Azure和中国Azure有不同的domain,很多用户在使用媒体服务RESTAPI时,需要指定中国Azure媒体服务 ...

  3. Java 程序员在写 SQL 时常犯的 10 个错误

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...

  4. ps一般常用的快捷键

    jpg 不支持透明和半透明 :网页中的大图,高清图(体积大) gif 支持透明 不支持半透明 :网页中的小图标(动画图片)png8 支持透明 不支持半透明 :网页中的小图标png24 支持透明 支持半 ...

  5. 《深入Java虚拟机学习笔记》- 第11章 类型转换

    Java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有操作数,转换的值从栈顶断获得.Java虚拟机从栈顶端弹出一个值,对它进行转换,然后再把转换结果压入栈. int.lo ...

  6. <转>SpringMVC与Struts2 比较总结

    原链接:http://blog.csdn.net/chenleixing/article/details/44570681 个人整理: 1.级别不同:SpringMVC :方法  Struts是 类级 ...

  7. 每天一个linux 命令:which

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...

  8. Mac 中查看端口占用进程并杀死

    sudo lsof -i :9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 61342 a 313u IPv6 0x11111 ...

  9. 2015长春 HDU 5534 Partial Tree

    题意:有n个结点,n-1条边,现在要把这n个结点连成一棵树,给定了f(i),表示度为i的结点的价值是f(i).现在问如何连能够使得Σf(i)的值最大. 思路:每个点至少一个度,所以可分配的度数为n-2 ...

  10. Windows下ffmpeg的完美编译

    纠结了好几天,终于搞定了,小结一下. 1.下载ffmpeg源码,官网 2.编译环境Msys的安装配置,http://blog.csdn.net/jszj/article/details/4028716 ...