반응형
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(); //-> 다음 맵을 실행해라
}
}
}
}
반응형
'C#' 카테고리의 다른 글
C# 개발 Grid 데이터 변경 및 입력 시 즉시 DB 반영 코딩 (3) | 2023.03.24 |
---|---|
C# 개발 Devexpress Grid 버튼 이벤트 추가 ! (0) | 2023.03.23 |
C#-WINFORM으로 계산기 만들기 중요한 예외처리 enum 사용법 알려드립니다. (1) | 2023.03.22 |
C# 개발 - TCP 네트워크 에코 시스템 모듈 프로그래밍 (0) | 2023.03.17 |
C# 문법 - Delegate의 기본 , 배열에서 홀수와 짝수 찾는 코드 알려드림 (0) | 2023.03.16 |
C# 문법 - 가변 매개 변수 Params 사용법에 대해 알아보자 (0) | 2023.03.16 |