본문 바로가기

C#

C# - C# 언어로 간단한 Game 만들 수 있을지 몰랐지?

반응형

 

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        const int WtileSize = 16;
        const int HtileSize = 9; //하드 코딩이 될 수 밖에 없음!
        const string Title = " 볼드모트와 아츠카반의 죄수";
        
        int Stage;
        char[][] MapReal;
        string[,] Map = {
                                {"################",
                                 "#@             #",
                                 "###   ###      #",
                                 "#      ##      #",
                                 "#      ##     ##",
                                 "#      ##      #",
                                 "#      #   B . #",
                                 "#          B.  #",
                                 "################"},


                                {"################",
                                 "#@            ##",
                                 "###   ###      #",
                                 "#    ####      #",
                                 "#      ####   ##",
                                 "#     #####    #",
                                 "#   ####   B . #",
                                 "#          B . #",
                                 "################"}

                              

            }; //멥이 2개니까 여기도 2개 
        bool EndGame;

        Image human;
        Image humanF;
        Image humanL;
        Image humanR;
        Image humanB;
        Image Wall;
        Image Road;
        Image Box;
        Image Dot;
       

        int Wtile;
        int Htile;
        int humanX;
        int humanY;
        int humanXOld;
        int humanYOld;



        public Form1()
        {
            
            InitializeComponent();
            Text = Title ;
            Stage = 0;

            humanF = new Bitmap(Properties.Resources.humanF);
            Wtile = humanF.Width;
            Htile = humanF.Height;// 사람의 크기를 여기서 바꿀 수 있다. 두 줄 덕분에 고정가능
            ClientSize = new Size(WtileSize * Wtile, HtileSize * Htile);
            humanL = new Bitmap(Properties.Resources.humanL);
            humanR = new Bitmap(Properties.Resources.huamR);
            humanB = new Bitmap(Properties.Resources.huamnB);
            human = humanF;
            Wall = new Bitmap(Properties.Resources.wall);
            Road = new Bitmap(Properties.Resources.road1);
            Box = new Bitmap(Properties.Resources.box);
            Dot = new Bitmap(Properties.Resources.dot);
           
            humanX = 0;
            humanY = 0;

            //맵을 스트링으로 만들어서 고칠 수 없다.
            //이런식으로 배열을 초기화 할려면 새로운 변수를 임시로 만들고 대입해야하기 때문
          
            LoadMap();
      
        }

        private void LoadMap()
        {
            //여기가 판을 바꾸는 포문 여기서 작동 해줘야 다음 판으로 넘어 간다 
            MapReal = new char[HtileSize][]; // 2차원 배열 REAL MAP은 안 변하고 그대로 살아 있고 MapReal 에서 변경되는 거다.

            // TempMap을 포문으로 다 나열 하는 방법
            for (int i = 0; i < HtileSize; ++i)
            {
                MapReal[i] = Map[Stage, i].ToCharArray();
            }
           
            // 맵핑 !!! 이렇게 16개의 벽을  배열로 만든다 .


            //char[] ct = new char[2] { 'a', 'b' }; --- > 이렇게하면 개 노가다 해야함
            //바로는 안들어가지는데 만들어서 넣으면 들어간다

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            


        }

       

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
             EndGame = true; //게임 끝내기 !
            Image Temp= Wall;
            
            for (int j = 0; j < HtileSize; ++j)
            {

                for (int i = 0; i < WtileSize; ++i)
                {
                    switch (MapReal[j][i]) //골뱅이의 위치를 알고 있는 값
                    {
                        case '#':
                            Temp = Wall;
                            break;
                        case '.':
                            Temp = Dot;
                            break;
                        case ' ':
                            Temp = Road;
                            break;
                        case 'B':
                            Temp = Box;
                            if (Map[Stage,j][i]!= '.') // ? 스테이지 
                            {
                                EndGame = false;
                            } //옮긴 박스의 위치가 점이 아닌 위치면 게임을 종류시키지 않는다 .
                            break;
                        case '@':
                            Temp = human;
                            //휴먼 캐릭터의 위치 확인
                            humanX = i;
                            humanY = j;
                            // 캐릭터의 좌표를 보여준다 
                            Text = Title + "["+ humanX +","+ humanY +"]";  

                            break;

                        
                    }
                    e.Graphics.DrawImage(Temp, Wtile * i, Htile * j); //48의 배수로 증가 16개까지  wtile = 48 
                }
            }
           
           
            
            //Text = Title +EndGame;
        }
        
        private void Move()
        {
            if ('#' == MapReal[humanY][humanX])
            {
                return;
            }
            if ('B' == MapReal[humanY][humanX])
            {
                if ('#' == MapReal[humanY * 2 - humanYOld][humanX * 2 - humanXOld])
                {
                    return;
                }
                if ('B' == MapReal[humanY * 2 - humanYOld][humanX * 2 - humanXOld])
                {
                    return;
                }
                MapReal[humanY * 2 - humanYOld][humanX * 2 - humanXOld] = 'B';
            }
            if (Map[Stage ,humanYOld][humanXOld] =='.' ) //스테이지를 왜 앞에 ? 
            {
                MapReal[humanYOld][humanXOld] = '.';
            }
            else
            {
                MapReal[humanYOld][humanXOld] = ' ';

            }
            //MapReal[humanYOld][humanXOld] = ' ';
           /* MapReal[humanYOld][humanXOld] = '.';*///원래 있던 자리

            MapReal[humanY][humanX] = '@';   //움직인 자리
            

        }
        /// <summary>
        /// 키프레스 이벤트는 확실히 스위치 문으로 하면 좋다 그렇단다
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            humanXOld = humanX;
            humanYOld = humanY;


            switch (e.KeyCode)
            {
                case Keys.Left:
                    --humanX;
                    human = humanL;
                    break;
                case Keys.Right:
                    ++humanX;
                    human = humanR;
                    break;
                case Keys.Up:
                    --humanY;
                    human = humanB;
                    break;
                case Keys.Down:
                    ++humanY ;
                    human = humanF;
                    break;
                default:
                    return;

            }
            Move();
            Refresh();
            //리프레쉬 밑에 넣어야 모든 행위가 끝나고 엔딩 박스가 뜬다 
            if (EndGame == true)
            {

                ++Stage;
                if (Stage == Map.Length/HtileSize)
                {
                    MessageBox.Show("Game is Over", "Over", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Environment.Exit(0);
                }
                else
                {
                    MessageBox.Show("Next Game is Coming Up", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                LoadMap(); //-> 다음 맵을 실행해라 
                Refresh(); //-> 맵을 다시 그려라
            }

        }
    }
}

