新手求教!C++要求贪吃蛇的程序运行时能够自动移动并计算得分,急需帮助,谢谢 大家了
// game01.cpp : Defines the entry point for the console application.//
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
using namespace std;
#define N 37 //背景大小
int LEN=5; //蛇长度
int snake[2][200] ; //蛇的坐标记录,最后一个点要恢复
int food,food_x,food_y; //
int time1=200; //延时
void gotoxy(int x,int y)//位置函数
{ COORD pos;
pos.X=2 * x ;
pos.Y=y ;
//SetConsoleCursorPosition是API中定位光标位置的函数
//GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。
/*
STD_INPUT_HANDLE 标准输入的句柄
STD_OUTPUT_HANDLE 标准输出的句柄
STD_ERROR_HANDLE 标准错误的句柄
*/
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void init( )//初始化地图围墙
{ system("cls");
gotoxy(0,0);
for(int i=0;i<N+2;i++)
{ for(int j=0;j<N+2;j++)
{ if(0==i || N+1 == i || 0==j || N+1 ==j ) // 判断围墙
{ cout<<"□";
}else{ cout<<"■"; }
}
cout<<endl;
}
//初始化蛇点坐标
for (int i=0 ; i< LEN+1 ; i++)
{ snake[0][i] = (int)(N/2);
snake[1][i] = (int)(N/2); }
}
//食物刷新函数
void oduce_food()
{ char i;
if(food==0) // 如果没有食物
{ while(food==0) //循环到有食物
{ food_x=rand()%N+1;
food_y=rand()%N+1; //取食物XY坐标
for (i=0 ;i<LEN+1;i++) //判断是否和蛇身体重合
if(food_x==snake[0][i] && food_y==snake[1][i])break;
if(i==LEN+1) //不重合就显示食物
{ food=1;
gotoxy(food_x,food_y);
cout<<'*'<<endl;
}
}
}
}
char fsnake(char ch )
{
int new_x = 0,new_y = 0;
switch(ch)
{ case 'w':new_y = -1 ;break;
case 's':new_y = 1 ;break;
case 'a':new_x = -1 ;break;
case 'd':new_x = 1 ;break;
default: break; // 停止
}
//int i_len =LEN;
if (0==new_x && 0==new_y)
{ //停止了
}else{
//判断是否到围墙
if ( 0==snake[0][0] + new_x || N+1==snake[0][0] + new_x
|| 0==snake[1][0] + new_y || N+1==snake[1][0] + new_y )
return 1;
//把坐标点往后移
for (int i=LEN ;i>0 ;i--)
{ snake[0][i]=snake[0][i-1];
snake[1][i]=snake[1][i-1];
}
//计算新的第一个点
snake[1][0] = snake[1][1] + new_y;
snake[0][0] = snake[0][1] + new_x;
//判断是否撞到身体
for (int i=1 ;i<LEN ;i++)
if(snake[0][0]==snake[0][i] && snake[1][0]==snake[1][i])return 1;
}
if(food_x==snake[0][0] && food_y==snake[1][0])//吃到食物就把蛇的长度加一,时间调快
{ food=0,LEN++;
if(time1>50) time1 -= 10;
}else //否则就恢复最后一个点
{ gotoxy(snake[0][LEN],snake[1][LEN]);
cout<<"■"<<endl;
}
//显示蛇
for (int i=0 ;i<LEN ;i++)
{ gotoxy(snake[0][i],snake[1][i]);
cout<<"◎"<<endl;
}
//最后一个点恢复
oduce_food(); //食物刷新函数
return 0;
}
int main(int argc, char* argv[])
{ //初始化 背景
init( );
srand(time(NULL)); //取当前时间为随机种子
char ch='p';
while(1)//进入消息循环
{ if(kbhit()) // 检查当前是否有键盘输入
{ gotoxy(0,N+2);
ch=getche();
gotoxy(0,N+2);
cout<<" "<<endl;
}
if(fsnake( ch )==1 || ch=='q')
{
gotoxy(0,N+2);return 1;
}
//Sleep(time1);
}
}
[此贴子已经被作者于2015-11-14 22:53编辑过]