#include <windows.h>
#include <conio.h>
#include <iostream>
#include<time.h>
#include<stdio.h>
#define jie 8 ///偶数
using namespace std;
HANDLE hout;
int X=0,Y=0,a,b,i=0,type;///xy记录当前坐标,ab记录上一个按下的坐标,i记录按下次数,type记录上一个的类型
void gotoxy(int x,int y)
{
COORD coord; ///屏幕上的坐标
CONSOLE_SCREEN_BUFFER_INFO csbi; ///控制台屏幕缓冲区信息GetConsoleScreenBufferInfo(hout,&csbi);
coord.X=csbi.dwCursorPosition.X; ///得到坐标X的值
coord.Y=csbi.dwCursorPosition.Y; ///得到坐标Y的值
coord.X=x+2;
coord.Y=y+2;
SetConsoleCursorPosition(hout,coord);
}
class tu
{
private :
int gg[jie][jie];
public :
///构造函数
void dayin();///打印现状
void shubiaoyidong();
tu();
void jieshu();
};
void panduan(int tu[jie][jie],int m,int n,int x,int y)///m代表次数,n的0123代表方向
{
if(!m)
return;
if(x==a&&y==b)
{
tu[X][Y]=-1;
tu[a][b]=-1;
return;
}
if(y-1>=0)///上0
{
if(tu[x][y-1]==-1||(x==a&&y-1==b))
{
if(n!=0)
panduan(tu,m-1,0,x,y-1);
else
panduan(tu,m,0,x,y-1);
}
}
if(y+1<jie)///下1
{
if(tu[x][y+1]==-1||(x==a&&y+1==b))
{
if(n!=1)
panduan(tu,m-1,1,x,y+1);
else
panduan(tu,m,1,x,y+1);
}
}
if(x-1>=0)///左2
{
if(tu[x-1][y]==-1||(x-1==a&&y==b))
{
if(n!=2)
panduan(tu,m-1,2,x,y);
else
panduan(tu,m,2,x-1,y);
}
}
if(x+1<jie)///右3
{
if(tu[x+1][y]==-1||(x+1==a&&y==b))
{
if(n!=3)
panduan(tu,m-1,3,x+1,y);
else
panduan(tu,m,3,x+1,y);
}
}
}
void zhuanhua(int a)
{
switch(a)
{
case 0:cout<<"*";break;
case 1:cout<<"@";break;
case 2:cout<<"#";break;
case 3:cout<<"$";break;
case 4:cout<<"%";break;
case 5:cout<<"&";break;
case -1:cout<<" ";break;
default:
gotoxy(15,15);
cout<<"false";
}
}
void tu::jieshu()
{
int i,j;
for(i=0;i<jie;i++)
for(j=0;j<jie;j++)
if(gg[i][j]!=-1)
return;
gotoxy(15,15);
cout<<"you win";
}
tu::tu()
{
int m=(jie-2)*(jie-2)/6;///m为最多出现的图形数量
int n[6],t;///为已经出现的图形数量
srand((unsigned) time(NULL));
int i,j;
for(i=0;i<6;i++)
n[i]=0;
for(i=0;i<jie;i++)
gg[0][i]=-1;
for(i=1;i<jie;i++)
gg[i][0]=-1;
for(i=0;i<jie;i++)
gg[jie-1][i]=-1;///jie减一
for(i=0;i<jie;i++)
gg[i][jie-1]=-1;
for(i=1;i<jie-1;i++)
{
for(j=1;j<jie-1;j++)
{
t=rand()%6;
n[t]++;
if(n[t]<=m)///限制出现次数,为<=
gg[i][j]=t;
else
--j;
}
}
gotoxy(10,15);
cout<<"use w a s d to move,use y to pick";
}
void tu::dayin()
{
int i,j;
for(i=0;i<jie;i++)
{
for(j=0;j<jie;j++)
{
gotoxy(i,j);
zhuanhua(gg[i][j]);
}
cout<<"\n";
}
}
void tu::shubiaoyidong()
{
gotoxy(X,Y);
char ch;
ch=getch();
switch(ch)
{
case 'w':
Y-=1;
gotoxy(X,Y);
break;
case 'a':
X-=1;
gotoxy(X,Y);
break;
case 's':
Y+=1;
gotoxy(X,Y);
break;
case 'd':
X+=1;
gotoxy(X,Y);
break;
case 'y':
i++;
if(i%2)
{
type=gg[X][Y];
a=X;
b=Y;
gotoxy(15,10);
cout<<"the figure you has picked:";
zhuanhua(type);
gotoxy(X,Y);
}
if((i+1)%2)
{
gotoxy(15,10);
cout<<" ";
if(a!=X||b!=Y)///注意此处是逻辑或
{
if(type==gg[X][Y])
{
for(int i=0;i<4;i++)
panduan(gg,3,i,X,Y);
}
}
}
break;
default:
gotoxy(15,15);
cout<<"false";
}
}
int main(void)
{
hout=GetStdHandle(STD_OUTPUT_HANDLE);
tu dota;
dota.dayin();
while(1)
{
dota.shubiaoyidong();
dota.dayin();
dota.jieshu();
}
}