콘솔창 & 윈도우창

지그재그 출력

게임 개발 2024. 7. 3. 10:47
#define _CRT_SECURE_NO_WARNINGS 

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h>
#include <string.h>

void MoveDiagonal(int arr[][32], int *nextPosY, int *currPosX , int *num, int* nextPosX, int* currPosY)
{
	arr[*nextPosY][*nextPosX] = ++*num;
	*currPosX = *nextPosX;
	*currPosY = *nextPosY;
}

void main()
{
	int arr[32][32] = { 0 };
	arr[0][0] = 1;
	int N, num = 1;
	bool isCheck = false; // 트리거 변수 (꼭짓점을 지난 후)
	bool isRight = true;
	int currPosX = 0, currPosY = 0;
	int nextPosX = 0, nextPosY = 0;

	scanf("%d", &N);

	// 1. 밑에 중복 코드 최소화 (아예 같은 로직만)

	while (true)
	{
		// 우측 이동할 때
		if (isRight && currPosX + 1 < N && arr[currPosY][currPosX + 1] == 0)
		{
			// 우측 이동하기 위한 조건
			arr[currPosY][++currPosX] = ++num;

			while (1)
			{
				nextPosX = currPosX;
				nextPosY = currPosY;

				isCheck ? nextPosX++ : nextPosX--;
				isCheck ? nextPosY-- : nextPosY++;

				// 분기점 지나지 않았을 때 로직과 지났을 때 로직
				if (!isCheck && nextPosX >= 0 && nextPosY < N)
				{
					MoveDiagonal(arr,&nextPosY, &currPosX, &num, &nextPosX, &currPosY);;
				}
				else if (isCheck && nextPosX < N && nextPosY >= 0)
				{
					MoveDiagonal(arr, &nextPosY, &currPosX, &num, &nextPosX, &currPosY);
				}
				else break; // 해당 방향으로 더 그을 수 없을 때,
			}

			isRight = false;
		}
		else if (!isRight && currPosY + 1 < N && arr[currPosY + 1][currPosX] == 0)
		{
			
			arr[++currPosY][currPosX] = ++num;

			while (1)
			{
				nextPosX = currPosX;
				nextPosY = currPosY;

				isCheck ? nextPosX-- : nextPosX++;
				isCheck ? nextPosY++ : nextPosY--;

				if (!isCheck && nextPosX < N && nextPosY >= 0)
				{
					MoveDiagonal(arr, &nextPosY, &currPosX, &num, &nextPosX, &currPosY);
				}
				else if (isCheck && nextPosY < N && nextPosX >= 0)
				{
					MoveDiagonal(arr, &nextPosY, &currPosX, &num, &nextPosX, &currPosY);
				}
				else break; // 해당 방향으로 더 그을 수 없을 때,
			}
			isRight = true;
		}
		else if (!isCheck)
		{
			isCheck = true;
			isRight = !isRight;
		}
		else break;
	}

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%3d", arr[i][j]);
		}
		printf("\n");
	}
}

'콘솔창 & 윈도우창' 카테고리의 다른 글

time rand()을 쓰지 않은 아이템 가차 구현  (0) 2024.08.01
야구 게임  (0) 2024.07.08
배열 가로 세로 값 구하기  (0) 2024.07.04
로또 번호 생성 프로그램  (0) 2024.06.27