大大维的贪吃蛇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个都没什么了,思路都 ...
随机推荐
- Vim 命令 (转)
上图引用自何处忘记了,不好意思. 基础快捷键 normal模式下 快速查找 fa → 到下一个为a的字符处,你也可以fs到下一个为s的字符. t, → 到逗号前的第一个字符.逗号可以变成其它字 ...
- Apache Commons工具集简介(转)
此文为转帖,原帖地址:http://zhoualine.iteye.com/blog/1770014
- php中var_dump() 打印出一个对象的时候,信息怎么看?
php 的一个依赖注入容器, 说白了,就是用php 的反射类,来在运行的时候动态的分析类具有的函数,以及动态分析函数的参数, 从而实例化类,并执行类的方法. 另外,php 中的 typehint 还是 ...
- (四)Jquery Mobile表单
Jquery Mobile表单与列表 一.JM表单 1.表单 普通html表单 效果: 2.只能输入数字的表单 效果: ...
- android MessageQueue入门
接触安卓几年了.但是感觉一直不是很明白,东西太多了.反过来说就是自己太菜了.很多东西其实都是模凌两可,不熟悉,很多知识点都是知道一点,最多大家都这样用.没问题,事件长了也一直这样用的.但是有个问题,安 ...
- ZOJ 2059 The Twin Towers
双塔DP. dp[i][j]表示前i个物品,分成两堆(可以不全用),价值之差为j的时候,较小一堆的价值为dp[i][j]. #include<cstdio> #include<cst ...
- 【转】Linux 上的最佳 C/C++ IDE
IDE介绍收藏篇: 个人linux下开发经验不多,一般也都使用shell远程连接使用命令行模式开发.如果自己在自己机器上开发还是有IDE要方便很多,看到这篇帖子就果断的转过来先收藏下,之前自己使用过E ...
- 【转】一大波实用的 bash 别名和函数
作为一个命令行探索者,你或许发现你自己一遍又一遍重复同样的命令.如果你总是用ssh进入到同一台电脑,如果你总是将一连串命令连接起来,如果你总是用同样的参数运行一个程序,你也许希望在这种不断的重复中为你 ...
- FastJson的用法
一.简单数据的序列化 pubic class UserInfo implements Serializable{ private String name; private int age; publi ...
- scrollview嵌套gridview滑动问题
在开发过程总遇到ScrollView嵌套GridView,由于这两种控件都带有滚动条,当他们碰到一起的时候便会出问题,问题是gridview不滚动,并且只显示两行,为此看了官方文档,谷歌回答滚动里面没 ...