练手: 贪吃蛇(c++)

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
using namespace std;
const int N=21;
void Get_xy(int x,int y)   //定位光标位置
{
	HANDLE hout;
	COORD pos;
	pos.X=x*2;
	pos.Y=y;
	hout=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hout,pos);
}

void Color(int num)   //设置颜色
{
	HANDLE hout;
	hout=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hout,num);
}

void Initial()   //初始化
{
	int i,j;
	int wall[N+2][N+2]={{0}};
	for(i=1;i<=N;i++)
		for(j=1;j<=N;j++)
			wall[i][j]=1;
	Color(11);
	for(i=0;i<N+2;i++)
	{
		for(j=0;j<N+2;j++)
		{
			if(wall[i][j])
				cout<<"■";
			else cout<<"□";
		}
		cout<<endl;
	}
	Get_xy(N+3,1); Color(20);
	cout<<"按'W','S','A','D'进行操作"<<endl;
	Get_xy(N+3,2); Color(20);
	cout<<"按任意键暂停"<<endl;
	Get_xy(N+3,3); Color(20);
	cout<<"得分:"<<endl;
}

void game()
{
	int** snake=NULL;
	int len=1;
	int i;
	int score=0;
	int apple[2];
	int tail[2];
	char ch='p';
	Initial();
	srand((unsigned)time(NULL));
	apple[0]=rand()%N+1;
	apple[1]=rand()%N+1;
	Get_xy(apple[0],apple[1]);
	Color(12);
	cout<<"●"<<endl;
	snake=(int**)realloc(snake,sizeof(int*)*len);
	for(i=0;i<len;i++)
		snake[i]=(int*)malloc(sizeof(int)*2);
	snake[0][0]=N/2; 
	snake[0][1]=N/2+1; 
	Get_xy(snake[0][0],snake[0][1]); Color(14);
	cout<<"⊙"<<endl;
	int flag=1;
	while(1)
	{
		if(flag)
		{
		tail[0]=snake[len-1][0];
        tail[1]=snake[len-1][1];
        Get_xy(tail[0],tail[1]);
        Color(11);
        cout<<"■"<<endl;
		}
		flag=1;
		for(i=len-1;i>0;i--)
		{
			snake[i][0]=snake[i-1][0];
			snake[i][1]=snake[i-1][1];
			Get_xy(snake[i][0],snake[i][1]);
			Color(14);
			cout<<"★"<<endl;
		}
		if(kbhit())
		{
			Get_xy(0,N+3);
			ch=getche();
		}
		switch(ch)
		{
		case 'W':
		case 'w': snake[0][1]--; break;
		case 'S':
		case 's': snake[0][1]++; break;
		case 'A':
		case 'a': snake[0][0]--; break;
		case 'D':
		case 'd': snake[0][0]++; break;
		default :break;
		} 
		for(i=1;i<len;i++)
		{
			if(snake[0][0]==snake[i][0] && snake[0][1]==snake[i][1])
			{
				Get_xy(N/2,N/2); Color(30);
				cout<<"Game over!"<<endl;
				exit(0);
			}
		}
		Get_xy(snake[0][0],snake[0][1]);
		Color(14); cout<<"⊙"<<endl;
		Sleep(abs(200-0.5*score));
		if(snake[0][0]==apple[0] && snake[0][1]==apple[1])
		{
			flag=0; score++; len++;   srand((unsigned)time(NULL));
			snake=(int**)realloc(snake,sizeof(int*)*len);
			snake[len-1]=(int*)malloc(sizeof(int)*2);
			Get_xy(N+6,3); Color(20); cout<<score<<endl;
			apple[0]=rand()%N+1; apple[1]=rand()%N+1;
			Get_xy(apple[0],apple[1]);
			Color(12);
			cout<<"●"<<endl;
		}
		if(snake[0][0]==0 || snake[0][0]==N || snake[0][1]==0 || snake[0][1]==N)
		{
			Get_xy(N/2,N/2); Color(30);
			cout<<"Game Over!"<<endl;
			for(i=0;i<len;i++)
				free(snake[i]);
			Sleep(INFINITE);
			exit(0);
		}
		if(len>=N*N/20) 
		{
			Get_xy(N/2,N/2); Color(30);
			cout<<"Win!"<<endl;
			for(i=0;i<len;i++)
				free(snake[i]);
			Sleep(INFINITE);
			exit(0);
		}
	}
}
int main()
{
	game();
	return 0;
}
如果在vc++6.0上运行,需要变成“.h”的头文件!
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值