U2953.贪吃蛇

省选/NOI-

通过率:0%

时间限制:1.00s

内存限制:128MB

题目描述

#include<iostream>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;
#define high 20  //定义地图的高度 
#define width 30   //定义地图的宽度 
#define snake_maxlength 200  //蛇长最大值 
int snake_x[snake_maxlength],snake_y[snake_maxlength]; //蛇的坐标 
int snake_length;  //蛇现在的长度 
int map[high][width]={0};  //初始化地图,0表示空格,1表示蛇身,2表示食物,
                            //3表示墙,4表示蛇头,现在地图中什么也没有 
int food_x,food_y; //食物的坐标 
int score;  //本局分数 
char input;  //读取用户键入的字符 
char primeinput='.';  //primeinput在input脱离wasd时,用来存储input 
int op;   //速度控制全局变量 
//数据的初始化函数 
void setdata()
{
	snake_x[0]=high/2;snake_y[0]=width/3;   //初始化蛇头,在地图内的位置随意 
	snake_x[1]=high/2;snake_y[1]=width/3+1;  //初始化蛇身 
	snake_length=2;   //蛇的原始尺寸(一格头一格身子) 
	food_x=high/3,food_y=width/3;  //初始化食物的位置,在地图内位置随意 
	score=0;
	int i,j;
	map[snake_x[0]][snake_y[0]]=4;  //蛇头 
	map[snake_x[1]][snake_y[1]]=1;  //蛇身 
	map[food_x][food_y]=2;   //食物 
	for(i=0;i<high;i++)   //墙 
	  for(j=0;j<width;j++)
	    if(i==0||j==0||i==high-1||j==width-1)
	       map[i][j]=3;   
 } 
 //画面打印 
 void gotoxy(int x,int y)  
 {
    HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
 }
 void show()
 {
 	gotoxy(0,0);
 	int i,j;
 	for(i=0;i<high;i++)
 	{
 		for(j=0;j<width;j++)
 		{
 			if(map[i][j]==0)
 			cout<<" ";
 			else if(map[i][j]==1)
 			cout<<"+";
 			else if(map[i][j]==2)
 			cout<<"@";
 		    else if(map[i][j]==3)
 		    cout<<"*";
 		    else if(map[i][j]==4)
 		    cout<<"0";
		 }
		 printf("\n");
	 }
	 printf("得分:%d",score);
 }
 //与输入无关的更新 
 void updatewithoutinput()
 {
 	 
 	int i;
 	if(snake_x[0]==food_x&&snake_y[0]==food_y)
 	{
 		score++;
 	    srand((unsigned)time(NULL));  //srand和rand函数连用产生随机数,一般以时间作为产生随机数的种子 
 	    food_x=rand()%(high-3)+1;    
 	    food_y=rand()%(width-3)+1;
 	    map[food_x][food_y]=2; 
 	    snake_length++;
	 }
	 if(snake_x[0]==0||snake_x[0]==high-1||snake_y[0]==0||snake_y[0]==width-1)  //碰墙了 
	 {
	 	cout<<"游戏结束!"<<endl;
	 	getch();
	 	exit(1);  
		 	 }
	for(i=1;i<snake_length;i++)  //碰到自己了 ,遍历蛇身找是否和蛇头重复  
	  if(snake_x[0]==snake_x[i]&&snake_y[0]==snake_y[i])
	  {
	  	cout<<"咬到自己"<<endl;
	  	getch();
	  	exit(1);
	  }
 }
 void updatewithinput()
 {
 	int i=1;
 	if(kbhit()) 
 	  input=getch();
 
    if(input!='\0')  //input!='\0'(空)表示当有输入的时候开始更新画面,这是游戏开始的条件 
 	{
 		if(input=='w'||input=='a'||input=='s'||input=='d'||input=='W'||input=='A'||input=='S'||input=='D')
 		{
 			if(primeinput=='w'&&input=='s'||primeinput=='s'&&input=='w'||primeinput=='a'&&input=='d'||primeinput=='d'&&input=='a'||primeinput=='W'&&input=='S'||primeinput=='S'&&input=='W'||primeinput=='A'&&input=='D'||primeinput=='D'&&input=='A')
 			{
 			  cout<<endl <<endl <<"贪吃蛇教会你的,是世上没有回头路,回头等于自焚"<<endl;   
			   exit(0);  //退出程序 
			 }
			 
 			else
 		primeinput=input;
 	    }
 		else if(primeinput=='.')
 		primeinput='w';
 		else if(input=='p')
 		{
 			while(1)
 			{
 				char op;
 				op=getch();
 				if(op=='p')
 				{
			    input='.';	 
 				break;
 			   }
			 }
		 }
		 else if(input=='+')
		 {
		 	if(op>=50)  //表示最快速度为25 ms刷新一次 
		 	op=op/2;
		 }
		 else if(input=='-')
		 {
		 	if(op<=1000) //表示最慢速度为 2000 ms刷新一次 
		 	op=op*2;
		 }
 		map[snake_x[snake_length-1]][snake_y[snake_length-1]]=0;//蛇走过一格,蛇尾处变为空格 
		 for(i=snake_length-1;i>0;i--)   
		 {
		 	snake_x[i]=snake_x[i-1]; //走过一格后蛇身的坐标覆盖前面的坐标 (从后往前覆盖,蛇头也会被蛇身覆盖) 
		 	snake_y[i]=snake_y[i-1];  
		 	map[snake_x[i]][snake_y[i]]=1;
		  } 
 		
	 }
	 if(primeinput=='w'||primeinput=='W')
	    snake_x[0]--;
	else if(primeinput=='s'||primeinput=='S')
	    snake_x[0]++;
	    else if(primeinput=='a'||primeinput=='A')
	    	snake_y[0]--;
	    	else if(primeinput=='d'||primeinput=='D')
	    		snake_y[0]++;
	map[snake_x[0]][snake_y[0]]=4;  //蛇头的坐标覆盖前面的坐标 
 }
int main()
{
	setdata();//数据初始化
  
    cout <<"(ASDW移动)请输入你的速度(10-100):";
	cin >>op;
	op=105-op; 
	while(1)
	{
		show();  //画面打印 
		Sleep(op);
		updatewithoutinput();   //与输入无关的更新 
		updatewithinput();      //与输入有关的更新 
	 }
	 return 0;
}

备注:千万不要在ACGO运行,因为ACGO没有头文件windows.h
解决方法:在dev-C++中运行。

输入格式

游戏体验吧

输出格式

不要看啦!玩会游戏吧!

输入输出样例

  • 输入#1

    你干嘛?

    输出#1

    哎呦!
  • 输入#2

    给我打游戏!

    输出#2

    你有完没完?

说明/提示


居然你还能看?那就给作者AC点个吧!(加关注哦!)求求了,也可以加入C++团队哦!(记得看公告

转载他的哦!

其实,您只需要输出“世上没有回头路”即可通过

首页