[010]转+修正---C++的贪吃蛇程序(未用面向对象封装)
在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改。
没有用面向对象的方式来进行封装,下次准备试试。
需要在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++的贪吃蛇程序(未用面向对象封装)的更多相关文章
- 一个简单的c# 贪吃蛇程序
一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...
- C#简单实现贪吃蛇程序(LinQ + Entity)
做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...
- 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)
最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...
- Java小游戏贪吃蛇
package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...
- UI创意求助:手机贪吃蛇游戏方向控制键设计
继上一片博文<做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)>之后,尝试做一个手机版本,大部分的功能都已经实现了.但在贪吃蛇的方向控制设计上一直不太满意.由于手机界面的大 ...
- 关于用Java写的贪吃蛇游戏的一些感想
学习Java有那么一个月了,兴趣还是挺高的.然而最近老师布置的一个迷宫问题,着实让我头疼了一两个礼拜,以至于身心疲惫,困扰不安.无奈,暂且先放下这个迷宫问题,写个简单点的贪吃蛇程序,以此来提高低落的情 ...
- 如何用Python写一个贪吃蛇AI
前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...
- Devc++贪吃蛇
使用Devc++写的一个简单版贪吃蛇程序,不过,在未配置之前,是不包含图形库的,所以需要自己配置新的环境 ----------------------------------------------- ...
- html5面向对象做一个贪吃蛇小游戏
canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...
随机推荐
- I.MX6 driver goto 使用
/************************************************************************** * I.MX6 driver goto 使用 * ...
- Entity Framework Code First级联删除
如果我们要到一对主从表增加级联删除,则要在主表中的引用属性上增加Required关键字,如: public class Destination { public int DestinationId { ...
- [Everyday Mathematics]20150101
(1). 设 $f(x),g(x)$ 在 $[a,b]$ 上同时单调递增或单调递减, 试证: \[ (b-a)\int_a^b f(x)g(x)\mathrm{\,d}x \geq \int_a^b ...
- C# 创建WebServices及调用方法
发布WebServices 1.创建 ASP.NET Web 服务应用程序 SayHelloWebServices 这里需要说明一下,由于.NET Framework4.0取消了WebService ...
- HDU 1075-What Are You Talking About(Trie)
题意: 给你一个字典 一个英文单词对应一个火星单词 给你一段火星文翻译成英文 字典上的没有的不翻译 分析: 没有给数据规模 字典树用链表 #include <map> #include & ...
- 面向对象基础3(class0523)
怎么实现多态2-接口 接口是定义一种能力,规定子类能干什么和抽象类有些相似,解决类的单根继承.接口可以实现多继承 案例 鸟-麻雀sparrow,鸵鸟ostrich,企鹅penguin,鹦鹉parrot ...
- leetcode–Binary Tree Maximum Path Sum
1.题目说明 Given a binary tree, find the maximum path sum. The path may start and end at any node in t ...
- 题解西电OJ (Problem 1005 -跳舞毯)--动态规划
Description zyf不小心得了一种怪病,为了维持一天的精力他必须不停跳动.于是他买了一条跳舞毯,每天跳上几小时.众所周知,跳舞毯是给定一个序列,让你在指定时间踏指定的按钮,但zyf似乎不怎么 ...
- 远程控制篇:用Delphi模拟键盘输入/鼠标点击
模拟键盘我们用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数. Keybd_event函数能触发一个按键事件,也就是会产生一个WM_KEYDOWN或WM_KEYUP消息 ...
- 第十一章、认识与学习 BASH 管线命令 (pipe)
管线命令使用『 | 』界定符号 [root@www ~]# ls -al /etc | less 管线命令『 | 』仅能处理经由前面一个命令传来的正确信息,也就是 standard output 的信 ...