C\#연속 보기 기능 구현(추천)
생각:
레이아웃 초기 화(가로 10 줄 10 열,총 100 개의 셀,각 칸 마다 단추,배경 그림 은 과일 그림,무 작위 생 성).
대응 하 는 바둑판(2 차원 배열 로[0 은 공백 을 표시 하고 0 은 인터페이스 대상 을 표시 하지 않 음])을 초기 화하 고 페이지 와 대응 하 며 동기 화 작업 을 합 니 다.
클릭 한 그림 을 없 앨 수 있 는 지 판단 합 니 다(2 차원 배열 로 전환 합 니 다[수평 방향,수직 방향,한 코너,두 코너 의 절차 로 판단 합 니 다].
삭제 할 수 있다 면 그림 을 숨 기 고 점 수 를 증가 합 니 다.
시간 제한,카운트다운 방식 채택.
관련 지식 포인트:
스 레 드:Thread,배경 운행 시간 제어[카운트다운 방식].
인터페이스 반 짝 임:인터페이스 에 있 는 컨트롤 이 비교적 많 고 배경 그림 이 있 을 때 인터페이스 에 반 짝 임[해결 방식:1,더 블 버퍼 방식 2.컨트롤 생 성 스타일 을 설정 하고 통일 적 으로 새로 고침]이 나타 납 니 다.
TableLayoutPanel:하나의 패 널 을 표시 합 니 다.줄 과 열 로 구 성 된 격자 에서 그 내용 을 동적 으로 배치 할 수 있 습 니 다[요소 추가,행렬 설정,스타일 설정].
자원 파일:Resources 는 그림 과 다른 자원 을 저장 하 는 데 사 용 됩 니 다.
Button:FlatAppearance 는 선택 한 상태 와 마우스 상 태 를 표시 하 는 테두리 모양 과 색상 을 가 져 옵 니 다.
효과 그림 아래(1)[시작,초기 화 후 카운트다운 기능,정지 기능]:
효과 도(2)【시간 종료】
핵심 코드 는 다음 과 같 습 니 다.
/// <summary>
///
/// </summary>
public class LinkHelper
{
/// <summary>
/// ,
/// </summary>
public int[,] LinkBoard { get; set; }
/// <summary>
///
/// </summary>
public event EventHandler SucClick;
/// <summary>
///
/// </summary>
public event EventHandler FailClick;
private int col = 10;
public int Col
{
get
{
return col;
}
set
{
col = value;
}
}
private int row = 10;
public int Row
{
get
{
return row;
}
set
{
row = value;
}
}
/// <summary>
///
/// </summary>
public void LinkLine(Point first, Point second)
{
EventArgs e = new EventArgs();
if (checkLink(first, second))
{
//
this.LinkBoard[first.X, first.Y] = 0;
this.LinkBoard[second.X, second.Y] = 0;
if (this.SucClick != null)
{
SucClick(this, e);
}
}
else {
//
if (this.FailClick != null)
{
FailClick(this, e);
}
}
}
/// <summary>
///
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
public bool IsChecked(Point p)
{
bool flag = false;
if (p.X != -1 && p.Y != -1)
{
flag = true;
}
return flag;
}
#region
/// <summary>
///
/// </summary>
/// <param name="a"> </param>
/// <param name="b"> </param>
/// <returns></returns>
private bool checkLink(Point a, Point b)
{
if (!Point.Equals(a, b))
{
if (this.LinkBoard[a.X, a.Y] == this.LinkBoard[b.X, b.Y])
{
if (a.X == b.X && horizon(a, b))
{
return true;
}
if (a.Y == b.Y && vertical(a, b))
{
return true;
}
if (oneCorner(a, b))
{
return true;
}
else
{
return twoCorner(a, b);
}
}
else {
// , false
return false;
}
}
else {
// , false;
return false;
}
}
/// <summary>
///
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
private bool horizon(Point a, Point b)
{
int col_start = a.Y < b.Y ? a.Y : b.Y; // a,b y
int col_end = a.Y < b.Y ? b.Y : a.Y; // a,b
// a,b , false;
for (int i = col_start + 1; i < col_end; i++)
{
if (this.LinkBoard[a.X, i] != 0)
{
return false;
}
}
return true;
}
/// <summary>
///
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
private bool vertical(Point a, Point b)
{
int row_start = a.X < b.X ? a.X : b.X;
int row_end = a.X < b.X ? b.X : a.X;
for (int i = row_start + 1; i < row_end; i++)
{
if (this.LinkBoard[i, a.Y] != 0)
{
return false;
}
}
return true;
}
/// <summary>
///
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
private bool oneCorner(Point a, Point b)
{
Point c = new Point(b.X, a.Y);
Point d = new Point(a.X, b.Y);
// C
if (this.LinkBoard[c.X, c.Y] == 0)
{
bool path1 = horizon(b, c) && vertical(a, c);
return path1;
}
// D
if (this.LinkBoard[d.X, d.Y] == 0)
{
bool path2 = horizon(a, d) && vertical(b, d);
return path2;
}
else
{
return false;
}
}
/// <summary>
///
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
private bool twoCorner(Point a, Point b)
{
List<Line> ll = scan(a, b);
if (ll.Count == 0)
{
return false;
}
for (int i = 0; i < ll.Count; i++)
{
Line tmpLine = ll[i];
if (tmpLine.direct == 1)
{
if (vertical(a, tmpLine.a) && vertical(b, tmpLine.b))
{
return true;
}
}
else if (tmpLine.direct == 0)
{
if (horizon(a, tmpLine.a) && horizon(b, tmpLine.b))
{
return true;
}
}
}
return false;
}
/// <summary>
/// A B
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
private List<Line> scan(Point a, Point b)
{
List<Line> linkList = new List<Line>();
// a ,b
for (int i = a.Y; i >= 0; i--)
{
if (this.LinkBoard[a.X, i] == 0 && this.LinkBoard[b.X, i] == 0 && vertical(new Point(a.X, i), new Point(b.X, i)))
{
linkList.Add(new Line(new Point(a.X, i), new Point(b.X, i), 0));
}
}
// a ,b
for (int i = a.Y; i < Col; i++)
{
if (this.LinkBoard[a.X, i] == 0 && this.LinkBoard[b.X, i] == 0 && vertical(new Point(a.X, i), new Point(b.X, i)))
{
linkList.Add(new Line(new Point(a.X, i), new Point(b.X, i), 0));
}
}
// a ,b
for (int j = a.X; j >= 0; j--)
{
if (this.LinkBoard[j, a.Y] == 0 && this.LinkBoard[j, b.Y] == 0 && horizon(new Point(j, a.Y), new Point(j, b.Y)))
{
linkList.Add(new Line(new Point(j, a.Y), new Point(j, b.Y), 1));
}
}
// a ,b
for (int j = a.X; j < Row; j++)
{
if (this.LinkBoard[j, a.Y] == 0 && this.LinkBoard[j, b.Y] == 0 && horizon(new Point(j, a.Y), new Point(j, b.Y)))
{
linkList.Add(new Line(new Point(j, a.Y), new Point(j, b.Y), 1));
}
}
return linkList;
}
#endregion
}
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 C\#연속 보기 기능 을 실현 하 는 것 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.