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;
using System.Threading;
namespace QiLeiGame
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load_1(object sender, EventArgs e)
{
myImage = new Bitmap(panel1.Width, panel1.Height);//画图
//luoZhiThread = new Thread(luoZhi);
//luoZhiThread.Start();
}
private Image myImage;
Thread luoZhiThread;
private bool gameStart=false;
/// <summary>
/// 初始化背景数组
/// int[x,y] x为行 y为列
/// </summary>
private int[,] bgGround = new int[11, 11];
private int CurrentX;//当前bgGround的x行
private int CurrentY;//当前bgGround的y列
private bool IsWhite = false;//判断白棋还是黑棋先
private bool IsOver = false;//记录游戏是否结束
protected override void OnPaint(PaintEventArgs e)
{
Draw();
base.OnPaint(e);
}
/// <summary>
/// 画棋盘
/// </summary>
private void Draw()
{
Graphics g = Graphics.FromImage(myImage);
g.Clear(this.BackColor);
g.FillRectangle(Brushes.White, new Rectangle(new Point(10, 10), new Size(400, 400)));
//循环次数应比背景bgGround行、列少1
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
g.DrawRectangle(new Pen(Brushes.Black), i * 40 + 10, j * 40 + 10, 40, 40);
}
}
Graphics gg = panel1.CreateGraphics();
gg.DrawImage(myImage, 0, 0);
}
/// <summary>
/// 判断输赢
/// </summary>
/// <param name="flag">1为白棋 2为黑棋</param>
private void JudgeResult(int flag)
{
int x = CurrentX;
int y = CurrentY;
int MinXNum = 0;
int MaxXNum = 0;
int count = 0;
if (x > 4)
{
MinXNum = x - 4;
if (x + 4 > 10)
{
MaxXNum = 10;
}
else
{
MaxXNum = x + 4;
}
}
else
{
MaxXNum = x + 4;
}
int MinYNum = 0;
int MaxYNum = 0;
if (y > 4)
{
MinYNum = y - 4;
if (y + 4 > 10)
{
MaxYNum = 10;
}
else
{
MaxYNum = y + 4;
}
}
else
{
MaxYNum = y + 4;
}
#region //横向
for (int i = MinXNum; i < MaxXNum + 1; i++)
{
if (bgGround[i, y] == flag)
{
count++;
if (count > 4)
goto Label;
}
else
{
count = 0;
if (i > MaxXNum - 4)
break;
}
}
#endregion
#region //竖向
for (int i = MinYNum; i < MaxYNum + 1; i++)
{
if (bgGround[x, i] == flag)
count++;
else
{
count = 0;
if (i > MaxYNum - 4)
break;
}
if (count > 4)
goto Label;
}
#endregion
//左斜
for (int i = MinXNum; i < MaxXNum + 1; i++)
{
if (CurrentX + CurrentY - i < 0)
break;
if (CurrentX + CurrentY - i <= 10)
{
if (bgGround[i, CurrentX + CurrentY - i] == flag)
{
count++;
}
else
{
count = 0;
if (i > MaxYNum - 4)
break;
}
}
if (count > 4)
goto Label;
}
//右斜
for (int i = MinXNum; i < MaxXNum + 1; i++)
{
if (i < CurrentX - CurrentY)
break;
if (i + CurrentY - CurrentX > 10)
break;
if (bgGround[i, i + CurrentY - CurrentX] == flag)
{
count++;
}
else
{
count = 0;
if (i > MaxYNum - 4)
break;
}
if (count > 4)
goto Label;
}
Label:
if (flag == 1 && count > 4)
{
IsOver = true;
MessageBox.Show("白棋赢,游戏结束");
return;
}
else if (flag == 2 && count > 4)
{
IsOver = true;
MessageBox.Show("黑棋赢,游戏结束");
return;
}
else
{
IsOver = false;
}
}
/// <summary>
/// 画棋子
/// </summary>
/// <param name="g"></param>
/// <param name="x">bgGround中x位置</param>
/// <param name="y">bgGround中y位置</param>
/// <param name="p">画笔</param>
/// <param name="brush">棋子颜色</param>
/// <param name="flag">1为白棋 2为黑棋</param>
private void DrawChess(Graphics g, int x, int y, Pen p, Brush brush, int flag)
{
CurrentX = x; CurrentY = y;
bgGround[x, y] = flag;
g.DrawEllipse(p, x * 40, y * 40, 20, 20);
g.FillEllipse(brush, x * 40, y * 40, 20, 20);
}
private void button_black_first_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
string tag = btn.Text.ToString();
if (tag.Contains("黑"))
{
IsWhite = false;
}
else//黑棋先
{
IsWhite = true;
}
}
private void button_reset_Click(object sender, EventArgs e)
{
IsOver = false;
Draw();
bgGround = new int[11, 11];
}
private void button_white_first_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
string tag = btn.Text.ToString();
if (tag.Contains("白"))//白棋先
{
IsWhite = true;
}
else//黑棋先 tag=2
{
IsWhite = false;
}
}
bool luozhiBool=false;
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
int x = (e.X - 10) % 40;
int y = (e.Y - 10) % 40;
x = e.X;
y = e.Y;
if (x > 30)
{
x = (e.X - 10) / 40 + 1;
}
else
{
x = (e.X - 10) / 40;
}
if (y > 30)
{
y = (e.Y - 10) / 40 + 1;
}
else
{
y = (e.Y - 10) / 40;
}
textBox1.Text = x.ToString();
textBox2.Text = y.ToString();
Graphics g = panel1.CreateGraphics();
if(gameStart)
{
if (luozhiBool)
{
if (IsWhite)
{
DrawChess(g, x, y, new Pen(Brushes.White), Brushes.White, 1);
IsWhite = false;
JudgeResult(1);
}
else
{
DrawChess(g, x, y, new Pen(Brushes.Black), Brushes.Black, 2);
IsWhite = true;
JudgeResult(2);
}
luozhiBool = false;
}
}
}
private void button_start_Click(object sender, EventArgs e)
{
gameStart = true;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//if(luoZhiThread.IsAlive)
//{
// luoZhiThread.Abort();
//}
}
private void panel1_MouseClick(object sender, MouseEventArgs e)
{
luozhiBool = true;
}
}
}
C#开发的五子棋小游戏源码
最新推荐文章于 2024-03-25 00:12:32 发布