【问题描述】
1.首先自动生成一个N * N(如20 * 20)的空间,在内部随机生成1个 $ 代表食物,随机生成一条长度为5的蛇,蛇的身体用心形(ASCII码为003)显示,蛇头用笑脸(ASCII码为002)显示。
2.自行定义蛇的起始位置。
3用户随意按键后蛇即刻开始自行行走,可设置行走速率为0.5秒。
3.监测用户按键,根据用户的选择方向键,改变蛇的行走方向。
4.在遇到食物$ 时,长度增一,且随机生成另一个食物$。倘若蛇碰到墙壁,则游戏失败,并打印蛇最终的长度。
【代码实现】
#include <iostream>
#include<cstdlib>
#include<stdio.h>
#include<ctime>
#include<windows.h>
#include <conio.h>
#define N 20
using namespace std;
double start=clock();
int Snake_head_x,Snake_head_y; //保存记录蛇头的位置坐标
int Snake_length=5,movement=0,Food_num=0;
int Food_index_x,Food_index_y; //保存食物位置坐标
int *p_x=new int[1000000];
int *p_y=new int[1000000];
bool Food_tag =true; //false代表未吃到食物
//打印提示信息
void Notification()
{
cout<<" ";
cout<<"<<The Snake>>"<<" "<<"Designed by wuchen"<<endl<<endl;
cout<<"**************************Notification**************************"<<endl<<endl;
cout<<"1.Choose W A S D to change direction of snake"<<endl;
cout<<"2.Speed up when the direction you chose is forward "<<endl;
cout<<"3.Game Over when the snake hit the the wall or hit its body"<<endl;
cout<<"4.Enjoy Yourself"<<endl<<endl;
cout<<"****************************Warnings****************************"<<endl<<endl;
cout<<"All rights reserved"<<endl;
cout<<"Those responsible for unauthorized reproduction will be prosecuted"<<endl<<endl;
}
//实现实时记录🐀𓐀的位置
void Snake_position(int a[][N],int num)
{
if( *(p_x+Snake_length+movement-1)!=Snake_head_x
|| *(p_y+Snake_length+movement-1)!=Snake_head_y )
{
*(p_x+Snake_length+movement)=Snake_head_x; //保存新的蛇头的实时位置
*(p_y+Snake_length+movement)=Snake_head_y;
movement++;
}
}
//🐀𓐀的身体的初始化
void Snake_body(int a[][20],int index_x,int index_y)
{
int next_position,index_x0=index_x,index_y0=index_y;//保存初始的中心位置
static int counter=0;
do
{
next_position=rand()%4+1;
switch (next_position)
{
case 1:
{
if(a[index_x][index_y]==0)
{
a[index_x-1][index_y]=3;
index_x--;
}
break;
}
case 2:
{
if(a[index_x][index_y-1]==0)
{
a[index_x][index_y-1]=3;
index_y--;
}
break;
}
case 3:
{
if(a[index_x+1][index_y]==0)
{
a[index_x+1][index_y]=3;
index_x++;
}
break;
}
case 4:
{
if(a[index_x][index_y+1]==0)
{
a[index_x][index_y+1]=3;
index_y++;
}
break;
}
}
}while(index_x0==index_x&&index_y0==index_y);
counter++;
*(p_x+4-counter)=index_x;
*(p_y+4-counter)=index_y;
if(counter==4)
{}
else Snake_body(a,index_x,index_y);
}
//实现🐀𓐀的初始化
void Snake(int a[][N],int num)
{
int row,colum;
//画出蛇头
while(1)
{
row=rand()%(num-4)+2; //友好设定:距边界的位置大于一格
colum=rand()%(num-4)+2; //给参与者减少难度
if(row!=Food_index_x && colum!=Food_index_y&& a[row][colum]==0)
{
break;
}
}
a[row][colum]=2;
Snake_head_x=row;
Snake_head_y=colum;
*(p_x+4)=Snake_head_x;
*(p_y+4)=Snake_head_y;
Snake_body(a,row,colum);
}
//实现食物的出现
void Food_show(int (*a)[N],int num) //
{
bool food_show=false;
srand(unsigned(time(NULL)));
if(Food_tag==true)
{
do
{
Food_index_x=rand()%(num-2)+1;
Food_index_y=rand()%(num-2)+1;
if(*( *(a+Food_index_x)+Food_index_y )==0)
{
*( *(a+Food_index_x)+Food_index_y )=36;
food_show=true;
}
}while(food_show==false);
Food_tag=false;
}
}
//实现整体界面的初始化(框架、食物、蛇)
void Initial(int (*a)[N],int num )
{
/* 产生***框架 */
for(int i=0;i<num;i++)
{
for(int j=0;j<num;j++)
{
if(i==0||i==num-1)
{
*( *(a+i)+j ) = 42;
}
else if(j==0||j==num-1)
{
*( *(a+i)+j ) = 42;
}
}
}
/* 产生食物 */
Food_show(a,num);
/* 画出蛇 */
Snake(a,num);
}
//实现所有图形的绘制
void Draw(int *a,int num)
{
for(int i=0;i<num;i++)
{
for(int j=0;j<num;j++)
{
if(*(a+i*N+j)==42)
{
cout<<char(42); //生成 *
}
else if(*(a+i*N+j)==0)
{
cout<<char(32); //生成' '
}
else if(*(a+i*N+j)==36)
{
cout<<char(36); //生成 $
}
else if(*(a+i*N+j)==2)
{
cout<<2; //生成蛇头
}
else if(*(a+i*N+j)==3)
{
cout<<3; //生成身子
}
}
cout<<endl;
}
}
//检测蛇是否吃到食物更新蛇的长度
void Snake_Food(int a[][N],int num)
{
if(a[Snake_head_x][Snake_head_y]==36) //🐀𓐀吃到了食物
{
Food_tag=true;
Food_show(a,num);
Food_num++;
}
else //🐀𓐀没吃到食物
{
a[*(p_x+movement-Food_num)][*(p_y+movement-Food_num)]=0;
}
}
//实现用户的键盘录入控制蛇头的移动
void Snake_head_movement(int (*a)[N],int num,char direction)
{
if(kbhit())
{
direction=getch();
switch(direction)
{
case 'w':
case 'W':
{
Snake_head_x--;
if(*(*(a+Snake_head_x)+Snake_head_y)==0
|| *(*(a+Snake_head_x)+Snake_head_y)==36)
{
Snake_Food(a,num);
*(*(a+Snake_head_x)+Snake_head_y)=2;
*(*(a+Snake_head_x+1)+Snake_head_y)=3;
start=clock(); //重新计时
}
break;
}
case 'a':
case 'A':
{
Snake_head_y--;
if(*(*(a+Snake_head_x)+Snake_head_y)==0
|| *(*(a+Snake_head_x)+Snake_head_y)==36)
{
Snake_Food(a,num);
*(*(a+Snake_head_x)+Snake_head_y)=2;
*(*(a+Snake_head_x)+Snake_head_y+1)=3;
start=clock(); //重新计时
}
break;
}
case 's':
case 'S':
{
Snake_head_x++;
if(*(*(a+Snake_head_x)+Snake_head_y)==0
|| *(*(a+Snake_head_x)+Snake_head_y)==36)
{
Snake_Food(a,num);
*(*(a+Snake_head_x)+Snake_head_y)=2;
*(*(a+Snake_head_x-1)+Snake_head_y)=3;
start=clock(); //重新计时
}
break;
}
case 'd':
case 'D':
{
Snake_head_y++;
if(*(*(a+Snake_head_x)+Snake_head_y)==0
|| *(*(a+Snake_head_x)+Snake_head_y)==36)
{
Snake_Food(a,num);
*(*(a+Snake_head_x)+Snake_head_y)=2;
*(*(a+Snake_head_x)+Snake_head_y-1)=3;
start=clock(); //重新计时
}
break;
}
}
}
}
//实现🐀𓐀的自动移动
void Snake_head_auto_movement(int (*a)[N],int num)
{
if(Snake_head_x-1==*(p_x+Snake_length+movement-2)
&& Snake_head_y==*(p_y+Snake_length+movement-2))
{
Snake_head_x++;
if(*(*(a+Snake_head_x)+Snake_head_y)==0
|| *(*(a+Snake_head_x)+Snake_head_y)==36)
{
Snake_Food(a,num);
*(*(a+Snake_head_x)+Snake_head_y)=2;
*(*(a+Snake_head_x-1)+Snake_head_y)=3;
start=clock(); //重新计时
}
}
if(Snake_head_x==*(p_x+Snake_length+movement-2)
&& Snake_head_y-1==*(p_y+Snake_length+movement-2))
{
Snake_head_y++;
if(*(*(a+Snake_head_x)+Snake_head_y)==0
|| *(*(a+Snake_head_x)+Snake_head_y)==36)
{
Snake_Food(a,num);
*(*(a+Snake_head_x)+Snake_head_y)=2;
*(*(a+Snake_head_x)+Snake_head_y-1)=3;
start=clock(); //重新计时
}
}
if(Snake_head_x+1==*(p_x+Snake_length+movement-2)
&& Snake_head_y==*(p_y+Snake_length+movement-2))
{
Snake_head_x--;
if(*(*(a+Snake_head_x)+Snake_head_y)==0
|| *(*(a+Snake_head_x)+Snake_head_y)==36)
{
Snake_Food(a,num);
*(*(a+Snake_head_x)+Snake_head_y)=2;
*(*(a+Snake_head_x+1)+Snake_head_y)=3;
start=clock(); //重新计时
}
}
if(Snake_head_x==*(p_x+Snake_length+movement-2)
&& Snake_head_y+1==*(p_y+Snake_length+movement-2))
{
Snake_head_y--;
if(*(*(a+Snake_head_x)+Snake_head_y)==0
|| *(*(a+Snake_head_x)+Snake_head_y)==36)
{
Snake_Food(a,num);
*(*(a+Snake_head_x)+Snake_head_y)=2;
*(*(a+Snake_head_x)+Snake_head_y+1)=3;
start=clock(); //重新计时
}
}
}
int main()
{
int structure[N][N]={};
int num=N;
char direction=0;
Notification();
system("pause");
Initial(structure,num);
Draw(*structure,num);
start=clock();
while(clock()-start<=500)//给游戏一定的游戏延迟
{
Snake_head_movement(structure,num,direction);
if(structure[Snake_head_x][Snake_head_y]!=2 //移动以后不是墙或者不是食物
&& structure[Snake_head_x][Snake_head_y]!=36)break; //结束游戏
system("cls");//清屏
Snake_position(structure,num);
Draw(*structure,num);
if(clock()-start>=500)//用户未选择移动时每隔0.5s自动移动
{
Snake_head_auto_movement(structure,num);
if(structure[Snake_head_x][Snake_head_y]!=2 //移动以后不是墙或者不是食物
&& structure[Snake_head_x][Snake_head_y]!=36)break;
system("cls");
Snake_position(structure,num);
Draw(*structure,num);
}
}
cout<<"Game Over!!"<<endl;
return 0;
}
转载请注明来源