C#控制台实现扫雷程序.docx
《C#控制台实现扫雷程序.docx》由会员分享,可在线阅读,更多相关《C#控制台实现扫雷程序.docx(12页珍藏版)》请在冰点文库上搜索。
C#控制台实现扫雷程序
C#在控制台实现扫雷程序
最终运行结果如图所示
使用说明
玩法同系统自带扫雷游戏规则
按Enter键”踩有无雷”
按M键标记有雷区域
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespacetest
{
classProgram
{
staticvoidMain(string[]args)
{
intn=int.Parse(Console.ReadLine());//用户输入扫雷二维数组大小
int[,]mine=newint[n,n];//定义一个扫雷二维数组
int[,]record=newint[n,n];//定义一个记录用户当前判定情况的二维数组
int[,]amount=newint[n,n];//记录以当前方块为中心的周围八个方块中雷的数量
intmc=0;
for(inti=0;i{
for(intj=0;j{
record[i,j]=-2;
}
}
Randomr=newRandom();//随机布雷
for(inti1=0;i1{
for(intj1=0;j1{
mine[i1,j1]=r.Next(0,4)/3;//从0到2中产生随机数0,1其中0代表无雷,而1代表有雷
}
}
//遍历出雷的数量
for(inti2=0;i2{
for(intj2=0;j2{
if(mine[i2,j2]==1)
mc++;
}
}
//记录以当前方块为中心的周围八个方块中雷的数量的产生方法
intmine_count=0;//雷的数量
for(inti=0;i{
for(intj=0;j{
if(mine[i,j]!
=1)
{
if(i-1<0||j-1<0||i+1>n-1||j+1>n-1)
{
if(i-1<0&&j-1<0)//左上角
{
if(mine[i+1,j]==1)
mine_count++;
if(mine[i,j+1]==1)
mine_count++;
if(mine[i+1,j+1]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
if(j-1>=0&&j+1<=n-1&&i-1<0)//上边
{
if(mine[i,j-1]==1)
mine_count++;
if(mine[i+1,j-1]==1)
mine_count++;
if(mine[i+1,j]==1)
mine_count++;
if(mine[i+1,j+1]==1)
mine_count++;
if(mine[i,j+1]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
if(i-1<0&&j+1>n-1)//右上角
{
if(mine[i,j-1]==1)
mine_count++;
if(mine[i+1,j-1]==1)
mine_count++;
if(mine[i+1,j]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
if(j+1>n-1&&i-1>=0&&i+1<=n-1)//右边
{
if(mine[i-1,j]==1)
mine_count++;
if(mine[i-1,j-1]==1)
mine_count++;
if(mine[i,j-1]==1)
mine_count++;
if(mine[i+1,j-1]==1)
mine_count++;
if(mine[i+1,j]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
if(i+1>n-1&&j+1>n-1)//右下角
{
if(mine[i-1,j-1]==1)
mine_count++;
if(mine[i-1,j]==1)
mine_count++;
if(mine[i,j-1]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
if(i+1>n-1&&j-1>=0&&j+1<=n-1)//下边
{
if(mine[i-1,j-1]==1)
mine_count++;
if(mine[i,j-1]==1)
mine_count++;
if(mine[i-1,j]==1)
mine_count++;
if(mine[i-1,j+1]==1)
mine_count++;
if(mine[i,j+1]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
if(j-1<0&&i+1>n-1)//左下角
{
if(mine[i-1,j]==1)
mine_count++;
if(mine[i-1,j+1]==1)
mine_count++;
if(mine[i,j+1]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
if(j-1<0&&i-1>=0&&i+1<=n-1)//左边
{
if(mine[i-1,j]==1)
mine_count++;
if(mine[i-1,j+1]==1)
mine_count++;
if(mine[i,j+1]==1)
mine_count++;
if(mine[i+1,j+1]==1)
mine_count++;
if(mine[i+1,j]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
}
else
{
if(mine[i-1,j-1]==1)
mine_count++;
if(mine[i-1,j+1]==1)
mine_count++;
if(mine[i+1,j-1]==1)
mine_count++;
if(mine[i+1,j+1]==1)
mine_count++;
if(mine[i-1,j]==1)
mine_count++;
if(mine[i+1,j]==1)
mine_count++;
if(mine[i,j-1]==1)
mine_count++;
if(mine[i,j+1]==1)
mine_count++;
amount[i,j]=mine_count;
mine_count=0;
}
}
else
amount[i,j]=-1;
}
}
//扫雷布局,灰色为判断区域
for(inti=0;i{
for(intj=0;j{
Console.BackgroundColor=ConsoleColor.Gray;//判断区域
Console.Write("");//空格代表
Console.BackgroundColor=ConsoleColor.Black;//返回系统默认颜色
Console.Write("");//将判断区域隔开
}
Console.WriteLine("\n");//两次换行
}
Console.CursorLeft=0;//将光标定位到第0列
Console.CursorTop=1;//将光标定位到第1行,因为用户输入占了一行
intx=0;//数组横坐标,就是第几列
inty=0;//数组纵坐标,就是第几行
while(true)
{
intmark_count=0;//标记雷的数量
intremainder=0;//剩余的数量
for(inti=0;i{
for(intj=0;j{
if(record[i,j]==-2)
remainder++;//
if(record[i,j]==-1)
mark_count++;
}
}
if(remainder==0&&mark_count==mc)
{
Console.Clear();
Console.WriteLine("YouWin");
break;
}
ConsoleKeyck=Console.ReadKey(true).Key;//获取用户按键
if(ck==ConsoleKey.DownArrow)//向下键
{
if(Console.CursorTop==2*n-1)//判断是否会超出雷区范围
{
Console.CursorTop=1;
y=0;
}
else
{
Console.CursorTop+=2;
y++;
}
}
if(ck==ConsoleKey.UpArrow)//向上键
{
if(Console.CursorTop==1)//判断是否会超出雷区范围
{
Console.CursorTop=2*n-1;
y=n-1;//数组的值改变
}
else
{
Console.CursorTop-=2;
y--;
}
}
if(ck==ConsoleKey.LeftArrow)//向左键
{
if(Console.CursorLeft==0)
{
Console.CursorLeft=2*n-2;
x=n-1;
}
else
{
Console.CursorLeft-=2;
x--;//数组的值改变
}
}
if(ck==ConsoleKey.RightArrow)//向右键
{
if(Console.CursorLeft==2*n-2)
{
Console.CursorLeft=0;
x=0;
}
else
{
Console.CursorLeft+=2;
x++;
}
}
if(ck==ConsoleKey.M)//标记雷区
{
Console.Clear();//清屏重新打印
Console.WriteLine(n);
record[x,y]=-1;
for(inti=0;i{
for(intj=0;j{
if(record[j,i]!
=-2)//若满足当前的坐标值的话,就用红色背景标注
{
if(record[j,i]==-1)
{
Console.BackgroundColor=ConsoleColor.Red;
Console.Write("");
Console.BackgroundColor=ConsoleColor.Black;
Console.Write("");
}
if(record[j,i]!
=-1)
{
Console.BackgroundColor=ConsoleColor.Gray;