今年刚上大一,在学c++的时候就想做一个贪吃蛇小游戏,拖了好久,今天终于把它搞定了。
最困难的我感觉是蛇身移动的那部分模块,开始根本没想到要怎么做,后面借鉴了百度上的贪吃蛇代码,才发现可以把蛇的各段都做为一个数组,通过前后数组的赋值来实现蛇身的移动。太妙了,这里放上代码
void mov_snack(struct snack*p_snack)//移动蛇
{
for(int i=30-length;i<29;i++)
{
p_snack->x[i]=p_snack->x[i+1];
p_snack->y[i]=p_snack->y[i+1];
}
这是整个程序的代码,改进空间我感觉还很大,各地方的逻辑还可以理一理,看起来更清晰。
还是写有点简陋了。。
#include<iostream>
#include "stdio.h"
#include "conio.h"
#include <conio.h>
#include<ctime>
#include <windows.h>
using namespace std;
int fdx,fdy;
int length=3;
int speed=300;
void gotoxy(int x,int y) //控制光标坐标
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void print_noodle()//打印边框
{
for(int i=1;i<=21;i++)//左右边框
{
gotoxy(29,i);
cout<<"#";
gotoxy(81,i);
cout<<"#";
gotoxy(83,10);
cout<<"当前长度:";
gotoxy(83,11);
cout<<"目标长度:29";
gotoxy(83,12);
cout<<"当前速度:";
}
for(int i=30;i<81;i++)//上下边框
{
gotoxy(i,1);
cout<<"#";
gotoxy(i,21);
cout<<"#";
}
}
void in_food()//打印食物
{
fdx=rand()%51+30;
fdy=rand()%19+2;
gotoxy(fdx,fdy);
cout<<"*";
}
struct snack//蛇结构体
{
int x[30],y[30];
} ;
snack s1;
struct snack*p_snack=&s1;
void grow_snack()//蛇增长
{
length++;
}
void mov_snack(struct snack*p_snack)//移动蛇
{
for(int i=30-length;i<29;i++)
{
p_snack->x[i]=p_snack->x[i+1];
p_snack->y[i]=p_snack->y[i+1];
}
if(p_snack->x[29]==fdx&&p_snack->y[29]==fdy)//蛇吃食物和消除食物
{
gotoxy(fdx,fdy);
cout<<" ";
in_food();
grow_snack();
mov_snack(&s1);
gotoxy(92,10);
cout<<length-1;
speed=speed-10;//控制蛇速度
gotoxy(92,12);
cout<<speed;
}
}
int cond_snack()//蛇撞到自己退出游戏
{
int l=0;
for(int i=30-length;i<29;i++)
{
if(p_snack->x[29]==p_snack->x[i]&&p_snack->y[29]==p_snack->y[i])
l=1;
}
return l;
}
void print(struct snack*p_snack)//打印蛇
{
for(int i=29;i>(29-length);i--)
{
gotoxy(p_snack->x[i],p_snack->y[i]);
gotoxy(p_snack->x[i],p_snack->y[i]);
cout<<"0";
}
gotoxy(p_snack->x[30-length],p_snack->y[30-length]);
cout<<" ";//消除尾巴
}
int main()
{
p_snack->x[29]=40;
p_snack->x[28]=39;
p_snack->x[27]=38;
p_snack->y[29]=9;
p_snack->y[28]=9;
p_snack->y[27]=9;
print(&s1);
char a;
in_food();
print_noodle();
while(1)
{
a=getch();
while(!kbhit())
{
switch(a)
{
case 'a':
mov_snack(&s1);
p_snack->x[29]-=1;
break;
case 'd':
mov_snack(&s1);
p_snack->x[29]+=1;
break;
case 's':
mov_snack(&s1);
p_snack->y[29]+=1;
break;
case 'w':
mov_snack(&s1);
p_snack->y[29]-=1;
break;
}
if(p_snack->x[29]==29||p_snack->x[29]==81||
p_snack->y[29]==1||p_snack->y[29]==21||cond_snack())
{
goto lost;
}
print(&s1);
Sleep(speed);
}
}
lost:
system("cls");
gotoxy(20,10);
cout<<"geam over" ;
gotoxy(18,18);
cout<<"制作者:林杀马特*青龙";
gotoxy(50,20);
cout<<"\n";
}