连连看游戏(C#).doc_第1页
连连看游戏(C#).doc_第2页
连连看游戏(C#).doc_第3页
连连看游戏(C#).doc_第4页
连连看游戏(C#).doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

连连看游戏(C#)自己动手做一个简单的连连看游戏。(很多可扩展的空能,留给各位自行扩展)游戏规则就不说了,大家应该都知道吧。运行画面:图标区域就是连连看的操作区域,这部分的表示是程序随机生成的。1, 通过先后点击2个图标,程序会判断这2个图标是否可连接,如果可以连接就将这2个图标从图中消失(截图中,空白的2个图标,就是连接后,消失的)。2, 左下是计时区域。目前可以计时,但时间倒数为0时,程序不会自动终止(各位可以自行实现这个功能)。3, 右上是设定区域。当第一局游戏结束后,可以通过点击按钮“再开始”以开始新的游戏。游戏模式可以自行设定。例如“15*12-6”代表15行、12列、每种图标数量为6个(可以计算出需要 15*12/6=30 个不同的图标)。4, 右下是帮助区域。当找不到可以连接的图标时,可以点下“Help”寻求程序帮助(现状当程序无解的时候,不会自动提醒玩家,各位可自行实现)。想要重排画面上的图标时(有时候很长时间都找不到怎么连接),可以点击“画面Data调整”按钮(各位可以自行实现)。CheckBox“连接线表示”是在玩家点击了2个图标后,程序自动描画一个连接2个图标的线。CheckBox“空格子表示”是为了给消失了的格子画线,不勾上的时候,消失的格子将不会有虚线框表示。程序结构:1, Group文件夹内是44个系统图片,用来表示相同的格子。代码中随机生成的是2维int数组,但是表示的时候,将相同的int数字用图片代替。每一局游戏的图片都是随机从这44个图片中产生的。2, Form1。就是我们所看到的的主画面。3, PnlCanvas。左上操作区域的画布控件。程序主要代码:各位可以自行尝试,或发邮件至索取源代码1, Form1.cs:using System;using System.Collections.Generic;using System.Drawing;using System.Windows.Forms;namespace GameLianliankan public partial class Form1 : Form / 空位置坐标 private static Point NullPoint = new Point(-1, -1); / 空值 private static int NullNum = -1; / 横向起点基准坐标 private static int basePX = 30; / 纵向起点基准坐标 private static int basePY = 30; / 前一次选中格子的颜色 private Color preClickBorderColor = Color.DeepPink; / 前一次选中格子的位置 private Point preClickPoint = NullPoint; / 点 private Point ptHelp1 = NullPoint; / 点 private Point ptHelp2 = NullPoint; private Color helpBorderColor = Color.DeepSkyBlue; private int totalTime = 600; private int curTime = 0; / 每一个格子横向宽度 private int lengthX = 50; / 每一个格子纵向高度 private int lengthY = 50; / 格子值二维数组 private int, aryPic; / 连连看游戏图标 private List lstIcons = new List(); / 格子值与图标Index之间的关系 private Dictionary dicValueToIndex = new Dictionary(); public Form1() InitializeComponent(); / / 画面Load場合、作成 / / / private void Form1_Load(object sender, EventArgs e) this.cmbKind.SelectedIndex = 0; for (int i = 1; i 100; i+) object ob = Properties.Resources.ResourceManager.GetObject(string.Format(_0, i.ToString(00); if (ob is Icon) Icon icon = ob as Icon; if (icon.Width = 32 & icon.Height = 32) lstIcons.Add(icon); else icon.Dispose(); icon = null; btnRestart_Click(null, null); / / 画面再作成 / / / private void btnRestart_Click(object sender, EventArgs e) this.ptHelp1 = NullPoint; this.ptHelp2 = NullPoint; timer.Stop(); pgbTime.Value = 100; curTime = 0; int perCount = GetSetRowColCount(); dicValueToIndex.Clear(); /例:列、行 aryPic = new int(pnlShow.Width - 2 * basePX) / lengthX, (pnlShow.Height - 2 * basePY) / lengthY; Random random = new Random(Environment.TickCount); List lstIndex = new List(); for (int i = 0; i lstIcons.Count; i+) lstIndex.Add(i); List lstRandom = new List(aryPic.GetLength(0) * aryPic.GetLength(1); for (int i = 0; i * perCount lstRandom.Capacity; i+) for (int j = 0; j perCount; j+) lstRandom.Add(i + 1); int index = random.Next(0, lstIndex.Count - 1); dicValueToIndex.Add(i + 1, lstIndexindex); lstIndex.RemoveAt(index); /行 for (int i = 0; i aryPic.GetLength(1); i+) /列 for (int j = 0; j aryPic.GetLength(0); j+) int index = random.Next(0, lstRandom.Count - 1); aryPicj, i = lstRandomindex; lstRandom.RemoveAt(index); this.pnlShow.Refresh(); timer.Start(); / / 表示 / / / private void pnlShow_Paint(object sender, PaintEventArgs e) #region 基本格子的描画 /行 for (int i = 0; i aryPic.GetLength(1); i+) /列 for (int j = 0; j aryPic.GetLength(0); j+) Rectangle rect = new Rectangle(new Point(j * lengthX + basePX, i * lengthY + basePY), new Size(lengthX, lengthY); if (aryPicj, i = NullNum) if (chkIsNullShow.Checked) using (Pen pen = new Pen(Color.Red) pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; e.Graphics.DrawRectangle(pen, rect); continue; using (Pen pen = new Pen(Color.LightSteelBlue) e.Graphics.DrawRectangle(pen, rect); #region 描画 int index = dicValueToIndexaryPicj, i; rect.X += (rect.Width - lstIconsindex.Width) / 2; rect.Y += (rect.Height - lstIconsindex.Height) / 2; e.Graphics.DrawIconUnstretched(lstIconsindex, rect); #endregion /TextRenderer.DrawText(e.Graphics, aryPicj, i.ToString(), this.Font, rect, Color.Black); #endregion #region 选中格子的描画 if (preClickPoint != NullPoint) Rectangle rect = new Rectangle(new Point(preClickPoint.X * lengthX + basePX, preClickPoint.Y * lengthY + basePY), new Size(lengthX, lengthY); using (Pen pen = new Pen(preClickBorderColor) pen.Width = 2; e.Graphics.DrawRectangle(pen, rect); using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, preClickBorderColor) e.Graphics.FillRectangle(brush, rect); #endregion #region 帮助格子的描画 if (ptHelp1 != NullPoint & ptHelp2 != NullPoint) Rectangle rect1 = new Rectangle(new Point(ptHelp1.X * lengthX + basePX, ptHelp1.Y * lengthY + basePY), new Size(lengthX, lengthY); Rectangle rect2 = new Rectangle(new Point(ptHelp2.X * lengthX + basePX, ptHelp2.Y * lengthY + basePY), new Size(lengthX, lengthY); using (Pen pen = new Pen(helpBorderColor) pen.Width = 2; e.Graphics.DrawRectangle(pen, rect1); e.Graphics.DrawRectangle(pen, rect2); using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, helpBorderColor) e.Graphics.FillRectangle(brush, rect1); e.Graphics.FillRectangle(brush, rect2); #endregion / / / / / private void pnlShow_MouseClick(object sender, MouseEventArgs e) if (e.X basePX | e.Y = aryPic.GetLength(0) | y = aryPic.GetLength(1) preClickPoint = NullPoint; pnlShow.Refresh(); return; if (aryPicx, y = NullNum) preClickPoint = NullPoint; else ptHelp1 = NullPoint; ptHelp2 = NullPoint; if (preClickPoint = NullPoint) preClickPoint.X = x; preClickPoint.Y = y; else if (preClickPoint.X = x & preClickPoint.Y = y) return; else Point curClickPoint = new Point(x, y); bool isOK = TryToConnect(preClickPoint, curClickPoint); if (isOK) aryPicpreClickPoint.X, preClickPoint.Y = NullNum; aryPiccurClickPoint.X, curClickPoint.Y = NullNum; else preClickPoint = NullPoint; pnlShow.Refresh(); / / 帮助按钮按下后,由程序寻找可连接的两个格子 / / / private void btnHelp_Click(object sender, EventArgs e) bool existFlg = false; for (int i = 0; i aryPic.GetLength(0); i+) for (int j = 0; j aryPic.GetLength(1); j+) if (aryPici, j = NullNum) continue; existFlg = true; for (int m = i; m aryPic.GetLength(0); m+) for (int n = (m = i) ? j + 1 : 0); n aryPic.GetLength(1); n+) if (aryPicm, n = NullNum) continue; if (aryPici, j != aryPicm, n) continue; if (TryToConnect(new Point(i, j), new Point(m, n) ptHelp1.X = i; ptHelp1.Y = j; ptHelp2.X = m; ptHelp2.Y = n; this.pnlShow.Refresh(); return; if (!existFlg) MessageBox.Show(所有格子都已连接完毕,请重新开始游戏!); else MessageBox.Show(已无可连接格子!rn请点击画面調整按钮以随机调整!); / / 画面上剩余的格子数剧随机再调整 / / / private void btnResort_Click(object sender, EventArgs e) MessageBox.Show(.待实现.); / / 空格子表示 / / / private void chkIsNullShow_CheckedChanged(object sender, EventArgs e) this.pnlShow.Refresh(); / / 画面表示 / / / private void chkMode_CheckedChanged(object sender, EventArgs e) if (!chkMode.Checked) this.Width = 1011; chkMode.Text = ; else this.Width = 685; chkMode.Text = ; / / 快捷键 / / / private void Form1_KeyDown(object sender, KeyEventArgs e) / if (e.KeyCode = Keys.F1) this.btnHelp_Click(null, null); /再開始 else if (e.KeyCode = Keys.F5) if (MessageBox.Show(再開始?, 確認, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) = DialogResult.Yes) this.btnRestart_Click(null, null); private void timer_Tick(object sender, EventArgs e) cu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论