본문으로 바로가기

소코반 만들기 수정 작업(1)

category 스마트팩토리/C# 2020. 10. 27. 16:02
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 _2020_10_211
{
    public partial class Form1 : Form
    {
        //그림이랑 문자를 호환 Mapping이라 한다.
        Bitmap Box;         //'B'
        Bitmap Point;       //'.'
        Bitmap Human;       //'@'
        Bitmap Wall;        //'#'
        Bitmap Road;        //''
        Bitmap Gound;       //'G'

        char[][] MapReal;
        string[] Map;
        const int XTile = 16;
        const int YTile = 10;
        const int XPixel = 50;
        const int YPixel = 50;
        int HunmanX;
        int HunmanY;
       


        public Form1()
        {
            InitializeComponent();
            this.ClientSize = new System.Drawing.Size(XPixel * XTile, YPixel * YTile);
            Box = new Bitmap(Properties.Resources.Box);
            Point = new Bitmap(Properties.Resources.Point);
            Human = new Bitmap(Properties.Resources.Human);
            Wall = new Bitmap(Properties.Resources.Wall);
            Road = new Bitmap(Properties.Resources.Road);
            Gound = new Bitmap(Properties.Resources.Gound);
            //          
            Map = new string[YTile] { "GGGGGGGGGGGGGGGG",    //0
                                      "G##############G",    //1
                                      "G#            #G",    //2
                                      "G# ############G",    //3
                                      "G#       .B.@ #G",    //4 
                                      "G#            #G",    //5
                                      "G#            #G",    //6
                                      "G#            #G",    //7
                                      "G##############G",    //8
                                      "GGGGGGGGGGGGGGGG"};   //9
            string Temp = "apple";      // stub코드는 영향을 미치지는 않지만 테스트하기위해서
            MapReal = new char[YTile][];

            for (int i = 0; i < YTile; i++)
            {
                MapReal[i] = Map[i].ToCharArray();
            }
            //MapReal[0][0] = '#';


        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Bitmap abitmap;

            for (int iy = 0; iy < YTile; iy++)
            {

                for (int ix = 0; ix < XTile; ix++)
                {

                    switch (MapReal[iy][ix])
                    {
                        case '#':
                            abitmap = Wall;
                            break;
                        case 'G':
                            abitmap = Gound;
                            break;
                        case '@':
                            abitmap = Human;
                            HunmanX = ix;
                            HunmanY = iy;                            
                            //MessageBox.Show(string.Format("{0} {1}",ix,iy));
                            break;
                        case 'B':
                            abitmap = Box;
                            break;
                        case '.':
                            abitmap = Point;
                            break;

                        case ' ':
                            abitmap = Road;
                            break;
                        default:
                            abitmap = Road;
                            break;
                    }
                        e.Graphics.DrawImage(abitmap, ix * 50, iy * 50);
                    }
                }
            }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            MapReal[HunmanY][HunmanX] = ' ';
            switch (e.KeyCode)
            {
                case Keys.Left:
                    --HunmanX;
                    break;
                case Keys.Right:
                    ++HunmanX;
                    break;
                case Keys.Down:
                    ++HunmanY;
                    break;
                case Keys.Up:
                    --HunmanY;
                    break;
                default:
                    MapReal[HunmanY][HunmanX] = '@';
                    return;

            }
            MapReal[HunmanY][HunmanX] = '@';
            Invalidate();
            //번쩍거림을 없애기 위해서 더블버퍼링을 켰다.
        }
    }
    }


수정한 위에 코드에 대해 설명을 하겠다.

일단 Map이라는 객체를 생성해두었다.

허나 이객체는 수정이 불가능한 객체이다. string이니깐 그래서 수정이 가능한 객체(MapReal)를 하나 만들어서 거기에 char배열객체를 연결시켜서 만들생각이다.

원래는 이태리 장인 정신으로 하나하나 연결 시켜야 하지만 for문으로 한번에 해결하였다.

MapReal[0] = Map[0].ToCharArray();

MapReal[1] = Map[1].ToCharArray();

이렇게 10개를 한번에 for문으로 만들었다.

주석 처리 되어있는 것은 변화는것이 맞는지 확인하는 stub코드이다.

 

일단 버튼을 누르게 되면 road로 나오게 된다.

그리고 그 다음에 switch문을 통해 keyCode를 누르게 되면 거기에 따라서 HumanX나 HumanY가 변경 되어서 입력되어 나오게 되면 거기 좌표에 맞게 '@'(사람)이 들어가게 된다.

default문에 MapReal[HunmanY][HunmanX] = '@'; 넣게 된 이유는 아무키나 누르고 화면밖으로 나가게 되면 사람이 없어지기에 생성시켜주기 위해서 이다.

 

위에에서 번쩍거림을 없애기 위해서 더블버퍼링을 켰다.

 

'스마트팩토리 > C#' 카테고리의 다른 글

소코반 만들기 수정 작업(2)  (0) 2020.10.28
소코반 만들기 전 기초 작업(배열)  (0) 2020.10.23
2020/9/8 C#  (0) 2020.09.08
2020/8/18 C#  (0) 2020.08.18
2020/7/30 C#  (0) 2020.07.30