본문 바로가기
카테고리 없음

플러터와 다트를 이용한 OX 퀴즈 게임 개발

by Creative Developer 2023. 3. 6.

서론

OX 퀴즈 게임은 한국에서 유래된 간단한 게임입니다. 이 게임에서 플레이어는 질문을 받고 참이면 "O", 거짓이면 "X"라고 대답해야 합니다. 게임은 보통 한 그룹의 사람들과 함께 하는데, 가장 많은 질문에 정답을 맞추는 사람이 승자입니다. 이번에는 OX 퀴즈 게임 앱을 만드는 방법에 대해서 알아보겠습니다.

 

작업 프로세스

1. 원하는 IDE에 새 Fluter 프로젝트를 만듭니다.

2. pubspec.yaml 파일에 필요한 종속성을 추가합니다:

dependencies:
  flutter:
    sdk: flutter
  flutter_bloc: ^7.0.0
  equatable: ^2.0.0

 

3. OX 퀴즈 게임 화면에 사용할 새 파일을 만들고 필요한 종속성을 가져옵니다:

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:equatable/equatable.dart';

 

4. OX 퀴즈 게임의 새 state class를 만듭니다:

class OxQuizState extends Equatable {
  final bool isCorrect;

  OxQuizState({required this.isCorrect});

  @override
  List<Object?> get props => [isCorrect];
}

 

5. OX 퀴즈 게임의 새 event class를 만듭니다:

abstract class OxQuizEvent extends Equatable {
  @override
  List<Object?> get props => [];
}

class CheckAnswerEvent extends OxQuizEvent {
  final bool answer;

  CheckAnswerEvent({required this.answer});

  @override
  List<Object?> get props => [answer];
}

 

6. OX 퀴즈 게임의 새 Bloc class를 만듭니다:

class OxQuizBloc extends Bloc<OxQuizEvent, OxQuizState> {
  OxQuizBloc() : super(OxQuizState(isCorrect: false));

  @override
  Stream mapEventToState(OxQuizEvent event) async* {
    if (event is CheckAnswerEvent) {
      yield OxQuizState(isCorrect: event.answer);
    }
  }
}

 

7. OX 퀴즈 게임 화면의 UI를 만듭니다:

class OxQuizScreen extends StatelessWidget {
  final OxQuizBloc _bloc = OxQuizBloc();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('OX Quiz Game'),
      ),
      body: Center(
        child: BlocBuilder<OxQuizBloc, OxQuizState>(
          bloc: _bloc,
          builder: (context, state) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text(
                  state.isCorrect ? 'Correct' : 'Incorrect',
                  style: TextStyle(fontSize: 24),
                ),
                SizedBox(height: 16),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    ElevatedButton(
                      onPressed: () {
                        _bloc.add(CheckAnswerEvent(answer: true));
                      },
                      child: Text('O'),
                    ),
                    SizedBox(width: 16),
                    ElevatedButton(
                      onPressed: () {
                        _bloc.add(CheckAnswerEvent(answer: false));
                      },
                      child: Text('X'),
                    ),
                  ],
                ),
              ],
            );
          },
        ),
      ),
    );
  }
}

위의 코드의 각 부분을 단계별로 분석해 보겠습니다:

  • class OxQuizScreen extends StatelessWidget: 이 코드는 StatelessWidget을 상속하는 OxQuizScreen이라는 클래스를 정의합니다.
  • final OxQuizBloc _bloc = OxQuizBloc();: 이 줄은 OxQuizBlock의 새 인스턴스를 초기화하고 _block 변수에 할당합니다. 이는 OX 퀴즈 게임의 상태를 관리하는 비즈니스 로직 컴포넌트(BLoC)의 인스턴스입니다.
  • @override Widget build(BuildContext context) {: 이것은 플러터에 있는 StatelessWidget에 필요한 빌드 방법입니다. BuildContext 매개 변수를 사용하고 위젯을 반환합니다.
  • return Scaffold(...: 이 줄은 app bar, bottom navigation bar 및 body area과 같은 앱에 대한 기본적인 시각적 요소를 제공하는 convenience widget인 새로운 Scaffold 위젯을 반환합니다.
  • appBar: AppBar(title: Text('OX Quiz Game'),),: 이 코드는 "OX 퀴즈 게임"이라는 제목으로 app bar를 정의합니다.
  • body: Center(child: BlocBuilder<OxQuizBloc, OxQuizState>(..., 이 라인은 위젯의 본문을 정의합니다. 화면 중앙에 있으며 BlockBuilder 위젯이 포함되어 있습니다.
  • bloc: _bloc,: 이 줄은 BlocBuilder 위젯에서 사용할 OxQuizBlock 인스턴스를 설정합니다.
  • builder: (context, state) {...: 이것은 BuildContext와 현재 OxQuizState를 도입하는 builder 함수입니다. OxQuizBlock의 현재 상태에 따라 달라지는 위젯을 반환합니다.
  • Text(state.isCorrect ? 'Correct' : 'Incorrect', ...: 이 줄은 OxQuizState의 isCorrect 프로퍼티의 값을 기준으로 게임의 현재 상태를 "Correct" 또는 "Incorrect"로 표시합니다.
  • ElevatedButton(onPressed: () {..., 이것은 퀴즈 게임에 사용자의 답을 제출하는 데 사용되는 두 개의 ElevatedButton 위젯입니다. 사용자가 버튼 중 하나를 누르면 OxQuizBlock에 이벤트가 추가되어 게임 상태를 업데이트합니다.
  • SizedBox(height: 16),: 이 줄은 텍스트 위젯과 ElevatedButton 위젯 사이에 공간을 추가하기 위해 높이가 16인 SizedBox 위젯을 추가합니다.
  • Row(mainAxisAlignment: MainAxisAlignment.center, ...: 이 줄은 퀴즈 질문에 답하기 위한 두 개의 ElevatedButton 위젯을 포함하는 Row 위젯을 작성합니다. MainAxisAlignment.center를 사용하여 수평으로 중심을 맞춥니다.
  • children: [..., 다음은 퀴즈 질문에 답하기 위한 두 개의 ElevatedButton 위젯입니다.
  • child: Text('O'),: 이 코드는 레이블이 "O"인 ElevatedButton을 만듭니다. 버튼을 누르면 onPressed 함수가 응답이 true인 OxQuizBlock에 이벤트를 추가합니다.
  • child: Text('X'),: 이 코드는 "X" 레이블이 있는 ElevatedButton을 만듭니다. 이 버튼을 누르면 onPressed 함수가 응답이 false인 OxQuizBlock에 이벤트를 추가합니다.

8. 기본 화면에서 OX 퀴즈 게임 화면으로 이동합니다:

Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => OxQuizScreen()),
);

 

이제 플러터를 이용한 기본적인 OX 퀴즈 게임의 틀을 만들었습니다. 이 기본적인 코드를 사용자와 개발자의 입맛에 맞게 수정하거나, 필요한 부분을 수정할 수 있습니다. 퀴즈의 문제와 답을 채워서 여러분들이 원하는 앱을 만들 수 있습니다.

댓글