Dart 언어 기초 369게임

ssh·2023년 11월 29일

오름캠프

목록 보기
3/3

학원의 과제로 369게임을 만들어보았다

요구사항

4명의 플레이어가 참가
플레이어는 차례대로 순서가 돌아가며
30의 배수는 ahh 출력
3의 배수에는 clap 출력
10의 배수는 rool을
나머지는 숫자를 출력

3개의 문자들이 서로 겹치지 않도록 출력
1.ahh
2.clap
3.rool
3개의 조건이 서로 겹칠때 ahh만 우선적으로 출력되도록 하고 ahh가 없으면 clap clap이 없으면 rool이 출력되도록 한다.

범위 : 1에서 100까지의 숫자

clap, rool, ahh 각각의 총 개수 출력
각각의 플레이어들이 clap을 몇 번 했는지 출력
가장 많은 clap을 한 player를 출력

1. 4명의 플레이어 리스트를 생성한다.

List<String> players = List.generate(4, (int index) {
  return 'player${index + 1}';
});

- List.generate()

람다식 적용

List<String> players = List.generate(4, (index) => 'player${index + 1}');

람다식 풀어서

List<String> players = List.generate(4, (int index) {
  return 'player${index + 1}';
});

List.generate 함수는 Dart 언어에서 사용되는 리스트를 생성하는 함수다.
이 함수로 지정된 길이의 리스트를 생성할 수 있다.

2. 변수를 초기화한다.

int playerIndex = 0;
List<int> clapCountsPlayer = List.filled(players.length, 0, growable: true);
String? maxClapsPlayer;
int maxClaps = 0;
int clapCount = 0;
int roolCount = 0;
int ahhCount = 0;

각각의 clap, rool, ahh의 횟수와 각각의 플레이어가 친 clap의 횟수, 최대 clap의 횟수 저장하기 위한 변수들을 초기화한다.

- List.filled()

List.filled 메소드는 Dart 언어에서 사용되는 리스트를 생성하고 초기값으로 모든 항목을 채우는 메소드이다.

3. 1~100까지 반복한다

for (int i = 1; i <= 100; i++) {
  ...
}

- for문

for문은 어떤 명령문들을 반복하고자 할 때 사용하는 제어문 형식 중 하나다.

for (초기화; 조건; 증감) {
  // 반복할 코드 블록
}

초기화: 반복을 시작하기 전에 한 번 실행되는 부분
조건: 각 반복에서 실행 전에 평가되는 부분으로, true일 경우 반복이 계속됨.
증감: 각 반복이 끝난 후에 실행되는 부분

사용예시

for (int i = 0; i < 5; i++) {
  print('현재 인덱스: $i');
}

4. 30, 3, 10의 배수일때 조건문 작성

 // 30의 배수
    if (i % 30 == 0) {
      output += 'ahh';
      ahhCount++; // 횟수 카운트
    } else if (i % 3 == 0) {
      // 3의 배수
      output += 'clap';
      clapCount++; // 횟수 카운트
    } else if (i % 10 == 0) {
      // 10의 배수
      output += 'rool';
      roolCount++; // 횟수 카운트
    }
    // ahh, clap, rool이 아닐때는 숫자를 출력
    if (output.isEmpty) {
      output = i.toString();
    }

- if-else문

if-else 문은 프로그래밍 언어에서 조건에 따라 다른 코드 블록을 실행하는 데 사용되는 제어 구조 중 하나다.

if (조건1) {
	// 실행될 코드
} else if (조건2) {
	// 실행될 코드
} else if (조건3) {
	// 실행될 코드
} else {
	// 실행될 코드
}

if 조건문은 위와 같이 if 그리고 조건이 또 있을 경우 else if 를 필요한 만큼 사용하며, 그 외의 조건은 else를 사용한다. if 조건에서 필수는 if 문이며, else if와 else는 사용하지 않아도 작동이 가능하지만, 만약 써야 된다면 if -> else if -> else 혹은 if -> else 혹은 if -> else if 를 써야 한다.

- ++ 증감연산자

++는 변수의 값을 1씩 증가시키는 연산자다.

int x = 5;
x++;  // x의 값을 1 증가시킴
print(x);  // 출력 결과: 6

위의 예제에서 x++는 x의 값을 1만큼 증가시킨다.

5. clap, rool, ahh 각각의 총 개수

저장된 clap, rool, ahh의 개수들을 출력한다.

// clap, rool ahh 각각의 총 개수
  print('\nclap의 총 개수: $clapCount');
  print('rool의 총 개수: $roolCount');
  print('ahh의 총 개수: $ahhCount\n');

6. 현재 플레이어의 clap 횟수를 저장

