/BingoSwingProject-Java

Java Swing을 이용한 빙고게임 제작

Primary LanguageJava

BingoSwingProject-Java

JavaProgramming F2022에서 진행한 Bingo 프로젝트

Swing을 이용하여 제작.

빙고 프로젝트 구현 설명

  1. 사용자와 컴퓨터의 빙고판 만들기

    보드판은 영어를 출력해야 하지만, 그 안에 한글도 모두 가지고 있는 형태로 제작을 해야 했다. 이를 해결하기 위해 수업시간에 만든 Word클래스 타입의 2차원 배열을 Board 클래스 안에 넣어주었다. 또한 보드를 생성하는 함수도 모두 Board클래스 내부에 넣어주었다.

    Swing에서는 Board클래스에서 만들어진 board를 GridLayout에 button배열 형태로 만들어 넣어주었다.

    또한 보드의 크기는 3~7로 제한을 하였고, 이를 넘기는 숫자를 사용하는 경우 경고창을 통해 다시 입력하도록 하였다. 초기값은 3으로 설정하였다.

    Board클래스의 보드를 생성하는 함수인 void generateBoard()를 생성하여, wordList에 있는 단어를 board 배열에 넣어 주었다.

  2. 게임 창 구현

    게임 창은 [메인페이지]-[게임보드창(모달)] 로 구현하였다.

    A. 메인페이지 메인페이지는 MainFrame 클래스를 생성하였으며, 컴퓨터가 승리할수 있게 해주는 알고리즘을 적용시킬지 확인하는 isNearBingoCom이란 체크박스와, 보드의 크기를 적는 textField를 넣어주어, 플레이어가 정할 수 있게 제작하였다. 보드의 크기 같은 경우에 영단어장의 단어 개수보다 보드 크기가 크거나, 범위 외 숫자, 문자가 들어오는 경우 예외처리를 했다.

    B. 게임보드창 (모달) 게임보드창은 하나의 메인페이지에서 여러 개의 게임보드창이 나오지 못하게 하도록 모달로 구현하였다. 게임보드창은 나의 보드를 왼쪽에 위치하게 하였고, 보드의 영단어와, 게임 로그를 볼 수 있는 영역은 오른쪽에 배치하였다.

    i. 게임로그 게임로그의 같은 경우에는, player가 입력한 단어를 표시하고, 표시단어가 존재하는지, 상대방이 고른 단어는 무엇인지 , 빙고의 개수 등을 한턴이 지날 때 마다 출력을 해주게 구현을 하였다.

    C. 영단어 선택 영단어 선택 같은 경우, textField를 통해 입력된 단어를 board에 대해 for문을 돌려 찾는다. 존재할경우 해당 보드 좌표의 isChecked라는 boolean타입의 변수를 true로 바꾸어준다.(default = false) 이는 상대방의 보드에도 같게 적용을 해준다. 이후 상대방 보드의 단어를 랜덤 또는 알고리즘을 통해 하나를 선정하고, 위의 과정을 반복한다 (위의 두과정이 한 세트이다.)

    D. 빙고 개수 확인 빙고 개수의 경우 총 열 n줄, 행 n줄 대각 2줄 총 2n+2 개를 점검해야 한다. 이때 빙고의 여부를 파악하기 위해 2n+2크기의 배열을 선언하고, 각 열 행 대각에 대해 isChecked의 개수를 파악한다. 만약 열 행 대각 각각에서 isChecked의 개수가 n개라면 빙고 카운트를 한다.

    카운트를 끝냈다면, 서로의 카운트를 비교한 후 많은 쪽을 승리로 선정한다. 만약 모든 카운트를 끝내고, 보드판이 모두 isChecked = true로 되어있다면 비김을 선정한다. 해당 결과는 score.txt에 기록한다. Ex) 5 4 1  5판 사용자 4승 컴퓨터 1승

    E. 보드 리프레시 보드 리프레시 같은 경우, 해당 턴이 끝난 후에 해준다. 보드에서 isChecked가 true인 경우에 해당 보드판의 색을 바꾸어주는 일을 수행해준다.

    F. 승률 저장 승률같은경우에는, score.txt에 저장이 되며, 해당 문서 내부는다음처럼 기록한다. . Ex) 5 4 1  5판 사용자 4승 컴퓨터 1승 승률을 불러올 때에는 가장먼저 score.txt가 존재하는지 확인 후에, 존재하지 않는다면 새로 만들어 주고, [ 0, 0, 0]을 저장해준다. 게임 종료후에는 score.txt에 해당 결과를 저장해준다.

    G. 컴퓨터 보드 구현 컴퓨터의 보드는 사용자의 보드와 똑같이 GridLayout을 통해 구현해주고, 게임 진행 시 컴퓨터의 보드는 볼 수 없게 만들기 위해, com의 보드를 볼 수 있는 버튼을 생성하고, 그 버튼을 누를 경우 modal창 안에 컴퓨터의 보드를 열 수 있게 생성을 해주었다. 또한 보드 리프레시 기능을 통해 현재까지 체킹된 단어의 색을 바꾸어준다.

    H. 컴퓨터가 이길 수 있는 알고리즘 구현 기존 랜덤으로 컴퓨터가 보드 내에 단어를 찾을 경우에는 사용자가 유리하게 게임이 흘러갈 수 밖에 없다. 이를 막기 위해서 컴퓨터가 인간처럼 자신의 보드에 대해 빙고의 개수를 확인 및 빙고를 할 수 있는 제일 빠른 줄 선택을 한 후에 그 줄에 있는 단어를 선택해야한다. 만약 사용자가 실수를 하거나, 컴퓨터보드의 단어를 입력하게 된다면 해당 게임은 컴퓨터의 승리로 진행될 확률이 매우 커진다.

    [로직]

    1. 컴퓨터의 보드에 있는 각 빙고가 가능한 줄마다 현재 몇 개의 단어가 선택 되어있는지를 확인한다.

      만약 처음 시작이라면 보드에서 랜덤으로 한 단어를 선택한다.

    2. 1에서 선택된 단어의 개수들을 배열로 만들어서 가장 많이 선택된 줄을 하나 선택한다.

    3. 그 줄에서 선택이 안된 단어를 찾아서 그 단어의 좌표를 컴퓨터가 선택하도록 한다.

회고

기존에 console용으로 제작한 프로그램을 자바의 스윙을 이용하여 그래픽이 있는 프로그램을 만드는 것이 공부하는 것에 도움이 많이 되었다. 콘솔에서의 메뉴창은 어떻게 구현해야 하고, 어떤 화면 배치가 유저가 손 쉽게 사용할 수 있게 하는지, 어떤 리스너를 사용하야 하는지 등등, 기본적인 알고리즘 로직 요소 말고도 swing처리에서 많이 생각을 할 수 있었다. 토의 사항으로는 현재 개발한 알고리즘을 조금 더 승률이 높게 구현하려면 어떤 방법을 사용해야 할지에 대해 서로 의견을 나누고 싶다.