贪吃蛇游戏的c语言编程
# include & ltctime & gt
# include & ltiostream & gt
# include & ltvector & gt
# include & lt队列& gt
使用命名空间std
#ifndef SNAKE_H
#定义SNAKE_H
Cmp级
{
友类Csnake
int rSign//横坐标
int lSign//垂直坐标
公共:
//friend bool is dead(const Cmp & amp;CMP);
Cmp(int r,int l){setPoint(r,l);}
Cmp(){}
void setPoint(int r,int l){ r sign = r;lSign = l;}
Cmp操作员-(const Cmp & amp;m)常数
{
返回Cmp(rSign-m.rSign,l sign-m . l sign);
}
Cmp运算符+(const Cmp & amp;m)常数
{
返回Cmp(rSign+m.rSign,l sign+m . l sign);
}
};
const int maxSize = 5;//初始蛇形长度
Csnake级
{
Cmp firstSign//蛇头坐标
Cmp第二设计。//蛇颈坐标
Cmp lastSign//蜗牛坐标
Cmp nextSign//准备黑鱼
int行;//列数
int线;//行数
int计数;//蛇身长度
向量& lt向量& ltchar & gt& gtsnakeMap//整个游戏界面
队列& ltCmp & gt蛇身;//蛇身
公共:
int get directions()const;
char get symbol(const Cmp & amp;c)常数
//获取指定坐标点的字符。
{
return snake map[c . l sign][c . r sign];
}
Csnake(int n)
//初始化游戏界面大小
{
如果(n & lt20)线= 20+2;
else if(n & gt;30)线= 30+2;
else line = n+2;
row = line * 3+2;
}
bool is dead(const Cmp & amp;cmp)
{
return(get symbol(CMP)= = ' @ ' | | CMP . rsign = = row-1
| | CMP . rsign = = 0 | | CMP . lsign = = line-1 | |
CMP . lsign = = 0);
}
void InitInstance();//初始化游戏界面
bool updata game();//更新游戏界面
void show game();//显示游戏界面
};
#endif // SNAKE_H
使用命名空间std
//测试成功
void Csnake::InitInstance()
{
snake map . resize(line);// snakeMap[纵坐标][横坐标]
for(int I = 0;我& lt线;i++)
{
蛇图[i]。调整大小(行);
for(int j = 0;j & lt排;j++)
{
snake map[I][j]=“”;
}
}
for(int m = 1;m & ltmaxSize+1;m++)
{
//初始蛇体
snake map[line/2][m]= ' @ ';
//将蛇坐标压入队列。
snakeBody.push(Cmp(m,(line/2)));
//snakeBody[横坐标][纵坐标]
}
//链表头和链表尾
first sign = snake body . back();
second sign . setpoint(maxSize-1,line/2);
}
//测试成功
int cs nake::get directions()const
{
if(getkey state(VK _ UP)& lt;0)返回1;//1表示按向上键。
if(getkey state(VK _唐)& lt0)返回2;//2表示按键。
if(getkey state(VK _左)& lt0)返回3;//3表示按左键。
if(getkey state(VK _右)& lt0)返回4;//4表示按下右键。
返回0;
}
bool Csnake::UpdataGame()
{
// -
//初始化分数0
静态int得分= 0;
//获取用户密钥信息
int选择;
choice = get directions();
cout & lt& lt总分:" & lt& lt得分& lt& ltendl
//随机生成食物的坐标。
int r,l;
//一开始吃,产生一个食物。
静态bool eatFood = true
//吃了一个,第二个食物就出现了。
如果(吃食物)
{
做
{
//坐标范围限定为(1,1)到(line-2,row-2)对跖类型。
srand(time(0));
r =(rand()%(row-2))+1;//横坐标
l =(rand()%(line-2))+1;//垂直坐标
//如果随机生成的坐标不是蛇,则可行。
//否则,重新生成坐标。
if(snakeMap[l][r]!='@')
{ snake map[l][r]= ' * ';}
} while(snakeMap[l][r]= = ' @ ');
}
开关(选择)
{
案例1:// Up
//如果蛇头和棒颈的横坐标不同,则执行以下操作。
if(firstSign.rSign!= second sign . r sign)next sign . setpoint(first sign . r sign,first sign . l sign-1);
//否则,继续向原始方向移动,如下所示
else next sign = first sign+(first sign-second sign);
打破;
情况2://向下
if(firstSign.rSign!= second sign . r sign)next sign . setpoint(first sign . r sign,first sign . l sign+1);
else next sign = first sign+(first sign-second sign);
打破;
案例3://左
if(firstSign.lSign!= second sign . l sign)next sign . setpoint(first sign . r sign-1,first sign . l sign);
else next sign = first sign+(first sign-second sign);
打破;
案例4://对
if(firstSign.lSign!= second sign . l sign)next sign . setpoint(first sign . r sign+1,first sign . l sign);
else next sign = first sign+(first sign-second sign);
打破;
默认值:
next sign = first sign+(first sign-second sign);
}
// -
if(getSymbol(nextSign)!= ' * ' & amp& amp!isDead(nextSign))
//如果食物没有被碰到(而且没有死亡),就删除蛇头,压入一个新的蛇头。
{
//删除蛇尾
last sign = snake body . front();
snake map[last sign . l sign][last sign . r sign]=“”;
snake body . pop();
//更新黑鱼
secondSign = firstSign
//按下黑鱼
snake body . push(next sign);
first sign = snake body . back();
snake map[first sign . l sign][first sign . r sign]= ' @ ';
//没吃
eatFood = false
返回true
}
吃东西-
else if(get symbol(next sign)= ' * ' & amp;& amp!isDead(nextSign))
{
secondSign = firstSign
snake map[nextsign . l sign][nextsign . r sign]= ' @ ';
//只按下黑鱼
snake body . push(next sign);
first sign = snake body . back();
eatFood = true
//奖励积分
得分+= 20;
返回true
}
//-死亡-
else { cout & lt& lt“死了”& lt& ltendlcout & lt& lt“您的最后总分是”& lt& lt得分& lt& ltendl返回false}
}
void Csnake::ShowGame()
{
for(int I = 0;我& lt线;i++)
{
for(int j = 0;j & lt排;j++)
cout & lt& ltsnake map[I][j];
cout & lt& ltendl
}
睡眠(1);
系统(“cls”);
}
int main()
{
cs nake s(20);
南InitInstance();
//s . show game();
int noDead
做
{
南show game();
noDead = s . updata game();
} while(noDead);
系统(“暂停”);
返回0;
}
这个代码可以运行,记得给分。