#include <iostream>
#include <fstream>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <sstream>
using namespace std;
int exchange(string s)
{
int Int;
stringstream ss;
ss << s;
ss >> Int;
return Int;
}
string change(int s)
{
string String;
stringstream ss;
ss << s;
ss >> String;
return String;
}
void gotoxy(int x,int y)
{
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
COORD co;
co.X = x,co.Y = y;
SetConsoleCursorPosition(hd,co);
}
struct position
{
public:
int x[1000],y[1000];
int recordx[1000],recordy[1000];
int foodx,foody;
int length;
char key,recordkey;
int score,level,select;
};
position p;
class gameFrame
{
public :
gameFrame();
void score();
void showScore();
};
gameFrame::gameFrame()
{
for(int i=0;i<24;i++)
{
gotoxy(0,i),cout<<"■"<<endl;
}
for(int j=0;j<24;j++)
{
gotoxy(54,j),cout<<"■"<<endl;
}
cout<<"■■■■■■■■■■■■■■■■■■■■■■■■■■■■";
gotoxy(0,0),cout<<"■■■■■■■■■■■■■■■■■■■■■■■■■■■■";
}
void gameFrame::score()
{
gotoxy(67,3),cout<<"贪吃蛇";
gotoxy(60,5),cout<<"等级:";
gotoxy(60,7),cout<<"分数:";
gotoxy(60,9),cout<<"操作说明:";
gotoxy(70,9),cout<<"wsad控制上";
gotoxy(60,10),cout<<"下左右,space暂停游戏";
}
void gameFrame::showScore()
{
gotoxy(66,7),cout<<p.score;
gotoxy(66,5),cout<<p.level;
}
class Snake
{
gameFrame f;
public :
Snake();
void move();
void control();
void death();
void food();
};
Snake::Snake()
{
p.level = 1;
p.score = 0;
p.length = 2;
p.x[0] = 24,p.y[0] = 12;
p.recordx[0] = p.x[0],p.recordy[0] = p.y[0];
for(int i=0;i<p.length;i++)
{
p.x[i+1] = p.x[i] - 2,p.y[i+1] = p.y[i];
p.recordx[i+1] = p.x[i+1],p.recordy[i+1] = p.y[i+1];
gotoxy(p.x[i+1],p.y[i+1]),cout <<"■";
}
gotoxy(p.x[0],p.y[0]),cout<<"◆";
}
void Snake::move()
{
gotoxy(p.recordx[p.length],p.recordy[p.length]),cout <<" "; //擦除蛇尾
gotoxy(p.x[0],p.y[0]),cout <<"◆";
for(int i = 0;i < p.length;i++)
{
p.x[i+1] = p.recordx[i],p.y[i+1] = p.recordy[i];
gotoxy(p.x[i+1],p.y[i+1]),cout <<"■";
}
for(i = 0;i <= p.length;i++)
p.recordx[i] = p.x[i],p.recordy[i] = p.y[i];
}
void Snake::control()
{
p.recordkey = *d*;
int mark = 0; //防止不断输出空格(用于掩盖暂停文字)
while(p.key != 27)
{
if(kbhit())
{
p.key = getch();
}
if(p.key == *d*)
{
if(p.recordkey == *a*)
p.x[0] -= 2;
else
{
p.x[0] += 2;
p.recordkey = p.key ;
}
move();
}
if(p.key == *a*)
{
if(p.recordkey == *d*)
p.x[0] += 2;
else
{
p.x[0] -= 2;
p.recordkey = p.key;
}
move();
}
if(p.key == *w*)
{
if(p.recordkey == *s*)
p.y[0]++;
else
{
p.y[0]--;
p.recordkey = p.key;
}
move();
}
if(p.key == *s*)
{
if(p.recordkey == *w*)
p.y[0]--;
else
{
p.y[0]++;
p.recordkey = p.key;
}
move();
}
if(p.key == * *)
{
gotoxy(58,18),cout<<"游戏暂停,按任意键继续...";
mark = 1;
}
if(mark == 1&&p.key !=* *)
{
gotoxy(58,18),cout<<" ";
mark = 0;
}
//食物捕捉
if(p.foodx ==p.x[0]&&p.foody == p.y[0])
{
cout <<*\a*;
food();
p.score += 100;
switch(p.score)
{
case 0: break;
case 400: p.level=2;break;
case 800: p.level=3;break;
case 1200: p.level=4;break;
case 2000: p.level=5;break;
default :;
}
f.showScore();
p.length ++;
}
death();
Sleep((int)500/p.level);
}
}
void Snake::death()
{
//撞到墙
if(p.x[0] == 0||p.x[0] == 54||p.y[0] == 0||p.y[0] == 24)
p.key = 27;
//撞到自己
if(p.length>3)
for(int i = 4;i<=p.length;i++)
{
if(p.x[0] == p.x[i]&&p.y[0] == p.y[i])
p.key = 27;
}
}
void Snake::food()
{
srand((unsigned)time(NULL));//当前时间作种子
//随机产生食物的坐标
p.foodx=rand()%(48-2+1)+2;//产生2到68之间的随机数
if(p.foodx%2!=0) p.foodx=p.foodx+1;//食物图标占两个位置,若为奇数则转化为偶数
p.foody=rand()%(23-1+1)+1;
for(int body=0;body<=p.length;body++)//若产生的食物坐标与小蛇身体重合,则重新产生新的食物坐标
{
if(p.foodx==p.x[body]&&p.foody==p.y[body])
{
p.foodx=rand()%(48-2+1)+2;
if(p.foodx%2!=0) p.foodx++;
p.foody=rand()%(23-1+1)+1;
}
}
gotoxy(p.foodx,p.foody),cout<<"●";
}
class mainFrame
{
public:
mainFrame();
void select();
void clear();
void top10();
void chose();
//system("mode con lines=25 cols=84");
};
mainFrame::mainFrame()
{
system("mode con lines=25 cols=84");
}
void mainFrame::select()
{
gotoxy(37,5),cout <<"THE SNAKE";
gotoxy(35,7),cout <<"1.START GAME";
gotoxy(35,9),cout <<"2.TOP 9";
gotoxy(35,11),cout <<"3.HELP";
gotoxy(35,13),cout <<"4.ABOUT GAME";
gotoxy(10,15),cout <<"SELECT:";
cin>>p.select;
}
void mainFrame::clear()
{
gotoxy(37,5),cout <<" ";
gotoxy(35,7),cout <<" ";
gotoxy(35,9),cout <<" ";
gotoxy(35,11),cout <<" ";
gotoxy(35,13),cout <<" ";
gotoxy(10,15),cout <<" ";
}
void mainFrame::top10()
{
string score[10];
ifstream fin("top.txt",ios::in);
for(int i = 0;i < 10;i++)
{
getline(fin,score[i]);
}
fin.close();
ofstream fout("top.txt",ios::in);
for(i = 0;i<10;i++)
{
if(p.score < exchange(score[i])&&p.score >= exchange(score[i+1]))
{
for(int j = 9;j > i+1;j--)
{
score[j] = score[j-1];
}
score[i+1] = change(p.score);
}
else if(p.score > exchange(score[0]))
{
for(int j = 9;j >= i+1;j--)
{
score[j] = score[j-1];
}
score[0] = change(p.score);
}
}
for(i=0;i<10;i++)
{
fout << score[i] <<endl;
}
}
void mainFrame::chose()
{
}
void main()
{
next:
mainFrame mf;
mf.select();
if(p.select == 1)
{
mf.clear();
gameFrame f;
Snake s;
s.food();
f.score();
s.control();
mf.top10();
}
if(p.select == 2)
{
string s[9];
mf.clear();
ifstream fin("top.txt",ios::in);
gotoxy(38,3),cout <<"RANK" << " " << "SCORE";
for(int i = 0;i<9;i++)
{
getline(fin,s[i]);
gotoxy(38,i+5),cout <<i+1<< " " << s[i] << endl;
}
cout <<"input *1* to back to the mainFrame:" << endl;
cin >> p.select;
if(p.select == 1)
{
mf.clear();
goto next;
}
}
if(p.select == 3)
{
mf.clear();
gotoxy(27,6),cout << "This game called Gluttonous Snake!"<< endl;
gotoxy(0,10),cout <<"input *1* to back to the mainFrame:" << endl;
cin >> p.select;
if(p.select == 1)
{
mf.clear();
goto next;
}
}
int i;
scanf("%c",&i);
}
以前写的,写的特别乱,你说的一些功能可能没有,自己改改吧