바둑돌 가로 세로 개수 출력 프로그램

seungdam의 이미지

#include <iostream>
#include <string.h>
#include <windows.h>
 
using namespace std;
 
enum color {EMPTY , WHITE , BLACK};
 
struct Point {
	int x;
	int y;
};
 
void draw(int[][10]);
 
void cnt(int [][10], int a, int b);
 
void draw(int arr[][10]) {
	system("cls");
	for (int i = 0; i < 10; ++i) {
		for (int k = 0; k < 10; ++k) {
			if (arr[i][k] == EMPTY) {
				std::cout << "□";
			}
			else if (arr[i][k] == BLACK) { // 검은돌
				std::cout << "●";
			}
			else if (arr[i][k] == WHITE) { // 흰돌
				std::cout << "▲";
			}
			else if (arr[i][k] == 9) {
				std::cout << "★";
			}
		}
		std::cout << std::endl;
	}
}
 
void gotoxy(int, int);
 
void gotoxy(int x, int y) {
	COORD Pos = { x, y };
 
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
 
 
int main() 
{
	int CheckerBoard[10][10] = { 0 };
	int ChangeBoard[10][10] = { 0 };
	int command;
	int turn = 0;
	int white_doll_w[10] = {0}; // 가로줄 흰돌
	int black_doll_w[10] = {0}; // 가로줄 검은돌
	int black_doll_h[10] = {0}; // 세로줄 흰돌
	int white_doll_h[10] = {0}; // 세로줄 검은돌
	Point doll;
 
	while (1)
	{	
		if (turn == 0) {
			std::cout << "검은돌 좌표 (0,0)~(9,9) : ";
			std::cin >> doll.x >> doll.y;
			std::cout << endl;
			if (CheckerBoard[9 - doll.y][doll.x] == EMPTY) {
				CheckerBoard[9 - doll.y][doll.x] = BLACK;
				turn = 1;
			}
			else {
				cout << "이미 돌 있는 자리" << endl;
				continue;
			}
		}
		else if (turn == 1) {
			std::cout << "흰돌 좌표 (0,0)~(9,9) : ";
			std::cin >> doll.x >> doll.y;
			std::cout << endl;
			if (CheckerBoard[9 - doll.y][doll.x] == EMPTY) {
				CheckerBoard[9 - doll.y][doll.x] = WHITE;
				turn = 0;
			}
			else {
				cout << "이미 돌 있는 자리" << endl;
				continue;
			}
		}
 
 
		// 끝자리 기억
		//몇번째 줄인지 기억
		// 사이개수가 몇개인지 센다  
 
		draw(CheckerBoard);
 
			// 가로줄 세기
			for (int i = 0; i < 10; ++i) {
				for (int k = 0; k < 10; ++k) {
					if (CheckerBoard[i][k] == BLACK) {
						++black_doll_w[i];
					}
					else if (CheckerBoard[i][k] == WHITE) {
						++white_doll_w[i];
					}
				}
			}
			// 세로줄 세기
			for (int i = 0; i < 10; ++i) {
				for (int k = 0; k < 10; ++k) {
					if (CheckerBoard[k][i] == BLACK) {
						++black_doll_h[i];
					}
					else if (CheckerBoard[k][i] == WHITE) {
						++white_doll_h[i];
					}
				}
			}
			for (int i = 0; i < 10; ++i) {
				gotoxy(20, i);
				cout << i + 1<< "번째 가로줄 검은돌 흰돌 개수 : " << black_doll_w[i]<< " , " << white_doll_w[i] << std::endl;
				gotoxy(0, 10 + i);
				cout << i + 1<< "번째 세로줄 검은돌 흰돌 개수 : " << black_doll_h[i] << " , " << white_doll_h[i] << std::endl;
			}
 
 
 
	}
 
}

제가만든 바둑판 가로 세로 줄마다 흰돌 검은돌 개수 세는 프로그램인데 돌 카운트가 첫번째는 괜찮다가 두번째 이후부터 이상하게 카운트가 되는데 뭐가문제인지 모르겠네요

세벌의 이미지

처음에는 잘 되고, 두번째부터 이상하다면?
처음 한 다음에 뭔가 초기화 작업을 해야 되는 데 그걸 놓치신 거 아닌가요?

리눅스용이면 테스트 해보려했더니... 엠에스 윈도 전용 프로그램이군요.

chanik의 이미지

매 턴마다 모든 돌에 대해 카운터를 증가시키고 있으므로
갯수가 누적되고 있습니다.

[1] 매 턴마다 갯수 세기 전에 카운터를 모두 초기화하거나,
[2] 카운터를 유지하되 새로 둔 돌만 카운터에 반영하면 되겠습니다.

[1]보다는 [2]가 경제적인 방법이겠고요.
매 턴마다 모든 돌 카운트하는 코드는 제거하고
돌 놓을때 해당 카운터만 올리도록 아래와 같이 수정하면 되겠네요.

#include <iostream>
#include <string.h>
#include <windows.h>
 
using namespace std;
 
enum color {EMPTY , WHITE , BLACK};
 
struct Point {
	int x;
	int y;
};
 
void draw(int[][10]);
 
void cnt(int [][10], int a, int b);
 
void draw(int arr[][10]) {
	system("cls");
	for (int i = 0; i < 10; ++i) {
		for (int k = 0; k < 10; ++k) {
			if (arr[i][k] == EMPTY) {
				std::cout << "□";
			}
			else if (arr[i][k] == BLACK) { // 검은돌
				std::cout << "●";
			}
			else if (arr[i][k] == WHITE) { // 흰돌
				std::cout << "▲";
			}
			else if (arr[i][k] == 9) {
				std::cout << "★";
			}
		}
		std::cout << std::endl;
	}
}
 
void gotoxy(int, int);
 
void gotoxy(int x, int y) {
	COORD Pos = { x, y };
 
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
 
 
int main() 
{
	int CheckerBoard[10][10] = { 0 };
	int ChangeBoard[10][10] = { 0 };
	int command;
	int turn = 0;
	int white_doll_w[10] = {0}; // 가로줄 흰돌
	int black_doll_w[10] = {0}; // 가로줄 검은돌
	int black_doll_h[10] = {0}; // 세로줄 흰돌
	int white_doll_h[10] = {0}; // 세로줄 검은돌
	Point doll;
 
	while (1)
	{	
		if (turn == 0) {
			std::cout << "검은돌 좌표 (0,0)~(9,9) : ";
			std::cin >> doll.x >> doll.y;
			std::cout << endl;
			if (CheckerBoard[9 - doll.y][doll.x] == EMPTY) {
				CheckerBoard[9 - doll.y][doll.x] = BLACK;
				// 돌 놓을 때 카운터도 변경
				++black_doll_w[9 - doll.y];
				++black_doll_h[doll.x];
				turn = 1;
			}
			else {
				cout << "이미 돌 있는 자리" << endl;
				continue;
			}
		}
		else if (turn == 1) {
			std::cout << "흰돌 좌표 (0,0)~(9,9) : ";
			std::cin >> doll.x >> doll.y;
			std::cout << endl;
			if (CheckerBoard[9 - doll.y][doll.x] == EMPTY) {
				CheckerBoard[9 - doll.y][doll.x] = WHITE;
				// 돌 놓을 때 카운터도 변경
				++white_doll_w[9 - doll.y];
				++white_doll_h[doll.x];
				turn = 0;
			}
			else {
				cout << "이미 돌 있는 자리" << endl;
				continue;
			}
		}
 
 
		// 끝자리 기억
		//몇번째 줄인지 기억
		// 사이개수가 몇개인지 센다  
 
		draw(CheckerBoard);
 
		// 가로줄 세기
		//for (int i = 0; i < 10; ++i) {
		//	for (int k = 0; k < 10; ++k) {
		//		if (CheckerBoard[i][k] == BLACK) {
		//			++black_doll_w[i];
		//		}
		//		else if (CheckerBoard[i][k] == WHITE) {
		//			++white_doll_w[i];
		//		}
		//	}
		//}
		// 세로줄 세기
		//for (int i = 0; i < 10; ++i) {
		//	for (int k = 0; k < 10; ++k) {
		//		if (CheckerBoard[k][i] == BLACK) {
		//			++black_doll_h[i];
		//		}
		//		else if (CheckerBoard[k][i] == WHITE) {
		//			++white_doll_h[i];
		//		}
		//	}
		//}
		for (int i = 0; i < 10; ++i) {
			gotoxy(20, i);
			cout << i + 1<< "번째 가로줄 검은돌 흰돌 개수 : " << black_doll_w[i]<< " , " << white_doll_w[i] << std::endl;
			gotoxy(0, 10 + i);
			cout << i + 1<< "번째 세로줄 검은돌 흰돌 개수 : " << black_doll_h[i] << " , " << white_doll_h[i] << std::endl;
		}
 
 
 
	}
 
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.