C\#러시아 블록 실현(소스 코드)
러시아 블록(Tetris)은 러시아인 알 렉 세이 파 키 트 노 프 가 발명 한 레저 게임 으로 파 키 트 노 프 는 퍼 즐 을 좋아해 퍼 즐 게임 에서 영감 을 얻어 러시아 블록 을 디자인 했다.손 이 간단 하고 노소 가 모두 적합 하기 때문에 누구나 다 알 고 세 계 를 풍미 했다.본 고 는 C\#를 통 해 러시아 블록 을 어떻게 실현 하 는 지 요약 하고 학습 공유 만 할 수 있 으 며 부족 한 점 이 있 으 면 지적 해 주 십시오.
지식 에 관련되다
BackgroundWorker 는 단독 스 레 드 에서 작업 을 수행 합 니 다.
Action.NetFramework 자체 의뢰 방법
TableLayoutPanel 판 넬 을 표시 합 니 다.줄 과 열 로 구 성 된 격자 에서 그 내용 을 동적 으로 배치 할 수 있 습 니 다.본 고 는 주로 러시아 사각형 의 용기 로 사 용 됩 니 다.
블록 플 로 차 트
아래 그림 에서 보 듯 이 러시아 사각형 의 디자인 절차 도 를 묘사 했다.
러시아 블록 효과 도
다음 그림 에서 보 듯 이 주로 상태,득점,시작 버튼,정지 버튼,키보드 좌우 화살표 이동 등 기능 을 포함한다.
핵심 코드
1.사각형 의 모양 정의
총 7 가지 모양
/// <summary>
///
/// </summary>
public enum TetrisStyle
{
S = 0,
Z = 1,
L = 2,
J = 3,
I = 4,
O = 5,
T = 6
}
2.이동 방향 정의아래 와 같이 기본 값 으로 아래로 이동 하 며 좌우 로 이동 할 수 있 습 니 다.
/// <summary>
///
/// </summary>
public enum TetrisDirection
{
UP = 0,// ,
DOWN = 1,// ,
LEFT = 2,// ,
RIGHT = 3, //
DEFAULT=4 //
}
3.러시아 블록 요소다음 과 같이 모든 모양 은 네 개의 사각형 으로 구성 되 고 서로 다른 모양 에 따라 서로 다른 위 치 를 설정 합 니 다.
/// <summary>
///
/// </summary>
public class TetrisElement
{
/// <summary>
///
/// </summary>
/// <param name="style"></param>
public TetrisElement(TetrisStyle style) {
this.style = style;
}
/// <summary>
///
/// </summary>
/// <param name="style"> </param>
/// <param name="content"> </param>
/// <param name="location"> </param>
public TetrisElement(TetrisStyle style, Point[] content, Point location)
{
this.style = style;
this.content = content;
this.location = location;
}
/// <summary>
///
/// </summary>
public TetrisStyle style { get; set; }
/// <summary>
///
/// </summary>
public Point[] content { get; set; }
/// <summary>
///
/// </summary>
public Point location { get; set; }
/// <summary>
///
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void move(int x, int y)
{
this.location = new Point(x, y);
}
public Point[] getContent(TetrisStyle style)
{
// , : ,
Point[] content = new Point[4];
switch (style)
{
case TetrisStyle.I:
//I
content[0] = new Point(0, 0);
content[1] = new Point(0, 1);
content[2] = new Point(0, 2);
content[3] = new Point(0, 3);
break;
case TetrisStyle.J:
//J
content[0] = new Point(1, 0);
content[1] = new Point(1, 1);
content[2] = new Point(1, 2);
content[3] = new Point(0, 2);
break;
case TetrisStyle.L:
//L
content[0] = new Point(0, 0);
content[1] = new Point(0, 1);
content[2] = new Point(0, 2);
content[3] = new Point(1, 2);
break;
case TetrisStyle.O:
//O
content[0] = new Point(0, 0);
content[1] = new Point(1, 0);
content[2] = new Point(0, 1);
content[3] = new Point(1, 1);
break;
case TetrisStyle.S:
//S
content[0] = new Point(2, 0);
content[1] = new Point(1, 0);
content[2] = new Point(1, 1);
content[3] = new Point(0, 1);
break;
case TetrisStyle.T:
//T
content[0] = new Point(0, 0);
content[1] = new Point(1, 0);
content[2] = new Point(2, 0);
content[3] = new Point(1, 1);
break;
case TetrisStyle.Z:
//Z
content[0] = new Point(0, 0);
content[1] = new Point(1, 0);
content[2] = new Point(1, 1);
content[3] = new Point(2, 1);
break;
default:
// I
content[0] = new Point(0, 0);
content[1] = new Point(0, 1);
content[2] = new Point(0, 2);
content[3] = new Point(0, 3);
break;
}
return content;
}
}
4.용기 류다음 과 같이 용기 류 는 주로 사각형 요 소 를 이동 하고 페이지 의 값 을 업데이트 합 니 다.
/// <summary>
///
/// </summary>
public class TetrisContainer
{
private int[,] tetris = new int[10, 20];// , , 0
public Action<Point,Point[],TetrisDirection> onPartialChanged;//
public Action<int[,]> onFullChanged;// ,
public Action onCompleted; //
public int scorce = 0;
/// <summary>
///
/// </summary>
/// <param name="element"></param>
/// <param name="direction"></param>
/// <returns></returns>
public TetrisElement change(TetrisElement element, TetrisDirection direction)
{
TetrisElement tmp=null;
//
switch (direction) {
case TetrisDirection.DEFAULT:
//
if (checkDefault(element))
{
//
element.move(element.location.X, element.location.Y + 1);
tmp = element;
}
else {
// ,
updateTetris(element);
tmp = null;
}
break;
case TetrisDirection.DOWN:
break;
case TetrisDirection.UP:
break;
case TetrisDirection.LEFT:
if (checkLeft(element)){
//
//
element.move(element.location.X-1, element.location.Y);
tmp = element;
}
break;
case TetrisDirection.RIGHT:
if (checkRight(element))
{
//
//
element.move(element.location.X+1, element.location.Y);
tmp = element;
}
break;
}
//
if (onPartialChanged != null)
{
Point location = element.location;
Point[] content = new Point[4];
element.content.CopyTo(content, 0);
for (int i = 0; i < content.Length; i++)
{
content[i].X = location.X + content[i].X;
content[i].Y = location.Y + content[i].Y;
}
onPartialChanged(location,content,direction);
}
//
if (onCompleted != null) {
if (checkComplete()) {
onCompleted();
}
}
//
if (onFullChanged != null)
{
// 1 ,
int[] rows = checkAllTetris();
if (rows.Length>0)
{
updateAllTetris(rows);//
onFullChanged(tetris);
}
}
return tmp;
}
/// <summary>
/// tetris
/// </summary>
/// <param name="element"></param>
private void updateTetris(TetrisElement element)
{
Point location = element.location;
Point[] content = element.content;
int minX = element.getMinX(element.style);
int maxX = element.getMaxX(element.style);
int minY = element.getMinY(element.style);
int maxY = element.getMaxY(element.style);
foreach (Point p in content)
{
if (location.Y + p.Y < 20 && location.Y + p.Y >= 0 && location.X + p.X >= 0 && location.X + p.X < 10)
{
this.tetris[location.X + p.X, location.Y + p.Y] = 1;
}
}
}
/// <summary>
///
/// </summary>
private int[] checkAllTetris()
{
List<int> lst = new List<int>();
//20
for (int y = 0; y < 20; y++)
{
int col = 0;
//10
for (int x = 0; x < 10; x++)
{
if (tetris[x, y] == 0)
{
break;
}
else
{
col += 1;
}
}
if (col == 10)
{
col = 0;
lst.Add(y);
}
}
return lst.ToArray();
}
/// <summary>
///
/// </summary>
private void updateAllTetris(int[] rows) {
foreach (int row in rows) {
//
for (int x = 0; x < 10; x++) {
tetris[x, row] = 0;
}
//row
for (int y = row-1; y >=0; y--) {
for (int x = 0; x < 10; x++) {
if (tetris[x, y] == 1) {
tetris[x, y + 1] = 1;
tetris[x, y] = 0;
}
}
}
}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
private bool checkComplete() {
bool isComplete = false;
for (int i = 0; i < 10; i++) {
if (tetris[i, 0] == 1) {
isComplete = true;
break;
}
}
return isComplete;
}
/// <summary>
///
/// </summary>
/// <param name="s"></param>
public void updateScore(int s) {
this.scorce = this.scorce + s;
}
/// <summary>
///
/// </summary>
public void Reset() {
this.tetris = new int[10, 20];
this.scorce = 0;
}
}
5.블록 요소 와 시작 위 치 를 무 작위 로 생 성
/// <summary>
/// , Tetris
/// </summary>
/// <returns></returns>
public static TetrisElement generate()
{
Random r = new Random(0);
//
int tstyle = getRandom();
tstyle = tstyle % 7;
TetrisStyle style = TetrisStyle.I;
style = (TetrisStyle)Enum.Parse(typeof(TetrisStyle), tstyle.ToString());
//
int x = getRandom();
x = x % 10;
int y = 0;
//
TetrisElement element = new TetrisElement(style);
// , : ,
Point[] content = element.getContent(style);
// ,
int minX = element.getMinX(style);
int minY = element.getMinY(style);
int maxX = element.getMaxX(style);
int maxY = element.getMaxY(style);
//
x = (x <= minX) ? minX : x;
x = (x >= maxX) ? maxX : x;
y = minY;
Point location = new Point(x, y);
element.location = location;
element.content = content;
return element;
}
비고원본 다운로드 링크
이상 은 C\#러시아 블록(소스 코드 첨부)을 실현 하 는 상세 한 내용 입 니 다.C\#러시아 블록 실현 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.