大大维的贪吃蛇v1
本文为大大维原创,最早于博客园发表,转载请注明出处!!!
虽然本人一直是个免费的游戏测试员(/手动滑稽),但一直有着一个游戏架构师的梦想。正如马爸爸所说,梦想还是要有的,万一实现了呢?
这些天放寒假,有些空闲时间,就想着做一个简单的游戏机。能达到小时候十几块钱买的那种小霸王的功能就差不多了(有贪吃蛇,赛车小游戏,俄罗斯方块,雷霆战机,坦克大战,2048,拼图等),好吧,原谅我有些浮夸风(/手动斜眼)。。。
这不,下面是我这两天抠出来的一个最简单的贪吃蛇小游戏,姑且叫它“大大维的贪吃蛇v1”吧!!!
游戏功能比较简单,后续还需要完善。先将代码在这保存一份,日后看看,也是一件挺有意思的事情吧!!!
/**--------------------------------------------------**/
/**名称:大大维的贪吃蛇v1 日期:2017/1/22**/
/**描述:实现了贪吃蛇的基本功能,可以调节游戏难度,**/
/**做了一个简单的用户界面 **/
/**存在的问题:由于使用了全局数组存贮,因此对Space **/
/**类的封装有些欠缺;由于使用了全局刷新,游戏运行中**/
/**会出现闪屏现象,游戏难度越高,闪动越严重;不能够**/
/**存储玩家的游戏记录,由于不是图形化界面,用户界面**/
/**较丑;不能改变游戏的地图大小 **/
/**笔者会在后续版本逐步完善这些问题!!! **/
/**--------------------------------------------------**/ #include<iostream>
#include<ctime>
#include<cstdlib>
#include<cstdio>
#include<conio.h>
#include<windows.h>
using namespace std;
const int SpaceLENG=;
const int SpaceHIGH=;
const int HARDSPEED=;
const int NOMALSPEED=;
const int EASYSPEED=;
int speed=NOMALSPEED;
bool FLAG=true;
enum dir {UP,DOWN,LEFT,RIGHT};///使用小写会引发歧义
enum level {HARD,ESAY,NOMAL};
///----------------------------------------------------
///游戏空间定义
class Space
{
public:
void InitSpace();
void DisplaySpace();
public:
char SpaceData[SpaceLENG+][SpaceHIGH+];
};
void Space::InitSpace()
{
for(int i=-; i<SpaceLENG+; i++)
for(int j=-; j<SpaceHIGH+; j++)
{
if(i<||i==SpaceLENG||j<||j==SpaceHIGH)
SpaceData[i][j]='#';
else
SpaceData[i][j]=' ';
}
}
void Space::DisplaySpace()
{
for(int i=-; i<SpaceLENG+; i++)
{
for(int j=-; j<SpaceHIGH+; j++)
{
cout<<SpaceData[i][j];
}
cout<<endl;
}
cout<<endl<<endl;
}
Space *spa=new Space();
///----------------------------------------------------
///蛇节点定义
class SnakeNode
{
public:
void setXY(int m,int n)
{
x=m;
y=n;
}
void setNext(SnakeNode *temp)
{
next=temp;
}
void setPrior(SnakeNode *temp)
{
prior=temp;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
SnakeNode* getNext()
{
return next;
}
SnakeNode* getPrior()
{
return prior;
}
private:
int x,y;
SnakeNode *prior,*next;
};
///----------------------------------------------------
///食物定义
class Food
{
public:
void foodCreate()
{
bool flag=true;
while(flag)
{
srand((unsigned int)time(NULL));
fx=rand()%SpaceLENG;
fy=rand()%SpaceHIGH;
if(spa->SpaceData[fx][fy]!='*')
flag=false;
} spa->SpaceData[fx][fy]='$';
}
int getFx()
{
return fx;
}
int getFy()
{
return fy;
}
private:
int fx;
int fy;
};
///----------------------------------------------------
///蛇定义
class Snake:public SnakeNode,public Food
{
public:
Snake()
{
addHead(SpaceLENG/,SpaceHIGH/);
addHead(SpaceLENG/,SpaceHIGH/-);
addHead(SpaceLENG/,SpaceHIGH/-);
}
void addHead(int x,int y);
void delTail();
void moving();
void changePoint(char keydown);
SnakeNode* getHead()
{
return head;
}
SnakeNode* getTail()
{
return tail;
}
int getLEN()
{
return LEN;
}
private:
SnakeNode *head=NULL,*tail=NULL;
int LEN=;
dir point=LEFT;
};
void Snake::addHead(int x,int y)
{
SnakeNode *temp=new SnakeNode();
temp->setXY(x,y);
temp->setNext(head);
temp->setPrior(NULL);
if(head)
{
head->setPrior(temp);///如果头不为空
spa->SpaceData[head->getX()][head->getY()]='*';///旧头
}
head=temp;
if(!tail)tail=head;///如果尾为空
spa->SpaceData[head->getX()][head->getY()]='@';///新头
LEN++;
}
void Snake::delTail()
{
SnakeNode *temp=tail;
spa->SpaceData[tail->getX()][tail->getY()]=' ';
if(tail==head)
tail=head=NULL;
else
{
tail=tail->getPrior();
tail->setNext(NULL);
LEN--;
}
delete temp; }
void Snake::moving()
{
int a,b;
SnakeNode* temp=getHead();
a=temp->getX();
b=temp->getY();
switch(point)
{
case UP:
--a;
break;
case DOWN:
++a;
break;
case LEFT:
--b;
break;
case RIGHT:
++b;
break;
}
///撞墙
if(a==SpaceLENG||b==SpaceHIGH||a==-||b==-)
{
FLAG=false;
}
///撞自己身体
if(spa->SpaceData[a][b]=='*')
{
spa->SpaceData[a][b]=='@';///用头结点覆盖相撞节点
FLAG=false;
}
///吃食物
if(a==getFx()&&b==getFy())
{
addHead(a,b);
foodCreate();
}
///普通移动
else
{
addHead(a,b);
delTail();
}
}
void Snake::changePoint(char keydown)///方向控制
{
switch(keydown)
{
case 'w':
{
if(point!=DOWN)
{
point=UP;
break;
}
else break;
}
case 'W':
{
if(point!=DOWN)
{
point=UP;
break;
}
else break;
}
case 's':
{
if(point!=UP)
{
point=DOWN;
break;
}
else break;
}
case 'S':
{
if(point!=UP)
{
point=DOWN;
break;
}
else break;
}
case 'a':
{
if(point!=RIGHT)
{
point=LEFT;
break;
}
else break;
}
case 'A':
{
if(point!=RIGHT)
{
point=LEFT;
break;
}
else break;
}
case 'd':
{
if(point!=LEFT)
{
point=RIGHT;
break;
}
else break;
}
case 'D':
{
if(point!=LEFT)
{
point=RIGHT;
break;
}
else break;
}
}
}
///----------------------------------------------------
///用户交互界面创建
class UserView
{
public:
int menuCreate();
int gameSetting();
};
int UserView::menuCreate()
{
bool flag=true;
while(flag)
{
cout<<" MENU"<<endl<<endl;
cout<<"Instruction:"<<endl<<endl;
cout<<"The Snake's original length is 3."<<endl<<endl;
cout<<"Using 'w,s,a,d' or 'W,S,A,D' to control the direction."<<endl<<endl<<endl<<endl;
cout<<"Please Input 'Y'or'y' to start game;"<<endl;
cout<<"Please Input 'N'or'n' to end game;"<<endl;
cout<<"Please Input 'S'or's' to game setting;"<<endl;
cout<<"Please Input else to stay!"<<endl;
char startKey=getch();
if(startKey=='N'||startKey=='n')
{
system("cls");
cout<<"Good Bye!!!"<<endl;
exit();
}
else if(startKey=='Y'||startKey=='y')
{
system("cls");
cout<<" Game Start!!!"<<endl<<endl<<endl<<endl<<endl;
cout<<" GOOD LUCK!!!"<<endl;
getch();
flag=false;
}
else if(startKey=='S'||startKey=='s')
{
gameSetting();
}
system("cls");
}
system("cls");
return ;
}
int UserView::gameSetting()
{
system("cls");
cout<<" Setting:"<<endl<<endl<<endl<<endl;
cout<<"Please Chose Game Difficulty"<<endl;
cout<<"Input 'H'or'h'---Hard Level"<<endl;
cout<<"Input 'N'or'n'---Nomal Level"<<endl;
cout<<"Input 'E'or'e'---Easy Level"<<endl;
cout<<"Input else return the MENU"<<endl;
char hardKey=getch();
if(hardKey=='H'||hardKey=='h')
{
cout<<"The Game's Difficulty now is Hard Level!!!"<<endl;
speed=HARDSPEED;
return ;
}
else if(hardKey=='N'||hardKey=='n')
{
cout<<"The Game's Difficulty now is Nomal Level!!!"<<endl;
speed=NOMALSPEED;
return ;
}
else if(hardKey=='E'||hardKey=='e')
{
cout<<"The Game's Difficulty now is Easy Level!!!"<<endl;
speed=EASYSPEED;
return ;
}
system("cls");
return ;
}
///----------------------------------------------------
///程序入口
int main()
{
while(true)
{
FLAG=true;
UserView view;
view.menuCreate();
spa->InitSpace();
Snake sna;
sna.foodCreate();
spa->DisplaySpace();
while(FLAG)
{
char downKey=getch();
sna.changePoint(downKey);
///kbhit(),检查是否有键盘输入,若有,则返回一个非0值,否则返回0,在头文件<conio.h>中定义
///此处FLAG如果不加,会产生蛇吃墙现象
while(FLAG&&!kbhit())
{
system("cls");
sna.moving();
spa->DisplaySpace();
Sleep(speed);
}
}
cout<<"Game Over!!!"<<endl;
cout<<"The Snake's Length is :"<<sna.getLEN()<<endl<<endl<<endl<<endl;
cout<<"The Game Will Return Back MENU!"<<endl;
getch();
system("cls");
}
return ;
}
最后上几张游戏的运行的截图:







大大维的贪吃蛇v1的更多相关文章
- 贪吃蛇 v1.01
1.长度二节:2.如果触及屏幕边缘,游戏结束: 感谢张瑞阳同学改进 #include<bits/stdc++.h>#include<windows.h>#include< ...
- 大大维的游戏机计划1--贪吃蛇v1
本文为大大维原创,最早于博客园发表,转载请注明出处!!! 虽然本人一直是个免费的游戏测试员(/手动滑稽),但一直有着一个游戏架构师的梦想.正如马爸爸所说,梦想还是要有的,万一实现了呢? 这些天放寒假, ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- c语言贪吃蛇详解-2.画出蛇
c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...
- c语言贪吃蛇详解1.画出地图
c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...
- 一步一步用Canvas写一个贪吃蛇
之前在慕课网看了几集Canvas的视频,一直想着写点东西练练手.感觉贪吃蛇算是比较简单的了,当年大学的时候还写过C语言字符版的,没想到还是遇到了很多问题. 最终效果如下(图太大的话 时间太长 录制gi ...
- JavaScript新手入门 贪吃蛇
从小就在玩贪吃蛇,但是知道今天自己做了一遍才知道原理的具体的实现步骤. 刚进入界面时显示开始游戏(不重要,本人比较喜欢吹毛求疵) 中间黑色部分为游戏的主要展示部分 主要步骤及源码: body中代码,红 ...
- Python制作AI贪吃蛇
前提:本文实现AI贪吃蛇自行对战,加上人机对战,文章末尾附上源代码以及各位大佬的链接,还有一些实现步骤,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什么了,思路都 ...
随机推荐
- HttpClient 教程 (二)
第二章 连接管理 HttpClient有一个对连接初始化和终止,还有在活动连接上I/O操作的完整控制.而连接操作的很多方面可以使用一些参数来控制. 2.1 连接参数 这些参数可以影响连接操作: 'ht ...
- ExtJS如何取得GridPanel当前选择行数据对象 - nuccch的专栏 - 博客频道 - CSDN.NET
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- ActiveMQ讯息传送机制以及ACK机制
http://blog.csdn.net/lulongzhou_llz/article/details/42270113 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息 ...
- hql语句拼接的替换方式
hql语句拼接的替换方式 hql语句拼接 String hql = "FROM Topic t WHERE t.forum=? "; List<Object> para ...
- Quick Cocos2dx 场景对象基类实现
从使用Quick-Cocos2d-x搭建一个横版过关游戏(四)拷来个进度条类, 但是由于那个类有个bug,在setProgress里面self.fill是找不到的,所以我改进了一下,代码如下: loc ...
- java中try 与catch的使用
(2011-10-08 17:08:43) 转载▼ 标签: 杂谈 分类: Java try{//代码区}catch(Exception e){//异常处理}代码区如果有错误,就会返回所写异常的处理. ...
- 自动化运维 Ansible
自动化运维 Ansible 特性 (1).no agents:不需要在被管控主机上安装任何客户端: (2).no server:无服务器端,使用时直接运行命令即可: (3).modules in an ...
- Nutch是个不错的选择
对搜索引擎的理解:我们并没有google 的源代码,因此学习搜索引擎Nutch是个不错的选择.了解一个大型分布式的搜索引擎如何工作是一件让人很受益的事情.在写 Nutch的过程中,从学院派和工业派借鉴 ...
- HDU 5652 India and China Origins
二分答案+验证,注意一开始就不连通的话输出0 #include<cstdio> #include<cstring> #include<cmath> #include ...
- HUST 1605 Gene recombination
简单广搜.4进制对应的10进制数来表示这些状态,总共只有(4^12)种状态. #include<cstdio> #include<cstring> #include<cm ...