问题标题: 贪吃蛇

0
0
凌夏
凌夏
中级守护
中级守护

wasd控制方向

不同的颜色食物有不同的分值

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<windows.h>
#include<conio.h>
#include<cmath>
#include<chrono>
#include<cstring>
using namespace std;
int a[105][105],n,m;//地图
int dir[5][2]={{0,0},{-1,0},{0,-1},{0,1},{1,0}},way,wmp;
int sx,sy,ex,ey;//头坐标,尾坐标
int len,maxlen;//长度 
int cnt,cntmax,score;//果子数量 
int f[105][105];//方向地图 
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
void setColor(int color) {//颜色函数 
    SetConsoleTextAttribute(hOut, color);
}
void mapout(){
	for(int i=1;i<=m+2;i++){
		cout<<"■"; 
	}
	cout<<endl;
	for(int i=1;i<=n;i++){
		cout<<"█";
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				setColor(FOREGROUND_GREEN);
				cout<<"■";
				setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
			}else if(a[i][j]==2){
				setColor(FOREGROUND_BLUE);
				cout<<"■";
				setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
			}else if(a[i][j]==3){
				setColor(FOREGROUND_RED | FOREGROUND_GREEN);
				cout<<"■";
				setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
			}else if(a[i][j]==4){
				setColor(FOREGROUND_RED | FOREGROUND_BLUE);
				cout<<"■";
				setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
			}else{
				cout<<" ";
			}
		}
		cout<<"█";
		cout<<endl; 
	} 
	for(int i=1;i<=m+2;i++){
		cout<<"■"; 
	}
	cout<<endl;
}
void apple(){//生成果子 
	int tx=0,ty=0,step=0;
	do{
		step++;
		tx=rand()%15+1;
		ty=rand()%50+1;
	}while(a[tx][ty]!=0 || tx==1 || ty==1 || tx==n || ty==m || step>50);
	a[tx][ty]=rand()%3+2;
	cout<<tx<<" "<<ty<<endl;
}
int main(){
	srand(static_cast<unsigned int>(time(nullptr)));
	n=15;
	m=50; 
	while(true){
		mapout();
		a[1][(1+m)/2]=1;//出生点 
		way=4;//方向:下 
		sx=1;
		sy=(1+m)/2;
		ex=1;
		ey=(1+m)/2;
		len=1;
		maxlen=2;
		cnt=0;
		cntmax=2;
		while(true){
			system("cls");
			mapout();
			setColor(FOREGROUND_RED);
			cout<<"score:"<<score<<"\n";
			setColor(FOREGROUND_RED | FOREGROUND_GREEN);
			cout<<"lenth:"<<len<<"\n";
			setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
			/*for(int i=1;i<=n;i++){
				cout<<" ";
			}
			cout<<endl;
			for(int i=1;i<=n;i++){
				cout<<" ";
				for(int j=1;j<=m;j++){
					cout<<f[i][j];
				}
				cout<<endl;
			}*/
			for(int i=cnt;i<=cntmax;i++){
				apple();
				cnt++;
			}
			auto start_time=std::chrono::steady_clock::now();
			auto now_time=std::chrono::steady_clock::now();
			long long pass=0;
			while(true){
				if(_kbhit()){//改变方向 
					wmp=_getch();
					if(wmp=='w'&&way==4 || wmp=='s'&&way==1 || wmp=='a'&&way==3 || wmp=='d'&&way==2){//与前进方向相反不改变(不能调头) 
						break;
					}
					if(wmp=='w') way=1;
					if(wmp=='a') way=2;
					if(wmp=='d') way=3;
					if(wmp=='s') way=4;
					break;
				}
				now_time=std::chrono::steady_clock::now();
				pass=std::chrono::duration_cast<std::chrono::milliseconds>(now_time-start_time).count();
				if(pass>=500){
					break;
				}
			}
			
			f[sx][sy]=way;
			sx+=dir[way][0];
			sy+=dir[way][1];
			if(a[sx][sy]==1 || sx<1 || sx>n || sy<1 || sy>m){
				setColor(FOREGROUND_RED);
				cout<<"You did!";
				Sleep(3000);
				setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
				memset(a,0,sizeof(a));
				memset(f,0,sizeof(f));
				system("cls");
				break;
			}
			if(a[sx][sy]>1){
				maxlen++;
				cnt--;
				score+=a[sx][sy];
			} 
			a[sx][sy]=1;
			len++;
			if(len>maxlen){
				a[ex][ey]=0;
				int t=f[ex][ey];
				f[ex][ey]=0;
				ex+=dir[t][0];
				ey+=dir[t][1];
				len--;
			}
		} 
		
	}
}/*
【1】 ↑(上)-1,0
【2】 ←(左)0,-1
【3】 →(右)0,1
【4】 ↓(下)1,0 
*/

 

凌夏在2026-11-08 21:14:29追加了内容

使用时调成英文模式

我要回答