#include<iostream>
#include<conio.h>
#include <limits.h> //声明INT_MAX和ULONG_MAX常量
#include <windows.h> //声明GetTickCount()函数,其返回从开机到现在经过的毫秒数
#include <stdlib.h> //声明rand和srand函数
#include <time.h> //声明time函数
using namespace std;
class TRandom
{
public:
//缺省使用系统时间(开机后经过的毫秒数)为种子
TRandom(long seed = 0) { mSeed = (seed ? seed : GetTickCount64()); }
//也可以定义自己的种子
void Seed(long seed = 0) { mSeed = (seed ? seed : GetTickCount64()); }
//取得一个随机的整数
int Integer() { return Next(); }
//取得一个在指定范围内的随机整数
int Integer(int min, int max) { return min + Next() % (max - min + 1); }
//取得一个随机的0到1之间的小数
double Real() { return double(Next()) / double(INT_MAX); }
private:
//使用调和算法
void Change() { mSeed = (314159265 * mSeed + 13579) % ULONG_MAX; }
//取得伪随机数发生器的随机数序列中的下一个随机整数
int Next() {
int loops = mSeed % 3;
for (int i = 0; i <= loops; i++)
Change();
return int(mSeed / 2);
}
unsigned long mSeed; //随机数发生器的种子
};
int x=0, y=0;
void printm(int startX, int startY)
{
HANDLE hd;
COORD pos;
pos.X = startX;
pos.Y = startY;
hd = GetStdHandle(STD_OUTPUT_HANDLE); /*获取标准输出的句柄*/
SetConsoleCursorPosition(hd, pos);/*设置控制台光标输出的位置*/
printf("*");
}
void prints(int startX, int startY)
{
HANDLE hd;
COORD pos;
pos.X = startX;
pos.Y = startY;
hd = GetStdHandle(STD_OUTPUT_HANDLE); /*获取标准输出的句柄*/
SetConsoleCursorPosition(hd, pos);/*设置控制台光标输出的位置*/
printf("@");
}
void printq(int startX, int startY)
{
HANDLE hd;
COORD pos;
pos.X = startX;
pos.Y = startY;
hd = GetStdHandle(STD_OUTPUT_HANDLE); /*获取标准输出的句柄*/
SetConsoleCursorPosition(hd, pos);/*设置控制台光标输出的位置*/
printf("&");
}
void go(int startX, int startY) {
HANDLE hd;
COORD pos;
pos.X = startX;
pos.Y = startY;
hd = GetStdHandle(STD_OUTPUT_HANDLE); /*获取标准输出的句柄*/
SetConsoleCursorPosition(hd, pos);/*设置控制台光标输出的位置*/
}
class Map {
public:
void Map_Create(int x,int y) {
for (int j = 0; j < y; j++) {
if (j == 0 || j == y - 1) {
for (int i = 0; i < x; i+=2) {
printm(i, j);
}
}
else {
printm(0, j);
printm(x-1, j);
}
}
}
};
class Snake {
public:
int length;
int x[1000];
int y[1000];
int numh = 0;
int numr = 0;
int Head_dir;//1上2下3左4右
int Rear_dir;
Snake(int l) {
length = l;
Head_dir = 4;
Rear_dir = 4;
x[0] = 1;
y[0] = 1;
x[1] = l;
y[1] = 1;
numh = 1;
numr = 0;
}
void Dir_change(char ch) {
if (ch == 'w' && Head_dir != 1 && Head_dir != 2) {
Head_dir = 1;
numh++;
x[numh] = x[numh - 1];
y[numh] = y[numh - 1];
}
else if (ch == 's' && Head_dir != 1 && Head_dir != 2) {
Head_dir = 2;
numh++;
x[numh] = x[numh - 1];
y[numh] = y[numh - 1];
}
else if (ch == 'a' && Head_dir != 3 && Head_dir != 4) {
Head_dir = 3;
numh++;
x[numh] = x[numh - 1];
y[numh] = y[numh - 1];
}
else if (ch == 'd' && Head_dir != 3 && Head_dir != 4) {
Head_dir = 4;
numh++;
x[numh] = x[numh - 1];
y[numh] = y[numh - 1];
}
}
void move() {
if (Head_dir == 1) {
y[numh]--;
if (Rear_dir == 1)
y[numr]--;
else if (Rear_dir == 2)
y[numr]++;
else if (Rear_dir == 3)
x[numr]--;
else if (Rear_dir == 4)
x[numr]++;
if (x[numr] == x[numr + 1] && y[numr] == y[numr + 1]) {
numr++;
if (x[numr] == x[numr + 1]) {
if (y[numr] > y[numr + 1]) {
Rear_dir = 1;
}
else Rear_dir = 2;
}
else {
if (x[numr] > x[numr + 1]) {
Rear_dir = 3;
}
else Rear_dir = 4;
}
}
}
else if (Head_dir == 2) {
y[numh]++;
if (Rear_dir == 1)
y[numr]--;
else if (Rear_dir == 2)
y[numr]++;
else if (Rear_dir == 3)
x[numr]--;
else if (Rear_dir == 4)
x[numr]++;
if (x[numr] == x[numr + 1] && y[numr] == y[numr + 1]) {
numr++;
if (x[numr] == x[numr + 1]) {
if (y[numr] > y[numr + 1]) {
Rear_dir = 1;
}
else Rear_dir = 2;
}
else {
if (x[numr] > x[numr + 1]) {
Rear_dir = 3;
}
else Rear_dir = 4;
}
}
}
else if (Head_dir == 3) {
x[numh]--;
if (Rear_dir == 1)
y[numr]--;
else if (Rear_dir == 2)
y[numr]++;
else if (Rear_dir == 3)
x[numr]--;
else if (Rear_dir == 4)
x[numr]++;
if (x[numr] == x[numr + 1] && y[numr] == y[numr + 1]) {
numr++;
if (x[numr] == x[numr + 1]) {
if (y[numr] > y[numr + 1]) {
Rear_dir = 1;
}
else Rear_dir = 2;
}
else {
if (x[numr] > x[numr + 1]) {
Rear_dir = 3;
}
else Rear_dir = 4;
}
}
}
else if (Head_dir == 4) {
x[numh]++;
if (Rear_dir == 1)
y[numr]--;
else if (Rear_dir == 2)
y[numr]++;
else if (Rear_dir == 3)
x[numr]--;
else if (Rear_dir == 4)
x[numr]++;
if (x[numr] == x[numr + 1] && y[numr] == y[numr + 1]) {
numr++;
if (x[numr] == x[numr + 1]) {
if (y[numr] > y[numr + 1]) {
Rear_dir = 1;
}
else Rear_dir = 2;
}
else {
if (x[numr] > x[numr + 1]) {
Rear_dir = 3;
}
else Rear_dir = 4;
}
}
}
}
void eat() {
if (Rear_dir == 1) {
y[numr]++;
}
else if(Rear_dir == 2) {
y[numr]--;
}
else if (Rear_dir == 3) {
x[numr]++;
}
else if (Rear_dir == 4) {
x[numr]--;
}
length++;
}
void draw() {
int n = numh;
int posx = x[numh];
int posy = y[numh];
prints(posx, posy);
for (; n > numr; n--) {
if (x[n] == x[n - 1]) {
if (y[n] > y[n - 1]) {
for (int i = y[n]-1; i >= y[n - 1]; i--) {
printm(x[n], i);
}
}
else {
if (y[n] < y[n - 1]) {
for (int i = y[n]+1; i <= y[n - 1]; i++) {
printm(x[n], i);
}
}
}
}
else {
if (x[n] > x[n - 1]) {
for (int j=x[n]-1;j>=x[n-1];j--){
printm(j, y[n]);
}
}
else {
for (int j = x[n]+1; j <= x[n - 1]; j++) {
printm(j, y[n]);
}
}
}
}
}
int eatself() {
for (int i = numr; i < numh; i++) {
if (x[numh] == x[i]&&y[numh]==y[i]) {
return 0;
}
else if (x[numh] == x[i]) {
if (y[i] > y[i + 1]) {
if (y[numh]<y[i] && y[numh]>y[i + 1])
return 0;
}
else if (y[numh] > y[i] && y[numh] < y[i + 1])
return 0;
}
else if (y[numh] == y[i]) {
if (x[i] > x[i + 1]) {
if (x[numh] < x[i] && x[numh] > x[i + 1])
return 0;
}
else if (x[numh] > x[i] && x[numh] < x[i + 1])
return 0;
}
}
return 1;
}
int foodself(int x1,int y1) {
for (int i = numr; i < numh; i++) {
if (x1 == x[i] && y1 == y[i]) {
return 0;
}
else if (x1 == x[i]) {
if (y[i] > y[i + 1]) {
if (y1<y[i] && y1>y[i + 1])
return 0;
}
else if (y1 > y[i] && y1 < y[i + 1])
return 0;
}
else if (y1 == y[i]) {
if (x[i] > x[i + 1]) {
if (x1 < x[i] && x1 > x[i + 1])
return 0;
}
else if (x1 > x[i] && x1 < x[i + 1])
return 0;
}
}
return 1;
}
};
class food {
public:
int x;
int y;
void born(int x1,int y1) {
TRandom T;
x = T.Integer(1, x1);
y = T.Integer(1, y1);
}
void print() {
printq(x, y);
}
};
int game(int x,int y,int rate) {
Map M;
Snake s(10);
food F;
F.born(x-2, y-2);
while (1) {
while (!_kbhit()) {
system("cls");
M.Map_Create(x, y);
F.print();
s.move();
s.draw();
if (s.x[s.numh] == F.x && s.y[s.numh] == F.y) {
F.born(x-2, y-2);
s.eat();
while (s.foodself(F.x, F.y) == 0) {
F.born(x - 2, y - 2);
s.eat();
}
}
if (s.eatself() == 0)
return s.length;
if (s.x[s.numh] == 0 || s.x[s.numh] == x-1 || s.y[s.numh] == 0 || s.y[s.numh] == y-1)
return s.length;
Sleep(rate);
}
char ch;
ch = _getch();
s.Dir_change(ch);
rate = rate * 100 / 101;
}
}
void menu() {
Map m;
m.Map_Create(21, 10);
go(1, 1);
printf(" 贪吃蛇 ");
go(1, 3);
printf(" 小骚逼若谷 ");
go(1, 4);
printf("1 小地图");
}
void fail() {
}
int main() {
int score=game(41, 20, 100);
system("cls");
printf("失败,score=%d",score);
return 0;
}