clap의 조건문에서 각각의 플레이어들이 clap을 치는 횟수를
플레이어의 clap 횟수를 저장하는 리스트인 clapCountsPlayer에 저장한다.
playerIndex는 현재 플레이어의 인덱스를 나타낸다.
clapCountsPlayer[playerIndex]++;는 현재 플레이어의 clap 횟수를 1 증가시키는 것이다.

 // 30의 배수
    if (i % 30 == 0) {
      output += 'ahh';
      ahhCount++; // 횟수 카운트
    } else if (i % 3 == 0) {
      // 3의 배수
      output += 'clap';
      clapCount++; // 횟수 카운트

      clapCountsPlayer[playerIndex]++; // 현재 플레이어의 clap 횟수를 저장
     
    } else if (i % 10 == 0) {
      // 10의 배수
      output += 'rool';
      roolCount++; // 횟수 카운트
    }

    // ahh, clap, rool이 아닐때는 숫자를 출력
    if (output.isEmpty) {
      output = i.toString();
    }

7. clap 횟수를 가장 많이한 플레이어 찾기

가장 많은 clap을 한 플레이어를 찾아내기 위한 로직이다.
각 플레이어의 clap 횟수를 저장하는 clapCountsPlayer 리스트와 현재 플레이어의 인덱스를 나타내는 playerIndex를 사용하여 비교하고, 만약 현재 플레이어의 clap 횟수가 최대 횟수인 maxClaps보다 크다면 최대 횟수와 그 플레이어의 이름을 업데이트한다.

 // 30의 배수
    if (i % 30 == 0) {
      output += 'ahh';
      ahhCount++; // 횟수 카운트
    } else if (i % 3 == 0) {
      // 3의 배수
      output += 'clap';
      clapCount++; // 횟수 카운트

      clapCountsPlayer[playerIndex]++; // 현재 플레이어의 박수 횟수를 증가
      // 가장 많은 clap을 한 플레이어
      if (clapCountsPlayer[playerIndex] > maxClaps) {
        maxClaps = clapCountsPlayer[playerIndex];
        maxClapsPlayer = players[playerIndex];
      }
    } else if (i % 10 == 0) {
      // 10의 배수
      output += 'rool';
      roolCount++; // 횟수 카운트
    }

    // ahh, clap, rool이 아닐때는 숫자를 출력
    if (output.isEmpty) {
      output = i.toString();
    }

전체코드

///  4명의 플레이어가 참가
///  플레이어는 차례대로 순서가 돌아가며
///  30의 배수는 ahh 출력
///  3의 배수에는 clap 출력
///  10의 배수는 rool을
///  나머지는 숫자를 출력
///
///  범위 : 1에서 100까지
///
///  clap, rool, ahh 각각의 총 개수 출력
///  각각의 플레이어들이 clap을 몇 번 했는지 출력
///  가장 많은 clap을 한 player를 출력

void main() {
  // 4명의 플레이어 리스트
  List<String> players = List.generate(4, (index) => 'player${index + 1}');

  int playerIndex = 0; // 플레이어 인덱스 저장하는 변수

  List<int> clapCountsPlayer =
      List.filled(players.length, 0, growable: true); // players의 리스트 크기가 변경된다면 자동으로 리스트의 크기가 조정, growable이 true일 경우 목록 동적 크기 조절, flase일 경우 크기 조절 x

  String? maxClapsPlayer; // 가장 많이 clap한 플레이어를 저장하는 변수

  int maxClaps = 0; // 가장 많은 clap 횟수 저장하는 변수

  // clap, rool, ahh 각각의 전체 횟수 저장하는 변수
  int clapCount = 0;
  int roolCount = 0;
  int ahhCount = 0;

  // 1~100까지 반복
  for (int i = 1; i <= 100; i++) {
    String output = '';

    // 30의 배수
    if (i % 30 == 0) {
      output += 'ahh';
      ahhCount++; // 횟수 카운트
    } else if (i % 3 == 0) {
      // 3의 배수
      output += 'clap';
      clapCount++; // 횟수 카운트

      clapCountsPlayer[playerIndex]++; // 현재 플레이어의 박수 횟수를 증가
      // 가장 많은 clap을 한 플레이어
      if (clapCountsPlayer[playerIndex] > maxClaps) {
        maxClaps = clapCountsPlayer[playerIndex];
        maxClapsPlayer = players[playerIndex];
      }
    } else if (i % 10 == 0) {
      // 10의 배수
      output += 'rool';
      roolCount++; // 횟수 카운트
    }

    // ahh, clap, rool이 아닐때는 숫자를 출력
    if (output.isEmpty) {
      output = i.toString();
    }

    String player = players[(i - 1) % players.length];
    print('$player: $output');

    // 플레이어 인덱스
    playerIndex = (playerIndex + 1) % players.length;
  }

  // clap, rool ahh 각각의 총 개수
  print('\nclap의 총 개수: $clapCount');
  print('rool의 총 개수: $roolCount');
  print('ahh의 총 개수: $ahhCount\n');

  // 각 플레이어의 clap 횟수 출력
  for (int i = 0; i < players.length; i++) {
    print('${players[i]}의 clap 횟수: ${clapCountsPlayer[i]}');
  }


  // 가장 많은 clap을 한 플레이어 출력
  print('\n가장 많은 clap한 플레이어: $maxClapsPlayer');
}

0개의 댓글