扫雷程序设计

  • 格式:doc
  • 大小:2.18 MB
  • 文档页数:17

程序设计报告 ( 2014 / 2015 学年 第 一 学期)

题 目:利用C#开发的扫雷程序

专 业 理工科强化班 组员 学号姓名 栗森安 Q13010423 胡涛 Q13010421 指 导 教 师 俞琼 指 导 单 位 南京邮电大学 日 期 2014 年 10 月 24 日

成员分工

组员(胡涛) 负责编写程序核心代码调试程序 组员(栗森安) 负责扫雷程序各个界面的设计; 编写调用各资源的代码以及界面按钮操作; 共同检验核心代码正确性; 负责查错,调试程序;

评分细则

评分项 优秀 良好 中等 差 遵守机房规章制度 上机时的表现 学习态度 程序准备情况 程序设计能力 团队合作精神 课题功能实现情况 算法设计合理性 用户界面设计 报告书写认真程度 内容详实程度 文字表达熟练程度 回答问题准确度

简短评语 教师签名:

年 月 日 评分等级

胡涛 Q13010421 栗森安 Q13010423

备注 评分等级共五种:优秀、良好、中等、及格、不及格 利用C#开发的扫雷程序 一、 实验内容和要求 (1)定义一个矩阵,随机产生地雷的分布并由此产生提供给游戏者的数字信息。 (2)定义成绩排行榜,记录前五名的用户名及时间。 (3)提供菜单功能,定义不同等级的地雷地图供选择。 (4)游戏者通过坐标(如1(1,2)、0(3,4)判定第一行第二列位置为地雷,第3行第四列不是地雷)判定是否为地雷,标记地雷位置正确,则正确位置显示@符号,如触碰地雷,游戏结束,没有触碰地雷,显示该坐标位置周边地雷分布情况,如果周边有地雷不显示。 (5)成绩排行榜以文件形式保存。 (6)鼓励采用Turbo C/C++、MFC等开发工具,实现彩色或图形操作界面。

二、 实验目的 1.掌握窗体设计步骤、窗体调用 2.学习Form窗体中控件的灵活使用,能基本理解所学代码的基本含义 3.会使用button、panel、label、textbox、menustrip等按钮,并会使用二维数组的定义与使用二维数组定义雷区,通过enable按钮控制器可使用性 4. 能通过Location、size等控制界面的合理大方 5. 能使用picturebox、timer等控件的加入,并能通过属性按钮来完成所需要的结果 三、 实验任务 (1)随机产生地雷的分布并由此产生提供给游戏者的数字信息; (2)定义成绩排行榜,记录用户名和时间; (3)提供菜单功能,定义不同等级的地雷地图供选择; (4)可通过鼠标操作(右键插旗,左键点击格子); (5)成绩排行榜保存为.txt文件; 四、 实验内容

1. 完成扫雷游戏主界面、自定义界面、游戏成功后登记界面,扫雷排名界面的创建;添加各界面的控件(menustrip、button、label、panel等)

2. 对各个button和menustrip插入代码 New Game private void nesToolStripMenuItem_Click(object sender, EventArgs e) { button1.Image = Image.FromFile("face.bmp"); DelAllMines(); RestMine = MineNum; CostTime = 0; label1.Text = CostTime.ToString(); GamesBegin(); GameInit(); timer1.Enabled = true; }

Beginner private void beginnerToolStripMenuItem_Click(object sender, EventArgs e) { button1.Image = Image.FromFile("face.bmp"); beginnerToolStripMenuItem.Checked = true; intermediateToolStripMenuItem.Checked = false; expertToolStripMenuItem.Checked = false; customToolStripMenuItem.Checked = false; DelAllMines(); XNum = 9; YNum = 9; MineNum = 10; RestMine = MineNum; label1.Text = CostTime.ToString(); GamesBegin(); GameInit(); timer1.Enabled = true; detform(); }

Intermediate private void intermediateToolStripMenuItem_Click(object sender, EventArgs e) { button1.Image = Image.FromFile("face.bmp"); beginnerToolStripMenuItem.Checked = false; intermediateToolStripMenuItem.Checked = true; expertToolStripMenuItem.Checked = false; customToolStripMenuItem.Checked = false; DelAllMines(); XNum = 16; YNum = 16; MineNum = 40; RestMine = MineNum; label1.Text = CostTime.ToString(); GamesBegin(); GameInit(); timer1.Enabled = true; detform(); }

Expert private void expertToolStripMenuItem_Click(object sender, EventArgs e) { button1.Image = Image.FromFile("face.bmp"); beginnerToolStripMenuItem.Checked = false; intermediateToolStripMenuItem.Checked = false; expertToolStripMenuItem.Checked = true; customToolStripMenuItem.Checked = false; DelAllMines(); XNum = 30; YNum = 16; MineNum = 99; RestMine = MineNum; label1.Text = CostTime.ToString(); GamesBegin(); GameInit(); timer1.Enabled = true; detform(); }

Custom private void customToolStripMenuItem_Click(object sender, EventArgs e) { button1.Image = Image.FromFile("face.bmp"); beginnerToolStripMenuItem.Checked = false; intermediateToolStripMenuItem.Checked = false; expertToolStripMenuItem.Checked = false; customToolStripMenuItem.Checked = true; Form zdy = new Form2(); zdy.ShowDialog(); if (zdy.DialogResult == DialogResult.OK) zdyGames(); }

核心代码 初始定义 private Button[,] Mines; //定义二维动态数组 用于显示雷区 private int XNum = 9; //初始化累的列数(即为:初级时的行列数) private int YNum = 9; //初始化雷的行数 public static int zdyXNum; //用于自定义中的列数 public static int zdyYNum; //用于自定义中的行数 private int MineNum = 10; //初始化雷的总数 public static int zdyMineNum; //用于记录自定义中的雷数 private int[,] Turn; //用二维数组赋值:-1 表示这个位置已经翻开;0 表示这个位置没有翻开;1 表示这个位置插上红旗;

public static int CostTime = 0; //计量所用的时间 private int StartTime = 0; //初始化时间 private int RestMine = 10; //用于改变等级时载入剩余雷数 private int MineWidth = 20; // 控制雷块的大小

删除雷区 private void DelAllMines() { for (int i = 0; i < XNum; i++) for (int j = 0; j < YNum; j++) { Button n = new Button(); n = (Button)Mines[i, j]; this.Controls.Remove(Mines[i, j]); } }

游戏开始 private void GamesBegin() //用于开始游戏,主要是定义雷区 { Turn = new int[XNum, YNum]; //定义新的二维数组 Mines = new Button[XNum, YNum]; //定义按钮 for (int x = 0; x < XNum; x++) for (int y = 0; y < YNum; y++) //通过二维数组,逐个定义初始化button按钮 { Mines[x, y] = new Button(); this.Controls.Add(Mines[x, y]); //增加新按钮 Mines[x, y].Left = 20 + MineWidth * x; //定义雷区开始在Form窗体中的左边界 Mines[x, y].Top = 72 + MineWidth * y; //定义雷区开始在Form窗体中的上边界 Mines[x, y].Width = MineWidth; //定义雷块的宽度 Mines[x, y].Height = MineWidth; //定义雷块的高度 Mines[x, y].Font = new Font("宋体", 10.5F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(134))); //定义字体 Mines[x, y].BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; //定义backgroundimageLayout Mines[x, y].Name = "Mines" + (x + y * XNum).ToString(); //定义雷区的名字 Mines[x, y].MouseUp += new MouseEventHandler(bt_MouseUp); //定义单击事件