留了 一个bug就是 电脑解决完后 会多打印几个矩阵。
改进的地方,1:增加了一种电脑解法,
2:记录用了自增栈
#include"c.h"
#include"c++.h"
#define MAX 5
#define N 10
typedef int elem_type;
class Stack
{
public:
Stack()
{
top = 0;
size = N;
data = new elem_type[size];
}
~Stack()
{
top = 0;
delete []data;
data = NULL;
}
void IncSize()
{
size = 2*size;
elem_type *p = new elem_type[size];
memcpy(p,data,sizeof(elem_type)*top);
delete []data;
data = p;
}
bool push(elem_type value)
{
if(isfull())
{
IncSize();
}
data[top++] = value;
return true;
}
int gettop()//得到栈顶元素
{
return data[--top];
}
bool isfull()//判断是否已满
{
return top == size;
}
private:
elem_type* data;
int top;
int size;
};
int show(int arr[][MAX])
{ int count=0;
for(int i=0;i<MAX;i++)
{
for(int j=0;j<MAX;j++)
{
if(arr[i][j]==1)count=1;
cout<<arr[i][j]<< " ";
}
cout<<endl;
}
cout<<endl;
return 0;
}
void play(int arr[][MAX],int x,int y)
{
if(x < 0 || y < 0 || x >= MAX || y >= MAX)
{
return ;
}
arr[x][y] = 1 -arr[x][y];
if(x-1 >= 0)
{
arr[x-1][y] = 1 - arr[x-1][y];
}
if(x+1 < MAX)
{
arr[x+1][y] = 1 - arr[x+1][y];
}
if(y-1 >= 0)
{
arr[x][y-1] = 1 - arr[x][y-1];
}
if(y+1 < MAX)
{
arr[x][y+1] = 1 - arr[x][y+1];
}
}
int cheack(int a[][MAX],int i)
{
int j = 0,state=0;;
while(j++ < MAX)
{
if(a[i][0] == 1){play(a,i,0);show(a);state=1;}
if(a[i][4] == 1){play(a,i,4);show(a);state=1;}
if(a[i][j] == 1){ break;}
}
if(state==0) { play(a,i,j);show(a);state=1;}
return state;
}
int cp2(int a[][MAX])
{ int state=1,i=0,j=0;
show(a);
while(state)
{ state=cheack(a,i);
for(i=0;i<MAX-1;i++)
{
for(j=0;j<MAX;j++)
if(a[i][j]==1){play(a,i+1,j);show(a);}
}
state=cheack(a,i);
for(i=MAX-1;i>0&&state;i--)
{
for(j=MAX-1;j>=0;j--)
if(a[i][j]==1){play(a,i-1,j);show(a);}
}
state=show(a);
}
cout << "over" << endl;
return 0;
}
void cp(int v[][MAX],Stack &s)
{
int y=s.gettop();
int x=s.gettop();
play(v,x,y);show(v);
cout<<"电脑显示完毕 系统已退出 "<<endl;
}
static int cc=1;
int player()
{
while(cc)
{
Stack s;//建立一个栈
int v[MAX][MAX] = {0};
int x,y;
int k=3,i=0;
int state=1;
time_t t;
srand((unsigned)time(&t));
k=rand()%5+1;
cout<<"熄灯前睡觉 欢迎来到第 "<<cc<<" 关"<<endl;
cc++;
while(i++<k)
{
x=rand()%5;
y=rand()%5;
s.push(x); s.push(y);
play(v,x,y);
}
show(v);
while( state)
{ cout<<"熄灯前睡觉 输入坐标(x,y),(0,0)退出"<<endl;
cin>>x>>y;
if(x==0&&y==0)cc=0;
x=x-1;y=y-1;
if(x>-1&&x<5&&y>-1&&y<5)
{ i++; s.push(x); s.push(y);
if(i++==100)
{ cout<<"电脑显示完毕 玩家步数太多,系统已退出 "<<endl;state=0;}
play(v,x,y); show(v);
}
if(x+y>10&&x+y<20){ cp(v,s);state=0;}
if(x+y>20)cp2(v);
}
}
}
int main()
{
cout<<"***************************************"<<endl;
cout<<" 欢迎参与点灯游戏 "<<endl<<" 由wzzx提供"<<endl;
cout<<" 游戏过程中输入x+y大于10时可以选择电脑演示求解步骤 "<<endl;
cout<<"***************************************"<<endl;
player();
return 0;
}
点灯游戏的模拟
最新推荐文章于 2023-05-20 13:47:02 发布