前言
呵呵 这大概是 大学里面的 c++ 贪吃蛇了吧
有一些 面向对象的理解, 但是不多
最近 因为想要 在单片机上面移植一下 贪吃蛇, 所以 重新拿出了一下 这份代码
然后 将它更新为 c 版本, 还是 用了一些时间
这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用
然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整
贪吃蛇
#include<iostream>
#include<Windows.h>
#include<ctime>
#include<string>
using namespace std;void position(int ,int );
class Node //蛇身的结点
{
public:int x;int y;Node *next;Node(int x=0,int y=0){ this->x=x;this->y=y;next=NULL; }
};class hero //英雄榜的结点
{
public:string name;int score;hero(string s="anonymous",int sc=0){ name=s;score=sc; }
};class Snake
{
private:Node *head; //头结点Node *food; //食物结点bool flag; //是否吃到食物int grade; //所得分数int level; //游戏级别int tot; //蛇身节点的个数int direction; //蛇的方向int herotot; //英雄榜人物个数hero HERO[11]; //英雄榜数据public:Snake(){ head=new Node(20,10);flag=false;direction=2;tot=1;grade=0;level=0;herotot=0;}void setmap(); //screen's length = 78 ; width = 24;打印出地图void menu(); //菜单bool isover(); //是否游戏结束void go(); //蛇的行动void running(); //运行程序void init(); //初始化蛇身void createfood(); //创建食物bool getfood(); //吃到食物bool isfoodcover(); //食物是否出现在蛇体上bool issuccess(); //是否是成功退出void showinfo(); //看文件信息void lookhero(); //看英雄榜void print(); //打印蛇体
};int main()
{ Snake snake;char ch;system("cls");do{ snake.menu();cin>>ch;if(ch=='1') snake.running();if(ch=='2') snake.showinfo();if(ch=='3') snake.lookhero();if(ch=='4') break;}while(true);return 0;
}void position(int x,int y)
{ HANDLE handle;handle=GetStdHandle(STD_OUTPUT_HANDLE);COORD position={x,y}; // position.x=x;position.y=ySetConsoleCursorPosition(handle,position);
}void Snake::setmap() // → ← ↑ ↓ ⊙ □ ■ ※
{int i;system("cls");for(i=0;i<=39;i++){ position(2*i,0);cout<<"※";position(2*i,24);cout<<"※";Sleep(10);}for(i=23;i>0;i--){ position(0,i);cout<<"※";position(60,i);cout<<"※";position(78,i);cout<<"※";Sleep(10);}position(64,4); cout<<"grade :"<<grade;position(64,6); cout<<"level :"<<level;position(64,8); cout<<"length :"<<tot;position(64,10); cout<<"pause: right ";position(64,12); cout<<"key of mouse .";position(64,16); cout<<"snake";position(64,18); cout<<"direction:";position(68,20); cout<<"↑";position(64,22); cout<<"← ↓ →";position(0,0);
} void Snake::menu() // ∞ ○ Θ
{ system("cls");for(int i=0;i<=39;i++){ position((2*i),0); cout<<"※";position((2*i),1); cout<<"№";position((2*i),2); cout<<"∞";position((2*i),3); cout<<"⊙";Sleep(20);position((2*i),24); cout<<"○";position((2*i),23); cout<<"∞";position((2*i),22); cout<<"‰";position((2*i),21); cout<<"※";}position(20,8); cout<<"GLUTTONOUS SNAKE"<<endl;position(18,10); cout<<"1.START";position(40,10); cout<<"2.ABOUT GAME";position(18,14); cout<<"3.HERO ";position(40,14); cout<<"4.EXIT";position(18,18); cout<<"PLEASE INPUT : ";
}void Snake::init()
{ Node *p=head;srand((int )time(NULL));for(int i=1;i<=3;i++){ p->next=new Node(20-2*i,10);tot++;p=p->next;}
} bool Snake::isover()
{ Node *p=head->next->next->next;if(head->x>58 || head->x<=0 || head->y>23 || head->y<=0 ) return true;while(p){ if( head->x==p->x && head->y==p->y ) return true;p=p->next;}if(level>=10) return true;return false;
} void Snake::createfood()
{ food=new Node;do { food->x=rand()%58+2;food->y=rand()%23+1;}while(isfoodcover());if(food->x%2==1) food->x=food->x-1;position(food->x,food->y); cout<<"□";
} bool Snake::getfood()
{ Node *p;if(flag==true){ if((direction+2)%2==1){ p=new Node(head->x,head->y+direction);p->next=head;head=p;}else{ p=new Node(head->x+direction,head->y);p->next=head;head=p;}flag=false;}if( head->x == food->x && head->y == food->y ){ flag=true;if(grade>=100*(level+1)*(level+1)){ level++;position(71,6);cout<<level;}grade=grade+5*(level+1);position(71,4);cout<<grade;position(72,8);cout<<++tot;return true;}return false;
}bool Snake::isfoodcover()
{ Node *p=head;while(p){ if(food->x==p->x && food->y==p->y ) return true;p=p->next;}return false;
}void Snake::go()
{ if(GetAsyncKeyState(VK_UP) && direction!=1 ) direction=-1;else if(GetAsyncKeyState(VK_LEFT) && direction!=2 ) direction=-2;else if(GetAsyncKeyState(VK_DOWN) && direction!=-1 ) direction=1;else if(GetAsyncKeyState(VK_RIGHT) && direction!=-2 ) direction=2;if(GetAsyncKeyState(VK_LBUTTON)){ while(true){if(GetAsyncKeyState(VK_LBUTTON)) break;}}Node *p;if((direction+2)%2==1){ p=new Node(head->x,head->y+direction);p->next=head;head=p;while(p->next->next){ p=p->next;}position(p->next->x,p->next->y); cout<<" ";delete p->next;p->next=NULL;print();}else { p=new Node(head->x+direction,head->y);p->next=head;head=p;while(p->next->next){ p=p->next;}position(p->next->x,p->next->y); cout<<" ";delete p->next;p->next=NULL;print();}Sleep(300-30*level);
} void Snake::running()
{ Node *p;system("cls");init();setmap();createfood();int num=0;while(true){print();go();if(isover()) break;if(getfood()){ delete food;createfood();}}position(0,25);if(issuccess()) cout<<"CONGRATULATIONS YOU WIN !"<<endl;else cout<<"SORRY YOU LOSE"<<endl;cout<<"YOU GOT "<<grade<<" POINT"<<endl;cout<<"PLEASE INPUT YOUR BIG NAME: ";if(herotot<10){ cin>>HERO[herotot].name;HERO[herotot].score=grade; herotot++;}else { cin>>HERO[10].name;HERO[10].score=grade; }hero temp=HERO[herotot-1];for(int j=herotot-2;j>=0;j--){ if(HERO[herotot-1].score>HERO[j].score) num++;else break;}for(j=0;j<num;j++)HERO[herotot-j-1]=HERO[herotot-j-2];HERO[herotot-num-1]=temp;// 还回原状p=head->next;while(p){ p=p->next;delete head->next;head->next=p;}head->x=20;head->y=10;head->next=NULL;direction=2;tot=1;grade=0;level=0;
}bool Snake::issuccess()
{ if(level>=10) return true;return false;
}void Snake::showinfo()
{ system("cls");position(16,8); cout<<"WELCOME TO GLUTTONOUS SNAKE";position(12,12); cout<<"THIS IS MADE BY JERRY "<<endl<<" AT 2013-11-08 FRIDAY AFTERNOON";position(12,16); system("pause");
}void Snake::lookhero()
{ system("cls");position(25,3); cout<<"HERO BANG ";for(int i=0;i<herotot;i++){ position(12,i+7);cout<<"THE "<<i+1<<" TH"<<" NAME :"<<HERO[i].name; position(47,i+7); cout<<" SCORE :"<<HERO[i].score<<endl;}position(25,20); system("pause");
}void Snake::print()
{Node *p=head;while(p){ position(p->x,p->y); cout<<"■";p=p->next;}
}
程序截图
首页
程序执行之后如下
以前在 win7 上面的截图
完