DrawLogic


  • RowとColの抽象オブジェクトとしてのLine作成
    • ある場所からいくつ黒が連続しているか
    • ある場所からいくつ白が連続しているか
    • ある場所からいくつ空白が連続しているか

DrawLogic.cpp

#include "DrawLogic.h"

void DrawLogic::getCol(Square square, int colNum, Square::scaleStatus result[Square::yScaleLen?]) {

	for(int y=Square::yScaleMin; y<=Square::yScaleMax; y++) {
		result[y- Square::yScaleMin] = 
			square.get(colNum - Square::xScaleMin,y - Square::yScaleMin);
	}

} /* void DrawLogic::getCol(Square::scaleStatus square[Square::xScaleLen?][Square::yScaleLen?] ,

		int colNum, Square::scaleStatus result[Square::yScaleLen]) {
	for(int y=Square::yScaleMin; y<=Square::yScaleMax; y++) {
		result[y- Square::yScaleMin] = 
			square[colNum - Square::xScaleMin][y - Square::yScaleMin];
	}

}

void DrawLogic::getRow(Square::scaleStatus square[Square::xScaleLen?][Square::yScaleLen?] ,int rowNum, Square::scaleStatus result[Square::xScaleLen?]) {

	for(int x=Square::xScaleMin; x<=Square::xScaleMax; x++) {
		result[x- Square::xScaleMin] = square[x - Square::xScaleMin][rowNum - Square::yScaleMin];
	}

}

/

void DrawLogic::getColCond?(int colCond[Square::xScaleLen?][Square::condLen] ,

		int colNum, int result[Square::condLen]) {
	for(int i=0; i<Square::condLen; i++) {
		result[i] = colCond[colNum - Square::xScaleMin][i];
	}

} void DrawLogic::getRowCond?(int rowCond[Square::yScaleLen?][Square::condLen] ,

		int rowNum, int result[Square::condLen]) {
	for(int i=0; i<Square::condLen; i++) {
		result[i] = rowCond[rowNum - Square::yScaleMin][i];
	}

}

void DrawLogic::printCol(Square square) {

	printf("print getCol \n");
	for(int x=Square::xScaleMin; x<=Square::xScaleMax; x++) {
		for(int y=Square::yScaleMin; y<=Square::yScaleMax; y++) {
			printf("%d",square.get(x - Square::xScaleMin,y - Square::yScaleMin));
		}
		printf("\n");
	}

}

void DrawLogic::printRow(Square square) {

	printf("print getRow \n");
	for(int y=Square::yScaleMin; y<=Square::yScaleMax; y++) {
		Square::scaleStatus row[Square::xScaleLen];
		for(int x=Square::xScaleMin; x<=Square::xScaleMax; x++) {
			printf("%d",square.get(x - Square::xScaleMin,y - Square::yScaleMin));
		}
		printf("\n");
	}

}

int DrawLogic::getMinXLen(Square::scaleStatus column[Square::xScaleLen?],

		int cond[Square::condLen]) {
	int pos = Square::xScaleMin;
	int result = 0;
	for(int i=0; i<Square::condLen; i++) {
		if(cond[i] == 99) break;
		result += cond[i];
		if(i > 0) {
			result++;
		}
	}
	return result;

}

void DrawLogic::sub() {

	// 盤の初期化
	printf("init init Square \n");
	Square::scaleStatus square[Square::xScaleLen][Square::yScaleLen];
	printf("bbbbbbbb \n");
	Square sq;
	//initSquare2(sq) NG;
	//
	//void DrawLogic::initSquare2(Square square) {
	//	square.init();
	//}
	sq.init();
	printf("init Condition \n");
	// 条件の初期化
	//-99	条件要素の終了
	int colCond[Square::xScaleLen][Square::condLen]
		= {{1,99,99},{3,1,99},{1,1,99},{5,99,99},{1,99,99}};
	int rowCond[Square::yScaleLen][Square::condLen]
		= {{1,1,99},{5,99,99},{1,1,99},{1,99,99},{3,99,99}};
	printf("start stuff col \n");
	// column方向の埋め込み開始
	for(int y=Square::yScaleMin; y<=Square::yScaleMax; y++) {
		int pos = Square::xScaleMin;
		int cond = rowCond[y-Square::yScaleMin][0];
		printf("cond : %d \n",cond);
		int r = pos + cond - Square::xScaleMin;
		int l = Square::xScaleMax - cond + Square::xScaleMin;
		printf("r=%d : l=%d \n",r,l);
		if(r >= l) {
			for(int x=l; x<=r; x++) {
				sq.set(x-Square::xScaleMin,y-Square::yScaleMin);
			}
		}
	}
	printf("start stuff row \n");
	// row方向の埋め込み開始
	for(int x=Square::xScaleMin; x<=Square::xScaleMax; x++) {
		int pos = Square::yScaleMin;
		int cond = colCond[x-Square::xScaleMin][0];
		printf("cond : %d \n",cond);
		int r = pos + cond - Square::yScaleMin;
		int l = Square::yScaleMax - cond + Square::yScaleMin;
		printf("r=%d : l=%d \n",r,l);
		if(r >= l) {
			for(int y=l; y<=r; y++) {
				sq.set(x-Square::xScaleMin,y-Square::yScaleMin);
			}
		}
	}
	printf("print square result \n");
	//結果表示
	for(int y=Square::yScaleMin; y<=Square::yScaleMax; y++) {
		for(int x=Square::xScaleMin; x<=Square::xScaleMax; x++) {
			printf("%d\t",sq.get(x-Square::xScaleMin,y-Square::yScaleMin));
		}
		printf("\n");
	}
	printCol(sq);
	printRow(sq);
	printf("print getMinXLen \n");
	for(int x=Square::xScaleMin; x<=Square::xScaleMax; x++) {
		Square::scaleStatus col[Square::yScaleLen];
		//getCol(square, x, col);
		getCol(sq, x, col);
		int cond[Square::condLen];
		getColCond(colCond ,x , cond);
		int min = getMinXLen(col, cond);
		printf("%d \n",min);
	}

}

void main() {

	DrawLogic d;
	d.sub();

}


DrawLogic.h

#include <stdio.h>

#include "Square.h"

class DrawLogic {

	public:
		void getCol(Square square,int colNum, Square::scaleStatus result[Square::yScaleLen]);
		//void getCol(Square::scaleStatus square[Square::xScaleLen][Square::yScaleLen] ,int colNum, Square::scaleStatus result[Square::yScaleLen]);
		void getRow(Square::scaleStatus square[Square::xScaleLen][Square::yScaleLen] ,int rowNum, Square::scaleStatus result[Square::xScaleLen]);
		void getColCond(int colCond[Square::xScaleLen][3] ,int colNum, int result[Square::condLen]); 
		void getRowCond(int rowCond[Square::yScaleLen][3] ,int rowNum, int result[Square::condLen]);
		void printCol(Square square);
		void printRow(Square square);
		int getMinXLen(Square::scaleStatus column[Square::xScaleLen], int cond[3]);
		void DrawLogic::sub();

};


Square.h

#include <stdio.h>

class Square {

	public:
		static const int xScaleMin = 1;
		static const int yScaleMin = 1;
		static const int xScaleMax = 5;
		static const int yScaleMax = 5;
		static const int xScaleLen = xScaleMax - xScaleMin + 1;
		static const int yScaleLen = yScaleMax - yScaleMin + 1;
		static const int condLen = 3;
		static int getXScaleMin();
		static int getYScaleMin();
		static int getXScaleMax();
		static int getYScaleMax();
		static int getXScaleLen();
		static int getYScaleLen();
		static int getCondLen();
	//protected:
		typedef enum _scaleStatus {
			unknown = 0,	//空白、未決定状態
			white   = 1,	//区切り、決定状態
			black   = 2	//塗りつぶし、決定状態
		} scaleStatus;               
	private:
		scaleStatus field[xScaleLen][yScaleLen];
	public:
		void init();
		void set(int x,int y);
		scaleStatus get(int x,int y);

};


Square.cpp

#include "Square.h"

int Square::getXScaleMin?() { return Square::xScaleMin?; } int Square::getYScaleMin?() { return Square::yScaleMin?; } int Square::getXScaleMax?() { return Square::xScaleMax?; } int Square::getYScaleMax?() { return Square::yScaleMax?; } int Square::getXScaleLen?() { return Square::xScaleLen?; } int Square::getYScaleLen?() { return Square::yScaleLen?; } int Square::getCondLen?() { return Square::condLen; }

void Square::init() {

	printf("*********************************************** \n");
	printf("Square::init \n");
	printf("*********************************************** \n");
	for(int y=getYScaleMin(); y<=getYScaleMax(); y++) {
		for(int x=getXScaleMin(); x<=getXScaleMax(); x++) {
			field[x-xScaleMin][y-yScaleMin] = unknown;
		}
	}
	for(int y=Square::yScaleMin; y<=Square::yScaleMax; y++) {
		for(int x=Square::xScaleMin; x<=Square::xScaleMax; x++) {
			printf("%d\t",get(x-Square::xScaleMin,y-Square::yScaleMin));
		}
		printf("\n");
	}

}

Square::scaleStatus Square::get(int x,int y) {

	return field[x][y];

} void Square::set(int x,int y) {

	printf("Square::set x,y: %d , %d \n",x,y);
	field[x][y] = black;

}