물론 이미지 파일은 따로 다운 받아서 등록해야한다.

반응형

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        bool EndGame;

        Image human;
        Image humanF;
        Image humanL;
        Image humanR;
        Image humanB;
        Image Wall;
        Image Road;
        Image Box;
        Image Dot;


        int Wtile;
        int Htile;
        int humanX;
        int humanY;
        int humanXOld;
        int humanYOld;
        const int WtileSize = 16;
        const int HtileSize = 9; //하드 코딩이 될 수 밖에 없음!
        const string Title = " 볼드모트와 아츠카반의 죄수";
        int KeyCount;
        int Stage;
        char[][] MapReal;
        string[,] Map = {
                                {"################",
                                 "#@             #",
                                 "###   ###      #",
                                 "#      ##      #",
                                 "#      ##     ##",
                                 "#      ##      #",
                                 "#      #   B . #",
                                 "#          B.  #",
                                 "################"},


                                {"################",
                                 "#@            ##",
                                 "###   ###      #",
                                 "#    ####      #",
                                 "#      ####   ##",
                                 "#     #####    #",
                                 "#   ####   B . #",
                                 "#          B . #",
                                 "################"}

                              

            }; //멥이 2개니까 여기도 2개 
        



        public Form1()
        {
            
            InitializeComponent();
            Text = Title ;
            Stage = 0;

            humanF = new Bitmap(Properties.Resources.humanF);
            Wtile = humanF.Width;
            Htile = humanF.Height;// 사람의 크기를 여기서 바꿀 수 있다. 두 줄 덕분에 고정가능
            ClientSize = new Size(WtileSize * Wtile, HtileSize * Htile);
            humanL = new Bitmap(Properties.Resources.humanL);
            humanR = new Bitmap(Properties.Resources.huamR);
            humanB = new Bitmap(Properties.Resources.huamnB);
           
            Wall = new Bitmap(Properties.Resources.wall);
            Road = new Bitmap(Properties.Resources.road1);
            Box = new Bitmap(Properties.Resources.box);
            Dot = new Bitmap(Properties.Resources.dot);
           
            humanX = 0;
            humanY = 0;

            //맵을 스트링으로 만들어서 고칠 수 없다.
            //이런식으로 배열을 초기화 할려면 새로운 변수를 임시로 만들고 대입해야하기 때문
          
            LoadMap();
      
        }

        private void LoadMap() //멥을 바꾸는 메서드
        {
            //여기가 판을 바꾸는 포문 여기서 작동 해줘야 다음 판으로 넘어 간다 
            MapReal = new char[HtileSize][]; // 2차원 배열 REAL MAP은 안 변하고 그대로 살아 있고 MapReal 에서 변경되는 거다.

            // TempMap을 포문으로 다 나열 하는 방법
            for (int i = 0; i < HtileSize; ++i)
            {
                MapReal[i] = Map[Stage, i].ToCharArray();
            }
            KeyCount = 0; //키카운드 초기화!
                          // 맵핑 !!! 이렇게 16개의 벽을  배열로 만든다 .

            human = humanF; //맵이 로드 될때 캐릭터가 앞을 보고 있게 만들 수 있다 .
            //char[] ct = new char[2] { 'a', 'b' }; --- > 이렇게하면 개 노가다 해야함
            //바로는 안들어가지는데 만들어서 넣으면 들어간다
            Refresh(); //-> 맵을 다시 그려라
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            


        }

       

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
             EndGame = true; //게임 끝내기 !
            Image Temp= Wall;
            
            for (int j = 0; j < HtileSize; ++j)
            {

                for (int i = 0; i < WtileSize; ++i)
                {
                    switch (MapReal[j][i]) //골뱅이의 위치를 알고 있는 값
                    {
                        case '#':
                            Temp = Wall;
                            break;
                        case '.':
                            Temp = Dot;
                            break;
                        case ' ':
                            Temp = Road;
                            break;
                        case 'B':
                            Temp = Box;
                            if (Map[Stage,j][i]!= '.') // ? 스테이지 
                            {
                                EndGame = false;
                            } //옮긴 박스의 위치가 점이 아닌 위치면 게임을 종류시키지 않는다 .
                            break;
                        case '@':
                            Temp = human;
                            //휴먼 캐릭터의 위치 확인
                            humanX = i;
                            humanY = j;
                            // 캐릭터의 좌표를 보여준다 
                          

                            break;

                        
                    }
                    e.Graphics.DrawImage(Temp, Wtile * i, Htile * j); //48의 배수로 증가 16개까지  wtile = 48 
                }
            }


            Text = Title + "[" + KeyCount + "]"; // 페인트에서 키카운드 리셋? 이거 쫌 이해가 안되는데 ?
            //Text = Title +EndGame;
        }
        
        private void Move()

        {
           
           
            if ('#' == MapReal[humanY][humanX])
            {
                return;
            }
            if ('B' == MapReal[humanY][humanX])
            {
                if ('#' == MapReal[humanY * 2 - humanYOld][humanX * 2 - humanXOld])
                {
                    return;
                }
                if ('B' == MapReal[humanY * 2 - humanYOld][humanX * 2 - humanXOld])
                {
                    return;
                }
                MapReal[humanY * 2 - humanYOld][humanX * 2 - humanXOld] = 'B';
            }
            if (Map[Stage ,humanYOld][humanXOld] =='.' ) //스테이지를 왜 앞에 ? 
            {
                MapReal[humanYOld][humanXOld] = '.';
            }
            else
            {
                MapReal[humanYOld][humanXOld] = ' ';

            }
            //MapReal[humanYOld][humanXOld] = ' ';
           /* MapReal[humanYOld][humanXOld] = '.';*///원래 있던 자리

            MapReal[humanY][humanX] = '@';   //움직인 자리

            KeyCount++; //마지막에 넣으면 
        }
        /// <summary>
        /// 키프레스 이벤트는 확실히 스위치 문으로 하면 좋다 그렇단다
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            humanXOld = humanX;
            humanYOld = humanY;


            switch (e.KeyCode)
            {
                case Keys.Left:
                    --humanX;
                    human = humanL;
                    break;
                case Keys.Right:
                    ++humanX;
                    human = humanR;
                    break;
                case Keys.Up:
                    --humanY;
                    human = humanB;
                    break;
                case Keys.Down:
                    ++humanY ;
                    human = humanF;
                    break;
                case Keys.F5: //맵 초기화!
                   if(DialogResult.OK == MessageBox.Show("Wanna Game Reset?", "Reset", MessageBoxButtons.OKCancel))
                    { //다이얼로그레졀트 가 오케이 가 메세지 박스 오케이와 같을 때 로드 맵
                        LoadMap();
                    }
                    
                    return;
                    
                default:
                    return;

            }
            Move();
            Refresh(); //화면이 바뀌는애
            //리프레쉬 밑에 넣어야 모든 행위가 끝나고 엔딩 박스가 뜬다 
            if (EndGame == true)
            {

                ++Stage;
                if (Stage == Map.Length/HtileSize)
                {
                    MessageBox.Show("Game is Over", "Over", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Environment.Exit(0);
                }
                else
                {
                    MessageBox.Show("Next Game is Coming Up", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                LoadMap(); //-> 다음 맵을 실행해라 
                
            }

        }
    }
}
반응형