오목 게임 화면 구성

2019. 9. 1. 12:07PL/C++

오목 게임 화면을 구성하려고 한다. 그림을 넣기 위해서 PictureBox를 삽입해야만 한다. 혹시나 PictureBox가 검색되지 않는다면 다음과 같은 절차를 밟는다

 

 

 

 

다음과 같이 적절한 사이즈와 색상을 주어서 만들 수 있다. 그리고 도구상자에서 번개모양을 클릭하면 이벤트 처리를 할 수 있는 목록이 나열된다. 먼저 오목판에 오목이 놓아졌을 때의 처리를 하기 위해서 MouseDown 이벤트를 처리할 것이다

 

 

더블클릭을 하면 코드쪽으로 가서 이벤트핸들러 코드가 생겼다는 것을 확인할 수 있다

 

 

그리고 마찬가지로 SinglePlay 화면이 처음으로 켜졌을 때 화면을 구성하는 이벤트인 Paint 이벤트까지 넣을 것이다

 

 

코드는 다음과 같이 구성할 수 있다

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace client
{
    public partial class SinglePlay : Form
    {
        // 오목판의 셀 크기와 선 개수
        // 현재 공식 오목판은 가로 15, 세로 15줄이다
        // board를 500*500으로 잡았기 때문에, 바둑알의 크기는 지름 33으로 잡았다
        private const int size = 33;
        private const int edge = 15;
    
        // enum으로 BLACK = 1, WHITE = 2로 구분
        private enum Horse { none = 0, BLACK, WHITE };
        // gBoard에 대한 2차원 배열 선언
        private Horse[,] gBoard = new Horse[edge, edge];
        // 현재 플레이어 선언
        private Horse nowPlayer = Horse.BLACK;

        // 클래스 처음에 만들어졌을 때 기본 구성
        public SinglePlay()
        {
            InitializeComponent();
        }

        // 오목판이 refresh 되었을 때 발생하는 이벤트
        private void gomoku_area_Paint(object sender, PaintEventArgs e)
        {
            Graphics gp = e.Graphics;
            // 굵기가 3인 펜 객체 생성
            Pen p = new Pen(Color.Black, 2);
            // Point(x, y), 내 개념에서는 x, y가 바뀜
            gp.DrawLine(p, size / 2, size / 2, size / 2, size * edge - size / 2);
            gp.DrawLine(p, size / 2, size / 2, size * edge - size / 2, size / 2);
            gp.DrawLine(p, size / 2, size * edge - size / 2, size * edge - size / 2, size * edge - size / 2);
            gp.DrawLine(p, size * edge - size / 2, size / 2, size * edge - size / 2, size * edge - size / 2);

            // 대각선으로 이동하면서 상하 라인을 그려줌
            for(int i= size + size/2; i<size * edge - size / 2; i += size)
            {
                gp.DrawLine(p, size / 2, i, size * edge - size / 2, i);
                gp.DrawLine(p, i, size / 2, i, size * edge - size/ 2);
            }
        }

        private void gomoku_area_MouseDown(object sender, MouseEventArgs e)
        {
            // 오목판에 그림을 그리기 위해 Graphics 객체를 만들어줬다
            Graphics g = this.gomoku_area.CreateGraphics();
            int x = e.X / size;
            int y = e.Y / size;
            // 테두리를 벗어났을 때
            if (x < 0 || y < 0 || x >= edge || y >= edge)
            {
                MessageBox.Show("테두리를 벗어났습니다");
                return;
            }
            MessageBox.Show(x + ", " + y);
            // 검은색 말이라면
            if (nowPlayer == Horse.BLACK)
            {
                // 검은색을 만들기 위해 SolidBrush 객체를 생성
                SolidBrush sb = new SolidBrush(Color.Black);
                g.FillEllipse(sb, x * size, y * size, size, size);
            }
            else
            {
                // 흰색을 만들기 위한 SolidBrush 객체를 생성
                SolidBrush sb = new SolidBrush(Color.White);
                g.FillEllipse(sb, x * size, y * size, size, size);
            }
        }
    }
}

 

'PL > C++' 카테고리의 다른 글

Winsock2 소켓 프로그래밍  (0) 2019.09.01
오목 승리 판정 구현하기  (0) 2019.09.01
C# 2차원 배열 구성해서 출력하기  (0) 2019.09.01
boost.asio를 이용한 TCP 동기식 통신  (0) 2019.08.31
오목 시작 화면 구성하기  (0) 2019.08.30