⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 application.cpp

📁 8皇后
💻 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 + -