📄 application.cpp
字号:
#include "Application.h"
#include <iostream>
#include <string>
const char CHESS_BLANK = 3;
const char CHESS_QUEEN = 'Q';
const char CHESS_DANGER = '1';
const char CHESS_WALL = '2';
const int ROW = 8;
const int COLUMN = 8;
const int MAX = 64;
char grid[ROW][COLUMN];
int p[MAX][2];
Position start;
int count=0;
int x=0, y=0;
struct itrFields
{
int row, column, direction, dom;
};
void Application::over()
{
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COLUMN;j++)
if (grid[i][j]==CHESS_DANGER)
grid[i][j]=CHESS_BLANK;
}
}
void Application::print()
{
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COLUMN;j++)
cout<<grid[i][j]<<' ';
cout<<endl;
}
}
Position Application::generateInitialState()
{
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COLUMN;j++)
grid[i][j]=CHESS_BLANK;
}
const string START_PROMPT = "Please enter the start position: ";
int row, column;
cout<<START_PROMPT;
cin>>row>>column;
start.setPosition(row, column);
return start;
}
bool Application::valid(const Position& pos)
{
if (pAvalid(pos.getRow(), pos.getColumn())&&grid[pos.getRow()][pos.getColumn()]!=CHESS_DANGER
&&grid[pos.getRow()][pos.getColumn()]!=CHESS_QUEEN
&&grid[pos.getRow()][pos.getColumn()]!=CHESS_WALL) return true;
else return false;
}
void Application::record(const Position& pos)
{
confirmDanger(pos.getRow(), pos.getColumn());
grid[pos.getRow()][pos.getColumn()]=CHESS_QUEEN;
p[count][0]=pos.getRow();
p[count][1]=pos.getColumn();
count++;
x=0;
cout<<"make: "<<pos.getRow()<<' '<<pos.getColumn()<<endl;
print();
// confirmDanger(pos.getRow(), pos.getColumn());
}
bool Application::done()
{
if (count==8) return true;
else return false;
}
void Application::undo(const Position& pos)
{
// grid[pos.getRow()][pos.getColumn()]=CHESS_WALL;
p[count][0]=0;
p[count][1]=0;
count--;
cancelDanger(pos.getRow(), pos.getColumn());
for(int i=0;i<count;i++)
{
confirmDanger(p[i][0], p[i][1]);
}
for(int j=0;j<count;j++)
{
grid[p[j][0]][p[j][1]]=CHESS_QUEEN;
}
grid[pos.getRow()][pos.getColumn()]=CHESS_WALL;
for(int t=0;t<ROW;t++)
{
if(grid[t][pos.getColumn()+1]==CHESS_WALL) grid[t][pos.getColumn()+1]=CHESS_BLANK;
}
// x=0;
cout<<"cancel: "<<pos.getRow()<<' '<<pos.getColumn()<<endl;
print();
}
ostream& operator<<(ostream& stream, Application& app)
{
cout<<endl;
for(int row=0;row<ROW;row++)
{
for(int column=0;column<COLUMN;column++)
cout<<grid[row][column]<<' ';
cout<<endl;
}
return stream;
}
Application::Iterator::Iterator(Position& pos)
{
itrFields* itrPtr=new itrFields;
itrPtr->row=pos.getRow();
itrPtr->column=pos.getColumn()+1;
itrPtr->direction=0;
itrPtr->dom=0;
fieldPtr=itrPtr;
}
void Application::confirmDanger(int r, int c)
{
int i=0;
int dRow1=0, dColumn1=0;
int dRow2=0, dColumn2=0;
int dRow3=0, dColumn3=0;
int dRow4=0, dColumn4=0;
while(i<ROW)
{
grid[r][i]=CHESS_DANGER;
if (grid[i][c]!=CHESS_WALL) grid[i][c]=CHESS_DANGER;
i++;
}
for(int j=1;j<ROW;j++)
{
if (pAvalid(r-j, c-j)&&grid[r-j][c-j]!='Q') grid[r-j][c-j]=CHESS_DANGER;
if (pAvalid(r-j, c+j)&&grid[r-j][c+j]!='Q') grid[r-j][c+j]=CHESS_DANGER;
if (pAvalid(r+j, c-j)&&grid[r+j][c-j]!='Q') grid[r+j][c-j]=CHESS_DANGER;
if (pAvalid(r+j, c+j)&&grid[r-j][c+j]!='Q') grid[r+j][c+j]=CHESS_DANGER;
}
}
void Application::cancelDanger(int r, int c)
{
int i=0;
int dRow1=0, dColumn1=0;
int dRow2=0, dColumn2=0;
int dRow3=0, dColumn3=0;
int dRow4=0, dColumn4=0;
while(i<ROW)
{
grid[r][i]=CHESS_BLANK;
grid[i][c]=CHESS_BLANK;
i++;
}
for(int j=1;j<ROW;j++)
{
if (pAvalid(r-j, c-j)&&grid[r-j][c-j]!='Q') grid[r-j][c-j]=CHESS_BLANK;
if (pAvalid(r-j, c+j)&&grid[r-j][c+j]!='Q') grid[r-j][c+j]=CHESS_BLANK;
if (pAvalid(r+j, c-j)&&grid[r+j][c-j]!='Q') grid[r+j][c-j]=CHESS_BLANK;
if (pAvalid(r+j, c+j)&&grid[r-j][c+j]!='Q') grid[r+j][c+j]=CHESS_BLANK;
}
}
bool Application::pAvalid(int r, int c)
{
if (r>=0&&r<ROW&&c>=0&&c<COLUMN) return true;
else return false;
}
Position Application::Iterator::operator++(int)
{
itrFields* itrPtr=(itrFields*)fieldPtr;
int nextRow = itrPtr->row;
int nextColumn = itrPtr->column;
Position p((itrPtr->dom)++,nextColumn);
return p;
}
bool Application::Iterator::atEnd()
{
return ((itrFields*)fieldPtr)->dom>7;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -