这是看了一个网友的C++版的贪吃蛇之后而写的,有一些思想来源于他的代码,后来总共写了三四次,这三次都是有一些大的改动,每次都有一些新的想法,使得程序的可运行性以及美观性都有所进步,由于在控制台上运行,所以界面的美观性总是有限的,只是让控制台的界面更适合我们的眼睛而已,最初的界面闪动的厉害,还有运行中的崩溃问题,后来主要针对这两个方面进行改动,而且还增加了一些辅助信息以及辅助功能,并且解决了后来发现的内存泄露问题,后期还会对这个小程序进行改动,想法是让它更适合于我们的使用习惯,例如以文件的形式保存玩家信息,或者再改写成界面化的程序等,好了废话就这么多,下面把代码贴上来。
/
// 下面是贪吃蛇的代码 //
/
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
static int grade=0; // grade表示已吃食物的个数
static int y(1),f(0); // f表示蛇的长度
char n; // 成绩辅助选项
void gotoxy(int x,int y) // 光标定位函数,用于控制蛇的打印
{
COORD c;
c.X = 2*y;
c.Y = x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
class snode
{
public:
int x,y;
char a[20][20];
public:
void Init() //初始化
{
for(x=0;x<=19;x++)
for(y=0;y<=19;y++)
{
if(x==0||x==19||y==0||y==19)
*(*(a+x)+y)=14;
else
*(*(a+x)+y)=' ';
}
}
void print() //初始化界面
{
for(x=0;x<=19;x++)
{
for(y=0;y<=19;y++)
cout<<a[x][y]<<" ";
if(x==2||x==10||x==17)
cout<<" +**************************+";
if((x>2&&x<10)||(x>10&&x<17))
cout<<" | |";
cout<<endl;
}
gotoxy(5,23); cout<<" ★ 分数:0"<<endl;
gotoxy(12,23); cout<<" ★ 制作者:阿杰"<<endl;
gotoxy(13,23); cout<<" ★ 若发现BUG"<<endl;
gotoxy(14,23); cout<<" 请联系QQ1306232783 谢谢"<<endl;
gotoxy(15,23); cout<<" ★ 祝你玩的开心~.~"<<endl;
}
}S;
class snake
{
public:
snake *prior,*next;
snake(int a,int b)
{
x=a;
y=b;
}
int get_x() //获取x坐标
{
return x;
}
int get_y() //获取y坐标
{
return y;
}
void add_node(int a,int b) //增加头结点
{
snake *q=new snake(a,b);
q->next=head;
q->prior=NULL;
if(head)
head->prior=q;
if(!tail)
tail=head;
head=q;
gotoxy(a,b);
cout<<'*'<<endl;
}
void delete_node() //删除尾节点
{
snake *tr=tail;
tail=tr->prior;
tail->next=NULL;
gotoxy(tr->get_x(),tr->get_y());
cout<<' '<<endl;
delete tr;
}
private:
int x,y;
}*head=NULL,*tail=NULL,*t;
class move
{
public:
void moving(char ky) // ky获取按键
{
int a,b;
a=head->get_x();
b=head->get_y();
if(ky=='a'&&key=='d')
key='d';
else if(ky=='w'&&key=='s')
key='s';
else if(ky=='s'&&key=='w')
key='w';
else if(ky=='d'&&key=='a')
key='a';
else key=ky;
switch(key)
{
case 'w':
--a;
break;
case 's':
++a;
break;
case 'a':
--b;
break;
case 'd':
++b;
break;
default:
break;
}
panduan(a,b);
if(a==food_x && b==food_y) //吃到食物增加头结点,并随机下一次的食物
{
head->add_node(a,b);
grade++;
f++;
food();
}
else
{
head->add_node(a,b);
head->delete_node();
}
}
void panduan(int a,int b)
{
t=head;
for(int i=0;i<f;i++) //对蛇进行遍历,判断是否撞到了自己
{
if((a==t->get_x())&&(b==t->get_y()))
{
gotoxy(7,23);
cout<<" ★ 你撞了自己 程序结束!"<<endl;
gotoxy(21,0);
cout<<"按任意键退出..."<<endl;
getch();
exit(0);
}
t=t->next;
}
if(a==0||a==19||b==0||b==19) //判断是否撞墙
{
gotoxy(7,23);
cout<<" ★ 你撞到了墙 程序结束!"<<endl;
gotoxy(21,0);
cout<<"按任意键退出..."<<endl;
getch();
exit(0);
}
}
void food()
{
char d=2;
int flag=0;
food_x=rand()%18+1;
food_y=rand()%18+1;
t=head;
for(int i=0;i<f;i++) //对蛇进行遍历,判断食物是否出现在蛇身上
{
if((food_x==t->get_x()) && (food_y==t->get_y()))
flag=1;
t=t->next;
}
if(flag==1)
food();
else
{
gotoxy(food_x,food_y);
cout<<d<<endl;
}
}
private:
int food_x,food_y;
char key;
}ss;
int menu()
{
cout<<"\n\n\n\n\t来挑战贪吃蛇游戏吧!\n\n\t规则是w s a d控制上下左右\n\n\t★★注意请严格按照wsad控制方向★★"<<endl;
cout<<"\n\t请选择难度:\n\n\t 1.简单难度(建议)\n\t 2.中等难度\n\t 3.专家难度(不建议)"<<endl;
cout<<"\n\t请输入你的选择:>";
while(1)
{
n=getch();
switch(n)
{
case '1':
return 300;
case '2':
return 200;
case '3':
return 100;
default:
break;
}
gotoxy(16,12);
}
}
int main()
{
srand(time(NULL));
int k;
S.Init();
int speed=menu();
system("cls");
S.print();
head->add_node(6,6);
ss.food();
while(1)
{
k=_getch();
while(!_kbhit())
{
ss.moving(k);
gotoxy(5,30);
cout<<grade*100*(n-'0')<<endl;
Sleep(speed);
}
}
return 0;
}