郑州轻工业学院
实习报告
实习名称:程序设计与ACM竞赛实训
之 程序设计实训
院 系:计算机与通信工程学院
专业班级:计算机20##-01班
学 号:541407010152
姓 名:张径天
实习地点:科学校区实验楼302
时 间:20##年7月
第一部分
扫雷游戏的设计与实现
一、实训目的
请注意格式:正文采用小四号字、单倍行距,其中的代码用五号字!注意分段,且每段首行缩进两个字!
1.掌握窗体设计步骤、窗体调用
2.学习Form窗体中控件的灵活使用,能基本理解所学代码的基本含义
3.会使用button、panel、label、textbox、menestrip等按钮,并会使用二维数组的定义与使用二维数组定义雷区,通过enable按钮控制器可使用性
4. 能通过Loction、size等控制界面的合理大方
5. 能使用imagebox、timer等控件的加入,并能通过属性按钮来完成所需要的结果
6. 自学制作过程中不会控件的使用。
二、实训内容
1. 通过一学期所学的C#知识来完成基本的可视化程序设计需求
2. 仿Windows系统扫雷,完善扫雷游戏:添加菜单(包含快捷键、热键等)、实现初级、中级、高级及自定义扫雷;添加扫雷英雄榜;实现各方块中标识周边雷数量的文字采用不同颜色的数字显示
三、程序开发操作步骤
说明:以下共分为4各部分来介绍,分别为:扫雷主界面、自定义窗体、请输入窗体、英雄榜窗体等.
主界面:
1. 打开Microsoft Visual Studio 2008,选择c#编译环境,创建一个项目,使用Windows窗体应用程序,并命名为“扫雷_xxb”
2. 点击Form1,从text属性栏中的Form1改为扫雷,icon属性中加入mine.ico图片。再将Font属性改为 新宋体,9pt,加粗。并向其中添加一个timer1控件其属性中的Interval属性改为1000.添加一个imageList1控件,添加图片。
3. 按照如上设计分别加入menestrip控件,设计好菜单为:游戏(&G):新游戏、初级、中级、高级、自定义…、英雄榜…、退出;帮助(&H):游戏说明、
关于扫雷…、关于版权…等。按顺序先把前者属性栏中的ShowShortcutKeys属性设置为True,ShortcutKeys 分别设置为Ctrl+N、Ctrl+L、Ctrl+M、Ctrl+H、Ctrl+D、Ctrl+C、Ctrl+E;后者分别设置为Ctrl+I、Ctrl+F、Ctrl+B。
4. 向Form1中拖入一个menuStrip控件,Loction和size属性按上图设计,分别向其中加入1个button控件和2个label控件。设置label控件的Font属性为宋体,12pt,加粗,其中ForeColor设置为Red。并在buttion窗体的text设置为空,Image加入face.bmp图片。
5. 再向Form1窗体中拖入一个button控件,其Text属性改为 标示出雷,Font属性设置为新宋体,9pt,加粗。其中各个控件的位置是一定的。
6. 选中Form1在其属性事件中单击Load,添加如下代码:
private void Form1_Load(object sender, EventArgs e) //Form1_Load,用于基本开始界面的设置
{
string path; //定义字符串,用于存放“扫雷英雄榜.txt”的位置
path = System.Windows.Forms.Application.StartupPath; // bin路径
if (!File.Exists(path + "\\扫雷英雄榜.txt")) //if语句,主要是通过检测是否有扫雷英雄榜.txt,如果没有。。。
File.Create(path + "\\扫雷英雄榜.txt"); //创建扫雷英雄榜.txt
初级ToolStripMenuItem.Checked = true; //使菜单中的初级可用
Load_Mine(); //用于解决开始时单击任意按钮均胜利的问题
GameInit(); //游戏初始化
timer1.Enabled = true; //开启时钟计时
}
7. 设置button1按钮:在点击事件下加入如下代码:
private void button1_Click(object sender, EventArgs e) //这是一个开始按钮,单击即开始游戏
{
button1.Image = Image.FromFile("face.bmp"); //用于控制开始按钮的图标,开始时位笑脸
DelAllMines(); //删除所有的雷区控件(很重要,用于不让其改变等级时有参与)
RestMine = MineNum; //用于记录雷数,开始时剩余雷数为总雷数
CostTime = 0; //用于记录从开始到现在游戏用时,开始为0
label1.Text = CostTime.ToString(); //label1窗体中用于显示所用的时间
GamesBegin(); //开始游戏
GameInit(); //游戏初始化
timer1.Enabled = true; //触发计时器
}
设置button2按钮:在点击事件下加入如下代码:
private void button2_Click(object sender, EventArgs e) //显示所有的雷数
{
show(); //将地图中所有雷标识出来
}
private void show()//将地图中所有雷标识出来
{
for (int i = 0; i < XNum; i++)
for (int j = 0; j < YNum; j++)
if (Convert.ToInt16(Mines[i, j].Tag) == 1)
{
//==1时,代表这个位置是地雷
Mines[i, j].BackgroundImage = Image.FromFile("mine.bmp");
}
}
8. 分别通过菜单栏中选项的单击添加如代码:
private void 新游戏ToolStripMenuItem_Click(object sender, EventArgs e) //新游戏按钮的定义
{
button1.Image = Image.FromFile("face.bmp"); //开始时,让button1按钮的Image设为face.bmp
DelAllMines(); //删除所有的雷区控件(很重要,用于不让其改变等级时有参与)
RestMine = MineNum; //计数剩余的雷数
CostTime = 0; //计数所用时间
label1.Text = CostTime.ToString(); //用于在开始界面显示所用的时间
GamesBegin(); //开始游戏
GameInit();//游戏初始化
timer1.Enabled = true; //触发计时器
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) //定义退出
{
Application.Exit(); //单击退出
}
private void 自定义ToolStripMenuItem_Click(object sender, EventArgs e) //自定义按钮的定义
{
button1.Image = Image.FromFile("face.bmp"); //开始时,让button1按钮的Image设为face.bmp
初级ToolStripMenuItem.Checked = false; //初级按钮不可用
中级ToolStripMenuItem.Checked = false; //中级按钮不可用
高级ToolStripMenuItem.Checked = false; //高级按钮不可用
自定义ToolStripMenuItem.Checked = true; //自定义按钮可用
Form zdy = new Form2(); //通过定义调用新的Form窗体
zdy.ShowDialog(); //显示自定义窗体
if (zdy.DialogResult == DialogResult.OK) //如果在自定义窗体中单击 确定
zdyGames(); //开始自定义游戏
}
private void zdyGames() //自定义游戏
{
DelAllMines(); //删除残余雷片
XNum = zdyXNum; //定义雷区的列数
YNum = zdyYNum; //定义雷区的行数
MineNum = zdyMineNum; //定义总雷数
label1.Text = CostTime.ToString(); //用于在开始界面显示所用的时间
GamesBegin(); //开始游戏
GameInit();//游戏初始化
timer1.Enabled = true; //触发计时器
}
private void 关于扫雷ToolStripMenuItem1_Click(object sender, EventArgs e)
{
MessageBox.Show("游戏简介:\r\n\r\n------------------------------------------\r\n\r\n扫雷是单人计算机游戏,游戏的用户界面十分友好!\r\n\r\n------------------------------------------\r\n\r\n当游戏方格组成的战场构成开始时,计算机将固定的地雷数随机的放到战场的方格。\r\n\r\n------------------------------------------\r\n\r\n此游戏还允许玩家指定雷区中的地雷数,让您尽情玩到底!!\r\n\r\n------------------------------------------\r\n\r\n 据有关调查显示:此游戏具有开发智力少儿的功能!! ", " 说 明:"); //显示游戏简介
}
private void 关于游戏ToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("关于版权:\r\n\r\n本游戏是防Micosoft软件扫雷游戏 由\r\n\r\n 郑州轻工业学院 \r\n 计算机与通信工程学院\r\n 计算机科学与技术14-01班\r\n 李艳祥\r\n\r\n改编用于C#作业使用!特此声明!\r\n\r\n 辅导老师:李灿林\r\n\r\n 谢谢合作!!\r\n\r\n 如有雷同,纯属巧合", "版权声明:"); //显示游戏版本及版权说明
}
private void 关于扫雷ToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("游戏说明:\r\n\r\n ▲在“游戏”菜单上,单击“开局”;\r\n ▲要启动计时器,请单击游戏区中的任何方块;\r\n\r\n注意:\r\n\r\n ▲ 单击就可以揭开方块,如果揭开的是地雷,您便输掉游戏;\r\n ▲ 如果方块上出现数字,则表示在它周围的八个方块中共有多少颗地雷(0-8)如有都可将用不同的图片标示;\r\n ▲ 要标记您认为可能有地雷的方块,请右键单击它;\r\n ▲ 游戏区包括菜单、雷区、地雷计数器、计时器和开始按钮,请按游戏规则游戏!\r\n ▲本游戏的英雄榜是记录游戏者的成绩使用,因能力有限仅支持初中高级的游戏记录。并设置了重置功能,方便玩家。\r\n\r\n 谢谢您对本游戏的支持 小谢 祝 您游戏愉快!", "游戏说明:"); //游戏的使用说明,简介游戏使用问题
}
private void 扫雷英雄榜ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form herof = new Form3(); //定义新的窗体,通过关联调用
herof.Show(); //显示扫雷英雄棒的窗体
}
private bool IsInMineArea(int row, int col) //判断是否已出雷区
{
return (row >= 0 && row < XNum && col >= 0 && col < YNum); //返回true or false
}
private void button1_Click(object sender, EventArgs e) //这是一个开始按钮,单击即开始游戏
{
button1.Image = Image.FromFile("face.bmp"); //用于控制开始按钮的图标,开始时位笑脸
DelAllMines(); //删除所有的雷区控件(很重要,用于不让其改变等级时有参与)
RestMine = MineNum; //用于记录雷数,开始时剩余雷数为总雷数
CostTime = 0; //用于记录从开始到现在游戏用时,开始为0
label1.Text = CostTime.ToString(); //label1窗体中用于显示所用的时间
GamesBegin(); //开始游戏
GameInit(); //游戏初始化
timer1.Enabled = true; //触发计时器
}
private void DelAllMines() //删除所有的雷区
{
for (int i = 0; i < XNum; i++)
for (int j = 0; j < YNum; j++) //二维数组逐个删除
{
Button n = new Button(); //定义一个新的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 = 10 + MineWidth * x; //定义雷区开始在Form窗体中的左边界
Mines[x, y].Top = 65 + 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); //定义单击事件
Mines[x, y].Visible = true; //控制Mines按钮的可见
}
detform();
}
private void Load_Mine() //这个与上面的基本相同,主要是了解决在开始时单击人一个按钮均会胜利的问题,一下不做解释。
{
Turn = new int[XNum, YNum];
Mines = new Button[XNum, YNum];
for (int x = 0; x < XNum; x++)
for (int y = 0; y < YNum; y++)
{
Mines[x, y] = new Button();
this.Controls.Add(Mines[x, y]);
Mines[x, y].Left = 10 + MineWidth * x;
Mines[x, y].Top = 65 + MineWidth * y;
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;
Mines[x, y].Name = "Mines" + (x + y * XNum).ToString();
Mines[x, y].MouseUp += new MouseEventHandler(bt_MouseUp);
Mines[x, y].Visible = true;
}
}
private void detform() //决定form1的整体框架
{
button1.Location = new Point( -10 + XNum * MineWidth/2 , -1 ); //控制form1中的button1按钮开始的位置
button2.Location = new Point(-25 + XNum * MineWidth / 2, 65 + YNum * MineWidth); ////控制form1中的button2按钮开始的位置
panel1.Size = new Size(30 + MineWidth * XNum, 35); //控制panel1的大小
label2.Location = new Point(XNum * MineWidth - 30, 7); //控制label2的位置
Form1.ActiveForm.Width = 30 + MineWidth * XNum; //用于控制form窗体的宽度
Form1.ActiveForm.Height = 130 + MineWidth * YNum; //用于控制form窗体的高度
}
private void GameInit() //游戏初始化
{
RestMine = MineNum;
label1.Text = RestMine.ToString();
for (int x = 0; x < XNum; x++)
for (int y = 0; y < YNum; y++)
{
Mines[x, y].Text = "";
Mines[x, y].Visible = true;
Mines[x, y].Enabled = true;
Mines[x, y].Tag = null;
Mines[x, y].BackgroundImage = null;
Turn[x, y] = 0; //刚开始都未插旗、未表示为雷
}
LayMines();
}
private void timer1_Tick(object sender, EventArgs e) //定义计时器
{
CostTime++;
label2.Text = CostTime.ToString();
}
private void bt_MouseUp(object sender, MouseEventArgs e) //这里处理事件方法
{
String btName;
Button bClick = (Button)sender; //将被击的按钮赋给定义的bClick变量
btName = bClick.Name; //获取按钮的Name
int n = Convert.ToInt16(btName.Substring(5));
int x = n % XNum;
int y = n / XNum;
//通过按钮Name属性来判断是哪个Button被点击,并执行相应的操作
switch (e.Button)
{
case MouseButtons.Left:
if (Convert.ToInt16(Mines[x, y].Tag) != 1)
{
detpicture(GetAroundNum(x, y), x, y);
Mines[x, y].Enabled = false;
ExpandMines(x, y);
if (Victory())
{
// 判断是否胜利,是则将地图中所有雷标识出来
show();
MessageBox.Show("恭喜您,胜利啦!!!", "游戏结束");
Form v = new Form4();
v.ShowDialog();
timer1.Enabled = false;//停止计时
// Endsgames();
}
}
else
{
Mines[x, y].BackgroundImage = Image.FromFile("mine1.bmp");
button1.Image = Image.FromFile("face1.jpg");
MessageBox.Show("真的很遗憾,您失败啦!!!", "游戏结束");
timer1.Enabled = false;//停止计时
Endall();
}
break;
case MouseButtons.Right:
Mines[x, y].BackgroundImage = Image.FromFile("flag.bmp");
if (Turn[x, y] == 1)//表示这个位置插上红旗
{
Turn[x, y] = 0;//取消红旗,表示这个位置没有翻开
RestMine++;
Mines[x, y].BackgroundImage = null;
}
else
{
Turn[x, y] = 1;//表示这个位置插上红旗
RestMine--;
}
label1.Text = RestMine.ToString();
if (Victory())
{
MessageBox.Show("恭喜您,胜利啦!!!", "游戏结束");
Form vic = new Form4();
vic.ShowDialog();
timer1.Enabled = false;//停止计时
}
break;
}
}
private void Endall()
{
for (int i = 0; i < XNum; i++)
for (int j = 0; j < YNum; j++)
{
Mines[i, j].Enabled = false;
}
}
private void LayMines() //布雷
{
int x, y;
Random s = new Random();
//取随机数
for (int i = 0; i < MineNum; )
{
//取随机数
x = s.Next(XNum); //取随机数,返回一个小于所指定最大值的非负随机数
y = s.Next(YNum);
if (Convert.ToInt16(Mines[x, y].Tag) != 1)
{
//==1时,代表这个位置是地雷
Mines[x, y].Tag = 1;//修改属性为雷
//Mines[x, y].Text = "u";
i++;
}
}
label1.Text = MineNum.ToString();
CostTime = 0;
label2.Text = StartTime.ToString();
}
private void detpicture(int n, int i, int j) //用于调用不同的图片显示所单击按钮周围所剩的雷数
{
switch (n)
{
case 1:
{
Mines[i, j].BackgroundImage = Image.FromFile("1.PNG");
break;
}
case 2:
{
Mines[i, j].BackgroundImage = Image.FromFile("2.PNG");
break;
}
case 3:
{
Mines[i, j].BackgroundImage = Image.FromFile("3.PNG");
break;
}
case 4:
{
Mines[i, j].BackgroundImage = Image.FromFile("4.PNG");
break;
}
case 5:
{
Mines[i, j].BackgroundImage = Image.FromFile("5.PNG");
break;
}
case 6:
{
Mines[i, j].BackgroundImage = Image.FromFile("6.PNG");
break;
}
case 7:
{
Mines[i, j].BackgroundImage = Image.FromFile("7.PNG");
break;
}
case 8:
{
Mines[i, j].BackgroundImage = Image.FromFile("8.PNG");
break;
}
}
}
private int GetAroundNum(int row, int col) //用于获取所单击按钮周围8个雷块中所剩的雷数
{
int i, j;
int around = 0; //定义所生的雷数,开始为0
int minRow = (row == 0) ? 0 : row - 1;
int maxRow = row + 2;
int minCol = (col == 0) ? 0 : col - 1;
int maxCol = col + 2;
for (i = minRow; i < maxRow; i++)
{
for (j = minCol; j < maxCol; j++) //[row,col]处没有雷
{
if (!IsInMineArea(i, j)) //判断是否在扫雷区域
continue;
if (Convert.ToInt16(Mines[i, j].Tag) == 1) around++;
}
}
return around; //返回所生的雷数
}
private void ExpandMines(int row, int col)
{
int i, j;
int minRow = (row == 0) ? 0 : row - 1;
int maxRow = row + 2;
int minCol = (col == 0) ? 0 : col - 1;
int maxCol = col + 2;
int around = GetAroundNum(row, col); //对周围一个雷都没有的空白区域拓展
if (around == 0)
{
Mines[row, col].Enabled = false;
for (i = minRow; i < maxRow; i++)
{
for (j = minCol; j < maxCol; j++)
{
//对于周围可以拓展的区域进行的规拓展
if (!IsInMineArea(i, j)) continue;
if (!(i == row && j == col) && Mines[i, j].Enabled != false) //&& Convert.ToInt16(Mines[i,j].Tag)!= 1
{
ExpandMines(i, j);
}
Mines[i, j].Enabled = false; //周围无雷的区域按钮无效
detpicture(GetAroundNum(i, j), i, j);
}
}
}
}
private bool Victory() // 检测是否胜利
{
for (int i = 0; i < XNum; i++)
for (int j = 0; j < YNum; j++)
{
//没翻开且未标示,则未成功
if (Mines[i, j].Enabled == true && Turn[i, j] != 1)
return false;
//不是雷却误标示为雷,则也未成功
if (Convert.ToInt16(Mines[i, j].Tag) != 1 && Turn[i, j] == 1)
return false;
}
return true;
}
并定义如下变量:
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; // 控制雷块的大小
自定义窗体:
1. 通过单击项目,添加Windows窗体,添加一个Windows窗体,命名为Form2(可能程序中有点问题,因为我改过的),把其text属性改为:自定义. . .,并在icon中添加图片。
2. 添加一个groupbox窗体,把其text属性改为:请自定义难度. . . ,在其中添加3个label控件和3个textbox控件,按如图所示布局,再添加2个button按钮,分别把其属性改为:确定、取消。
3. 在Form1的Load属性中添加如下代码:
private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
}
通过button1和button2按钮的点击属性添加如下代码:
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == "")
{
MessageBox.Show("不要激动!请输入完整!!", "提示", MessageBoxButtons.OK);
return;
}
int h, w, m;
h = Convert.ToInt16(textBox1.Text);
w = Convert.ToInt16(textBox2.Text);
m = Convert.ToInt16(textBox3.Text);
if (m > h * w)
{
MessageBox.Show("雷量太大,请重新输入!", "提示", MessageBoxButtons.OK);
return;
}
if (h < 9 || h > 24 || w < 9 || w > 40 || m < 10 || m > 668)
{
MessageBox.Show("系统错误,请按要求填写!谢谢!!", "提示", MessageBoxButtons.OK);
return;
}
扫雷_xxb.Form1.zdyXNum = w;
扫雷_xxb.Form1.zdyYNum = h;
扫雷_xxb.Form1.zdyMineNum = m;
this.Close();
DialogResult = DialogResult.OK;
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
DialogResult = DialogResult.Cancel;
}
英雄榜窗体:
同上添加Form3窗体,改变其中的Image和text属性,设计好其大小:
在From3中添加label,textbox,button按钮各一个。在Form3的Load的事件中添加如下代码:
private void Form3_Load(object sender, EventArgs e)
{
string path1, mr1 = "名字\t\t成绩\r\n", mystr1 = "";
path1 = System.Windows.Forms.Application.StartupPath;
FileStream fs1 = File.OpenRead(path1 + "\\扫雷英雄榜.txt");
StreamReader sr1 = new StreamReader(fs1);
fs1.Seek(0, SeekOrigin.Begin);
while (sr1.Peek() > -1)
{
mystr1 += sr1.ReadLine() + "\t\t";
mystr1 += sr1.ReadLine() + "\r\n";
}
sr1.Close();
fs1.Close();
textBox1.Text = mr1 + mystr1;
}
在button1_click事件中添加如下代码:
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
请输入窗体:
1. 添加窗体Form4,如图改变Icon属性和text属性,在分别添加一个label控件,一个textbox控件和一个button控件,把label的text改为:人外有人,天外有天。兄弟,输入你的尊姓大名吧button1的text属性改为 确定。并在picturebox属性中添加图片 校园。
2. 在button1_Click事件下添加如下代码:
private void button1_Click(object sender, EventArgs e)
{
string path = System.Windows.Forms.Application.StartupPath; // bin路径
string name;
name = textBox1.Text;
if (name == "")
{
this.Close();
return;
}
string mystr = "";//mr = "名字\t\t成绩\r\n",
path = System.Windows.Forms.Application.StartupPath; // bin路径
FileStream fs = File.OpenRead(path + "\\扫雷英雄榜.txt");
StreamReader sr = new StreamReader(fs);
fs.Seek(0, SeekOrigin.Begin);
while (sr.Peek() > -1)
{
mystr += sr.ReadLine() + "\t\t";
mystr += sr.ReadLine();
}
sr.Close();
fs.Close();
mystr += name + "\r\n" + 扫雷_xxb.Form1.CostTime.ToString() + "\r\n";
FileStream fsa = File.OpenWrite(path + "\\扫雷英雄榜.txt");
StreamWriter sw = new StreamWriter(fsa);
sw.WriteLine(mystr);
sw.Close();
fsa.Close();
this.Close();
}
四、程序运行结果与分析
1. 单机游戏的运行结果如图:
五、实训心得
本次在做C#扫雷的过程中使我明白了,只要努力的不断接受新知识才能适应时代的发展,才能掌握更多的知识去迎接新的挑战。
从接到C#作业的那一刻,到现在我成扫雷的完整版的整个过程中自己遇到啦很多的困难,也不止一次的向老师,同学们求助,在此表示感谢!!谢谢他们对我的支持。
在第一次的考虑雷区的重载问题,即队已经定一定二维数组的在此初始化,经过向老师求助,明白只要通过 this.Controls.Remove(Mines[i, j]);,从界面上删掉在初级时加进来的雷方块控件。
当然,在其中还有很多的问题,如怎么调用不同的窗体,怎么在程序的运行过程中改变图片,如何通过Loction、Size、ActiveForm等来控制所需控件在Form窗体中的位置,大小,和控制Form控件的大小。
总之:不经过实践就不知道自己有多少东西不会,自己有多少东西需要继续学习,相信我会继续努力,继续前行,继续在未知中求索。
第二部分
学生成绩管理信息系统的设计与实现
一、实训目的
二、实训内容
三、数据库设计
四、程序开发操作步骤
五、程序运行结果与分析
六、实训心得