大大维的游戏机计划1--贪吃蛇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 ;
}
最后上几张游戏的运行的截图:
大大维的游戏机计划1--贪吃蛇v1的更多相关文章
- 大大维的贪吃蛇v1
虽然本人一直是个免费的游戏测试员(/手动滑稽),但一直有着一个游戏架构师的梦想.正如马爸爸所说,梦想还是要有的,万一实现了呢? 这些天放寒假,有些空闲时间,就想着做一个简单的游戏机.能达到小时候十几块 ...
- 大大维的游戏机计划3--2048v1
前几天由于忙着过年串门,游戏机的计划搁置了几天.这两天终于空出了一块时间,抽空写了2048. 由于笔者前面自制了一个类似2048的游戏,所以写起来也算是轻车熟路,花了两个晚上也就差不多了. 废话少说, ...
- 贪吃蛇 v1.01
1.长度二节:2.如果触及屏幕边缘,游戏结束: 感谢张瑞阳同学改进 #include<bits/stdc++.h>#include<windows.h>#include< ...
- H5游戏开发:贪吃蛇
贪吃蛇的经典玩法有两种: 积分闯关 一吃到底 第一种是笔者小时候在掌上游戏机最先体验到的(不小心暴露了年龄),具体玩法是蛇吃完一定数量的食物后就通关,通关后速度会加快:第二种是诺基亚在1997年在其自 ...
- 原生JS实战:经典贪吃蛇(开局10倍速度,来看看你最高能得多少分!)
本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5875523.html 该程序是本人的个人作品,写的不好,未经本人允许,请 ...
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- c语言贪吃蛇详解-2.画出蛇
c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...
- c语言贪吃蛇详解1.画出地图
c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...
- 一步一步用Canvas写一个贪吃蛇
之前在慕课网看了几集Canvas的视频,一直想着写点东西练练手.感觉贪吃蛇算是比较简单的了,当年大学的时候还写过C语言字符版的,没想到还是遇到了很多问题. 最终效果如下(图太大的话 时间太长 录制gi ...
随机推荐
- php实现微信网页授权回调代理
一个简单的php文件,实现微信网页授权回调域名的代理转发 <?php function is_HTTPS() { if (!isset($_SERVER['HTTPS'])) return F ...
- “Nested exception: 前言中不允许有内容"错误处理
最近在做一个小项目,使用org.dom4j.DocumentHelper.parseText方法时一直报错”Nested exception: 前言中不允许有内容",这个parseText解 ...
- Beaglenone读取编码器数据
一般情况下,beaglebone black默认启动两个cape: 1.BB-BONE-EMMC-2G 2.BB-BONELT-HDMI 我们可以通过编辑uEnv.txt的文件来决定是否启动HDMI, ...
- centos7.3配置python2、3环境与配置各自pip
环境:CentOS-7-x86_64-Everything-1611 No.1 查看CentOS对Python的默认依赖 [root@cs ~]# ls /usr/bin/python* /usr/b ...
- 微信小程序unionid获取问题
微信小程序使用login获取unionid时可能获取不到,原因可能是该微信账号没有关注小程序所在公众号等.但在微信小程序中使用微信注册,必须要用unionid注册时,大部分用户就会因此无法注册成功. ...
- vue的环境配置
在vue越来越火的情况下,本人也开始加入到大军当中. 首先,列举下我们需要的东西: node.js 环境(npm包管理器) vue-cli 脚手架构建工具 cnpm npm的淘宝镜像 安装node.j ...
- 浅谈JS数据遍历的几种方式
遍历对象(数组)是我们日常撸码的必不可少的部分,如何从性能上优化代码,提高运行效率?下文为你揭开真像: 第一种:普通的for循环 for(j = 0; j < arr.length; j++) ...
- jstack生成的Thread Dump日志线程 分析
文章转载自: https://www.javatang.com/archives/2017/10/25/36441958.html 前面文章中只分析了Thread Dump日志文件的结构,今天针对日志 ...
- [Hibernate] 通过 properties 类和 hql 语句进行动态查询
//需要保证Emp和EmpProperties中的setter和getter以及属性以及 参数占位符(:eName) 的一致//动态查询 @Test public void test4(){ EmpP ...
- SparkSql处理嵌套json数据
一.数据准备: { "dc_id": "dc-101", "source": { "sensor-igauge": { ...