#include <iostream>

#include<windows.h>

#include<time.h>

#include<math.h>

#include<conio.h>

#include <cstdlib>

#include <cstdio>

using namespace std;

/**定位光标*/

HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);

COORD coord;

void locate(int x,int y){

coord.X=y;

coord.Y=x;

SetConsoleCursorPosition(hout,coord);

}

/**隐藏光标*/

void hide(){

CONSOLE_CURSOR_INFO cursor_info = {1,0};

SetConsoleCursorInfo(hout,&cursor_info);

}

/**生成随机数*/

double random(double start,double end){

return start+(end-start)*rand()/(RAND_MAX+1.0);

}

/**地图的长宽,蛇的坐标,长度,方向,食物的位置*/

int m,n;

struct node{

int x;

int y;

}snake[1000];

int snake_length,dir;

node food;

int direct[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

/**输出墙*/

void print_wall(int n,int m){

cout<<" ";

for(int i=0;i<n;i++){

cout<<"-";

}

cout<<" "<<endl;

for(int j=0;j<m;j++){

cout<<"|";

for(int k=0;k<n;k++){

cout<<" ";

}

cout<<"|"<<endl;

}

cout<<" ";

for(int i=0;i<n;i++){

cout<<"-";

}

}

/**首次输出蛇*/

void print_snake(){

locate(snake[0].x,snake[0].y);

cout<<"@";

for(int i=1;i<=snake_length-1;i++){

locate(snake[i].x,snake[i].y);

cout<<"*";

}

}

/**判断自撞以及撞墙*/

bool is_correct(){

if(snake[0].x==0||snake[0].y==0||snake[0].x==21||snake[0].y==61){

return false;

}

for(int i=1;i<=snake_length-1;i++){

if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y){

return false;

}

}

return true;

}

/**随机生成并输出食物*/

bool print_food(){

srand((unsigned)time(0));

bool e;

while(1){

e=true;

int i=(int)random(0,20)+1,j=(int)random(0,60)+1;

food.x=i;food.y=j;

for(int k=0;k<=snake_length-1;k++){

if(food.x==snake[k].x&&food.y==snake[k].y){

e= false;

break;

}

}

if(e){

break;

}

}

locate(food.x,food.y);

cout<<"$";

return true;

}

void print_smileface(){

locate(8,64);

cout<<" ******** "<<endl;

locate(9,64);

cout<<"* "<<endl;

locate(10,64);

cout<<"
^ ^ "<<endl;

locate(11,64);

cout<<"
"<<endl;

locate(12,64);

cout<<"
ˇ *"<<endl;

locate(13,64);

cout<<" ******** "<<endl;

locate(14,66);

cout<<"吃到了~"<<endl;

}

void print_face(){

locate(8,64);

cout<<" ******** "<<endl;

locate(9,64);

cout<<"* "<<endl;

locate(10,64);

cout<<"
* * "<<endl;

locate(11,64);

cout<<"
"<<endl;

locate(12,64);

cout<<"
* *"<<endl;

locate(13,64);

cout<<" ******** "<<endl;

locate(14,66);

cout<<"小心哦~"<<endl;
}
/**前进*/
bool go_ahead(){
node temp;
temp = snake[snake_length-1];
bool e = false;
for(int i=snake_length-1;i>=1;i--){

snake[i]=snake[i-1];

}

snake[0].x=snake[0].x+direct[dir][0];

snake[0].y=snake[0].y+direct[dir][1];

locate(snake[1].x,snake[1].y);

cout<<"*";

/*如果吃到食物了*/

if(snake[0].x==food.x&&snake[0].y==food.y){

snake_length++;

e = true;

snake[snake_length-1]=temp;

}

/*输出此时蛇的状态*/

if(!e){

locate(temp.x,temp.y);

cout<<" ";

print_face();

}

else{

print_food();

print_smileface();

}

locate(snake[0].x,snake[0].y);

cout<<"@";

/*如果自撞或者撞墙了*/

if(!is_correct()){

system("cls");

cout<<"你输了"<<endl;

cout<<"最终长度是:"<<snake_length;

return false;

}

return true;

}

void print_logo(){

cout<<"********** ** ** * ** **********"<<endl;

cout<<"********** *** ** *** ** ** **********"<<endl;

cout<<"** **** ** ** ** ** ** ** "<<endl;

cout<<"** ** ** ** ** ** ** ** ** "<<endl;

cout<<"********** ** ** ** ** ** **** **********"<<endl;

cout<<"********** ** ** ** ********* *** **********"<<endl;

cout<<" ** ** ** ** ** ** ** ** ** "<<endl;

cout<<" ** ** **** ** ** ** ** ** "<<endl;

cout<<"********** ** *** ** ** ** ** **********"<<endl;

cout<<"********** ** ** ** ** ** ** **********"<<endl;

for(int i=1;i<65;i++){

cout<<"-";

}

cout<<endl;

cout<<" * ** * "<<endl;

cout<<"* . . "<<endl;

cout<<"
"<<endl;

cout<<"
- *"<<endl;

cout<<" * * * *"<<endl;

cout<<" * * * * * * *"<<endl;

cout<<" * * * * * * * * ** "<<endl;

cout<<" * * * * * * *"<<endl;

cout<<endl;

locate(12,30);

cout<<"游戏规则:按上下左右键控制蛇的移动"<<endl;

locate(13,40);

cout<<"每吃掉一个食物身体长长一节"<<endl;

locate(14,40);

cout<<"撞到墙或者自己的身体则游戏失败"<<endl;

locate(15,40);

cout<<"我们的目标是变大变长!"<<endl;

locate(16,40);

cout<<"请输入难度(1~100)开始游戏吧!"<<endl;

cout<<endl;

}

/**主函数**/

int main(){

print_logo();

int hard;

locate(17,40);

cin>>hard;

if(hard<1||hard>100){

cout<<"游戏难度不得小于1不得大于100,请重新开始游戏"<<endl;

system("pause");

return 0;

}

snake_length=5;

for(int i=0;i<5;i++){

snake[i].x=1;

snake[i].y=5-i;

}

dir=3;

system("cls");

hide();

print_wall(60,20);

print_food();

print_snake();

locate(3,62);

cout<<"当前长度:";

clock_t a,b;

char ch;

double hard_len;

/**开始游戏*/

while(1){

hard_len=(double)snake_length/(double)(60*20);

a=clock();

while(1){

b=clock();

if(b-a>=(int)(400-30*hard)*(1-sqrt(hard_len))){

break;

}

}

/**键入上下左右*/

if(kbhit()){

ch=getch();

if(ch==-32){

ch=getch();

switch(ch){

case 72://上

if(dir==2||dir==3){

dir=0;

}

break;

case 80:

if(dir==2||dir==3){

dir=1;

}

break;

case 75:

if(dir==0||dir==1){

dir=2;

}

break;

case 77:

if(dir==0||dir==1){

dir=3;

}

break;

}

}

}

if(!go_ahead()){

break;

}

locate (3,73);

cout<<snake_length<<endl;

}

system("pause");

return 0;

}

0 条评论

目前还没有评论...

信息

难度
9
分类
(无)
标签
(无)
递交数
13
已通过
3
通过率
23%
上传者