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

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

需要在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();
}
05-11 16:09