c语⾔贪吃蛇MSDN,c++制作贪吃蛇的案例代码
c++制作贪吃蛇的案例代码
发布时间:2020-08-24 14:58:32
来源:亿速云
阅读:129
作者:⼩新
c++制作贪吃蛇的案例代码?这个问题可能是我们⽇常学习或⼯作经常见到的。希望通过这个问题能让你收获颇深。下⾯是⼩编给⼤家带来的参考内容,让我们⼀起来看看吧!c++贪吃蛇代码是【snake_position position[(N-2)*(N-2)+1],void snake_position::initialize(int &j),{x = 1;y = j;}char s[N][N]】。
分析思路
下⾯就来讲讲贪吃蛇的整个设计思路:
⼀、
贪吃蛇的特点是随机产⽣⾷物后,然后通过上下左右地⽅向键来控制贪吃蛇的移动,
当碰到⾷物时,便把它吃掉,从⽽⾝体长度增加⼀个,这⾥便采⽤“#”作为蛇头,”*”作为蛇⾝和⾷物。
因此我便想到,产⽣的⾷物,是如何达到随机的⽬的呢?通过查阅资料得知,在time.h头⽂件中,定义了通过rand()函数来产⽣随机数。下⾯是相关知识:
概述
rand()函数是产⽣随机数的⼀个随机函数。C语⾔⾥还有srand()函数等。
详述
(1)使⽤该函数⾸先应在开头包含头⽂件stdlib.h
#include(C++建议使⽤#include,下同)
(2)在标准的C库中函数rand()可以⽣成0~RAND_MAX之间的⼀个随机数,其中RAND_MAX是stdlib.h 中定义的⼀个整数,它与系统有关。
(3)rand()函数没有输⼊参数,直接通过表达式rand()来引⽤;例如可以⽤下⾯的语句来打印两个随机数:printf("Random numbers are: %i %i\n",rand(),rand());
(4)因为rand()函数是按指定的顺序来产⽣整数,因此每次执⾏上⾯的语句都打印相同的两个值,所以说C语⾔的随机并不是真正意义上的随机,有时候也叫伪随机数。
(5)为了使程序在每次执⾏时都能⽣成⼀个新序列的随机值,我们通常通过为随机数⽣成器提供⼀粒新的随机种⼦。函数srand()(来⾃stdlib.h)可以为随机数⽣成器播散种⼦。只要种⼦不同rand()函数就会产⽣不同的随机数序列。srand()称为随机数⽣成器的初始化器。
由于⼀开始没有使⽤srand()函数,多次运⾏后发现,每次打开运⾏后产⽣的⾷物位置都是⼀致的,并没有真正达到随机的⽬的。因此使⽤srand()函数,⼜通过time()函数来每次调⽤⼀个系统时间来作为srand()的种⼦。由于每次调⽤的系统时间并不相同,所以每次的种⼦也就不相同,从⽽使得rand()函数达到了随机数的⽬的。下⾯是time()函数相关知识:
time() 函数返回⾃ Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数。
主要⽤来获取当前的系统时间,返回的结果是⼀个time_t类型,其值表⽰从UTC(Coordinated Universal Time)时间1970年1⽉1⽇
00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。然后调⽤localtime函数将time_t所表⽰的UTC时间转换为本地时间(我们是+8区,⽐UTC多8个⼩时)并转成struct tm类型,该类型的各数据成员分别表⽰年⽉⽇时分秒。需要包含头⽂件。
C标准库函数time_t time(time_t *t);
如果t是空指针,直接返回当前时间。如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间。
这样便通过rand()函数产⽣了随机数,对其进⾏取模,便得到⼀定范围内的随机数了。
⼆、
然后便是吃⾷的问题了,当蛇头遇到⼀个⾷物时(⾷物在贪吃蛇前进的⽅向上),便将该⾷物变为蛇头,然后将原先的蛇头变为蛇⾝,从⽽达到了吃⾷的⽬的。
那如果没有碰到⾷物呢?就按照原来的⽅向或者键盘按下的⽅向继续前进就是了。
三、
下⾯就是实现的问题了,如何将每个动态都展现出来呢?就是说贪吃蛇是⼀下⼀下往前移动的,这个⼜是如何实现的呢?
这⾥我使⽤了clock()函数,下⾯是相关知识:
clock()是C/C++中的计时函数,⽽与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:clock_t clock(void) ;
简单⽽⾔,就是该程序从启动到函数调⽤占⽤CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调⽤clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是⽤来保存时间的数据类型。
因此,通过定义int start = clock();while(clock()-start<=gamespeed);
这样⼀个⽅式来达到了延时的⽬的,延时的时间则根据gamespeed的值来确定,当gamespeed值越⼩时,延时时间越短。经过延时后,再执⾏下⼀步代码,从⽽实现了贪吃蛇⾃动前进的功能和控制其前进的速度啦。
然⽽,仅仅有这些还是不⾏的,还需要解决输出问题。
通过查阅资料得知,system(“cls”);具有清屏的功能,清除当前屏幕上的内容,进⾏下⼀步的输出,因此我便使⽤了每动⼀下都要进⾏清屏,然后将贪吃蛇棋盘整个画⾯进⾏输出。
四、
为了增加游戏的娱乐性,我⼜从中加⼊了等级选择功能,通过输⼊数字来选择等级,等级越⾼,贪吃蛇移动速度越快,⽽且得分越⾼。得分规则:score += grade*20;
考虑到游戏的功能性,在游戏结束后输出得分情况,并提⽰是否继续游戏,⽽不是直接退出游戏,这样⽤户就不必每次游戏失败后重新打开程序进⾏游戏,⽽是通过选择的⽅式决定继续游戏或者退出游戏。
⽽且加⼊暂停功能,当玩家玩累了,需要暂停的时候,按下空格(space)键实现暂停,
但由于我的原因,⽆法解决需要按两下空格才能继续游戏的bug,就暂定为按两下空格键继续游戏吧。#include
#include
#include
#include
#include
#include
#define N 22
using namespace std;
int gameover;
int x1, y1; // 随机出⽶
int x,y;
long start;
//=======================================
//类的实现与应⽤initialize
/
/=======================================
//下⾯定义贪吃蛇的坐标类
class snake_position
{
public:
int x,y; //x表⽰⾏,y表⽰列
snake_position(){};
void initialize(int &);//坐标初始化
};
snake_position position[(N-2)*(N-2)+1]; //定义贪吃蛇坐标类数组,有(N-2)*(N-2)个坐标void snake_position::initialize(int &j)
{
x = 1;
y = j;
}
//下⾯定义贪吃蛇的棋盘图
class snake_map
{
private:
char s[N][N];//定义贪吃蛇棋盘,包括墙壁。
int grade, length;
int gamespeed; //前进时间间隔
char direction; // 初始情况下,向右运动
int head,tail;
bool gameauto;
public:
snake_map(int h=4,int t=1,int l=4,char d=77,int s=0):length(l),direction(d),head(h),tail(t),score(s){} void initialize(); //初始化函数
void show_game();
int updata_game();
void setpoint();
void getgrade();
void display();
};
//定义初始化函数,将贪吃蛇的棋盘图进⾏初始化
void snake_map::initialize()
{
int i,j;
for(i=1;i<=3;i++)
s[1][i] = '*';
s[1][4] = '#';
c语言游戏贪吃蛇源码for(i=1;i<=N-2;i++)
for(j=1;j<=N-2;j++)
s[i][j]=' '; // 初始化贪吃蛇棋盘中间空⽩部分
for(i=0;i<=N-1;i++)
s[0][i] = s[N-1][i] = '-'; //初始化贪吃蛇棋盘上下墙壁
for(i=1;i<=N-2;i++)
s[i][0] = s[i][N-1] = '|'; //初始化贪吃蛇棋盘左右墙壁
}
//============================================
//输出贪吃蛇棋盘信息
void snake_map::show_game()
{
system("cls"); // 清屏
int i,j;
cout << endl;
for(i=0;i
{
cout << '\t';
for(j=0;j
cout<
if(i==2) cout << "\t等级:" << grade;
if(i==6) cout << "\t速度:" << gamespeed;
if(i==10) cout << "\t得分:" << score << "分" ;
if(i==14) cout << "\t暂停:按⼀下空格键" ;
if(i==18) cout << "\t继续:按两下空格键" ;
cout<
}
}
//输⼊选择等级
void snake_map::getgrade()
{
cin>>grade;
while( grade>7 || grade<1 )
{
cout << "请输⼊数字1-7选择等级,输⼊其他数字⽆效" << endl; cin >> grade;
}
switch(grade)
{
case 1: gamespeed = 1000;gameauto = 0;break;
case 2: gamespeed = 800;gameauto = 0;break;
case 3: gamespeed = 600;gameauto = 0;break;
case 4: gamespeed = 400;gameauto = 0;break;
case 5: gamespeed = 200;gameauto = 0;break;
case 6: gamespeed = 100;gameauto = 0;break;
case 7: grade = 1;gamespeed = 1000;gameauto = 1;break; }
}
//输出等级,得分情况以及称号
void snake_map::display()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。