大大维的贪吃蛇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个都没什么了,思路都 ...
随机推荐
- HDU 1828 POJ 1177 Picture
矩形周长并 POJ上C++,G++都能过,HDU上C++过了,G++WA ,不知道为什么 #include<cstdio> #include<cstring> #include ...
- CodeForces 605A Sorting Railway Cars
求一下最长数字连续上升的子序列长度,n-长度就是答案 O(n)可以出解,dp[i]=dp[i-1]+1,然后找到dp数组最大的值. #include<cstdio> #include< ...
- thinkphp中的ajax分页
thinkphp中用ajax分页和普通的ajax分页的区别在于处理位置的不同,thinkphp是在控制器的方法中处理ajax传的值,然后返回数据.下面是一个点击事件触发后,显示的内容用ajax分页. ...
- AVR单片机的BOOT区
BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...
- CodeForces 652C Foe Pairs
只要计算每个位置最多能到哪个位置,累加即可,DP从后往前预处理一下每个位置到达的最远位置. 有坑点:输入的时候如果同一个点出发的,需要保存最小值. #include<cstdio> #in ...
- iOS开发——生成条形码,二维码
- (void)viewDidLoad { [super viewDidLoad]; self.imageView.image = [self generateBarCode:@"15248 ...
- Mac下配置node.js环境(Mac 10.12)
有安装就有卸载,卸载教程参考:http://www.cnblogs.com/EasonJim/p/6287141.html 一.官方下载pkg安装包 1.安装 到官网https://nodejs.or ...
- win8.1远程连接Redis数据库
环境:redis安装在虚拟机Centos6.5系统上 通过java远程连接 问题一:报错 connected refused redis.conf 注释掉 #bind 127.0.0.1 问题二:还是 ...
- Asp.NET开启一个线程,不停的执行
using System;using System.Threading;using System.Threading.Tasks; class StartNewDemo{ static void ...
- radiobutton设置样式
单选题里会用到radiobutton,如果不想使用系统提供的圆圈样式,可以自定义样式,想要做成的效果就是, 使用自定义的图片替换圆圈,然后选择有4个选项的其中一个,图片上有个对勾标记, 然后如果正确选 ...