程序为 参考他人的思想,自己独自完成的 《贪食蛇》程序。虽然写的很烂,但想想好歹是自己 第一个真正意义上的C++程序。特别纪念一下,激励一下自己
1.my_snack.h
#ifndef MY_SNAKE_H_ #define MY_SNAKE_H_ #define UP 1001 #define DOWN 1002 #define LEFT 1003 #define RIGHT 1004 #define Hlenth 25 //水平方向 #define Vlenth 25 //竖直方向 #define Time 10000 typedef struct Snode { int x; int y; Snode *last; Snode *next;//指向下一个节点 }Snode,*SnodeLnk; class Snack { private: SnodeLnk head; int fx; int fy; int count; int point; public: Snack(); ~Snack(); void print(); void delay(); void add_head(); void del_last(); void eat_food(); void move(); void jud_die(); void food(); void key_move(char ch); }; #endif
2. my_snack.cpp
#include <iostream> #include <ctime> #include "my_snake.h" using namespace std; int area[Hlenth][Vlenth]={0}; Snack::Snack()//起点(10,10) { int i; point=RIGHT; head=new Snode; head->x=9; head->y=8; head->next=NULL; head->last=NULL; //fx=9;//测试 //fy=13; //area[fx][fy]=1; add_head(); add_head(); add_head(); add_head(); add_head(); add_head(); //meset() 数组为0 for (i=0;i<Hlenth;i++) { area[0][i]=1; area[Vlenth-1][i]=1; } for (i=0;i<Vlenth;i++) { area[i][0]=1; area[i][Hlenth-1]=1; } } Snack::~Snack() { SnodeLnk p=NULL; while (head) { p=head; head=head->next; delete p; } } void Snack::add_head() { /* Snode Mypoint; Mypoint.x=head->x; Mypoint.y=head->y+1; Mypoint.next=head; Mypoint.last=NULL; head=&Mypoint;*/ // 结点 为何不行??? /* SnodeLnk p; p=new Snode; p->x=head->x; p->y=head->y+1; p->next=head; p->last=NULL; head=p;*/ // 指针 通过 SnodeLnk p=new Snode; switch(point) { case LEFT: { p->x=head->x; p->y=head->y-1; head->last=p; p->next=head; p->last=NULL; head=p; break; } case RIGHT: { p->x=head->x; p->y=head->y+1; head->last=p; p->next=head; p->last=NULL; head=p; break; } case DOWN: { p->x=head->x+1; p->y=head->y; head->last=p; p->next=head; p->last=NULL; head=p; break; } case UP: { p->x=head->x-1; p->y=head->y; head->last=p; p->next=head; p->last=NULL; head=p; break; } } } void Snack::del_last() { SnodeLnk q; int m,n; q=head; while (q->next)//不是 结束 { q=q->next; } m=q->x; n=q->y; area[m][n]=0; q->last->next=NULL; delete q; } void Snack::delay() { for (int i=0;i<Time;i++) { for (int j=0;j<Time;j++) { ;; } } } void Snack::move() { add_head(); del_last(); } void Snack::key_move(char ch) { switch(ch) { case 'w': case 'W': if (point==DOWN) { break; } point=UP; break; case 's': case 'S': if (point==UP) { break; } point=DOWN; break; case 'a': case 'A': if (point==RIGHT) { break; } point=LEFT; break; case 'd': case 'D':if(point==LEFT) { break; } point=RIGHT; break; default: break; } } void Snack::print() { int m,n; SnodeLnk p=head; while(p->next) //少打一个 最后一个 { m=p->x; n=p->y; area[m][n]=1; p=p->next; } m=p->x; //打 最后一个 n=p->y; area[m][n]=1; for(int i=0;i<Hlenth;i++) { for(int j=0;j<Vlenth;j++) { if (area[i][j]==1) { cout<<"*"; } else cout<<" "; } cout<<endl; } } void Snack::food() { srand(unsigned int(time(0))); fx=rand()%(Vlenth-3)+1;//确保落在框内 fy=rand()%(Vlenth-3)+1; while(area[fx][fy]==1) //检查是否落在 蛇身上 { fx=rand()%(Vlenth-3)+1; fy=rand()%(Vlenth-3)+1; } area[fx][fy]=1; //cout<<"fx:"<<fx<<" fy:"<<fy<<endl; } void Snack::eat_food() { if ((head->x==fx)&&(head->y==fy)) { area[fx][fy]=0; add_head(); food(); } else{} } void Snack::jud_die() { int x,y,m,n; SnodeLnk q; q=head->next; x=head->x; y=head->y; if (x==(Vlenth-1)||x==0||y==(Hlenth-1)||y==0) { cout<<"failed!\n"; this->~Snack(); exit(0); } while (q->next) { m=q->x; n=q->y; q=q->next; if (m==x&&n==y) { cout<<"failed !\n"; this->~Snack(); exit(0); } } m=q->x;//检查是否撞上尾巴 n=q->y; if (m==x&&n==y) { cout<<"failed !\n"; this->~Snack(); exit(0); } }
3.main.cpp
#include "my_snake.h" #include <iostream> #include <conio.h> using namespace std; int main() { Snack snack; char ch; int i; char count=0; snack.food(); snack.print(); while (1) { ch=_getch(); snack.key_move(ch); while(!_kbhit()) //没有键盘按下 无为0 { snack.delay(); snack.delay(); snack.move(); system("cls"); snack.print(); snack.eat_food(); snack.jud_die(); //snack.print(); } } return 0; }
游戏说明:按任意键“开始”。 通过 键盘的 ' W ', 'S ', 'A ' , 'D' 分别控制 运动的 “上”,“下”,“左”,“右”