相信大家都玩过贪吃蛇这个游戏,但是不知道自己怎么可以编出来。下面是我学习和借鉴其他博主的开发经验以及经典作品写出来的。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<conio.h>
#include<cmath>
#include<windows.h>
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,y;
}snake[1000];
int snake_length,dir;
node food;
int direct[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void print_wall(){
cout<<" ";
for(int i=1;i<=n;i++)
cout<<"-";
cout<<endl;
for(int j=0;j<=m-1;j++){
cout<<"|";
for(int i=1;i<=n;i++) cout<<" ";
cout<<"|"<<endl;
}
cout<<" ";
for(int i=1;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==m+1||snake[0].y==n+1) 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,m)+1,j=(int) random(0,n)+1;
food.x=i,food.y=j;
for(int k=0;k<=snake_length-1;k++){
if(snake[k].x==food.x&&snake[k].y==food.y){
e=false;
break;
}
}
if(e) break;
}
locate(food.x,food.y);
cout<<"$";
return true;
}
bool go_ahead(){
node temp;
bool e=false;
temp=snake[snake_length-1];
for(int i=snake_length-1;i>=1;i--)
snake[i]=snake[i-1];
snake[0].x+=direct[dir][0];
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<<" ";
}
else
print_food();
locate(snake[0].x,snake[0].y);
cout<<"@";
if(!is_correct()){
system("cls");
cout<<"你输了!"<<endl<<"长度:"<<snake_length<<endl;
return false;
}
return true;
}
int main(){
cout<<"--------------------贪吃蛇--------------------"<<endl;
cout<<"请选择窗口大小,以免发生错位,建议将窗口调为最大。"<<endl;
cout<<"先选择难度,请在1-10中输入一个数,1为最简单,10为最难。"<<endl;
cout<<"然后进入游戏画面,以方向键控制方向,祝你游戏愉快!"<<endl;
cout<<"----------------------------------------------"<<endl;
m=25;
n=40;
if(m<10||n<10||m>25||n>40){
cout<<"错误"<<endl;
system("pause");
return 0;
}
int hard;
cin>>hard;
if(hard<=0||hard>10){
cout<<"错误"<<endl;
system("pause");
return 0;
}
snake_length=5;
clock_t a,b;
char ch;
double hard_len;
for(int i=0;i<=4;i++){
snake[i].x=1;
snake[i].y=5-i;
}
dir=3;
system("cls");
hide();
print_wall();
print_food();
print_snake();
locate(m+2,0);
cout<<"现在的长度:";
while(1){
hard_len=(double)snake_length/(double)(m*n);
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(m+2,12);
cout<<snake_length;
}
system("pause");
return 0;
}
欢迎大家试玩!