practice_code/c/code/idea/minesweeper.c
2024-02-18 14:13:11 +08:00

504 lines
16 KiB
C

#include<stdio.h>
#include <time.h>
#include <stdlib.h>
//声明主页
void home_procedure ( int figure );
//打印界面
void print_interface ( int size , char array[size][size] )
{
for ( int i = 0 ; i < size ; i ++ )
{
for ( int j = 0 ; j < size ; j ++ )
{
printf ( " %c " , array[ i ][ j ] );
}
printf ( "\n" );
}
}
//初始化显示界面
char initialization_appear_map ( int size , char appear_map[size][size] )
{
for ( int i = 0 ; i < size ; i ++ )
{
for ( int j = 0 ; j < size ; j ++ )
{
appear_map[ i ][ j ] = '#';
}
}
}
//初始化结果界面
char initialization_result_map ( int size , int bomb , char result_map[size][size] )
{
//将界面全部初始化为空
for ( int i = 0 ; i < size ; i ++ )
{
for ( int j = 0 ; j < size ; j ++ )
{
result_map[ i ][ j ] = '-';
}
}
//随机生成炸弹
int i = 1;//需要生成的炸弹自增
while ( i <= bomb )
{
int x = rand ( ) % size;//获随机取炸弹横坐标
int y = rand ( ) % size;//获随机取炸弹纵坐标
if ( result_map[ y ][ x ] == '-' )
{
result_map[ y ][ x ] = '*';
++ i;
}
}
//生成数字
for ( i = 0 ; i < size ; i ++ )
{
for ( int j = 0 ; j < size ; j ++ )
{
if ( result_map[ i ][ j ] == '-' )
{
char integral = '0';//初始化积分
if ( result_map[ i ][ j + 1 ] == '*' && j < size && j + 1 < size )//判断右边的雷
{
integral += 1;
}
if ( result_map[ i ][ j - 1 ] == '*' && j > 0 & j - 1 >= 0 )//判断左边的雷
{
integral += 1;
}
if ( result_map[ i + 1 ][ j ] == '*' && i > 0 &&i+1<size)//判断上边的雷
{
integral += 1;
}
if ( result_map[ i - 1 ][ j ] == '*' && i < size &&i-1>=0)//判断下边的雷
{
integral += 1;
}
if ( result_map[ i - 1 ][ j + 1 ] == '*' && i > 0 &&i-1>=0&& j+1 < size )//判断右上的雷
{
integral += 1;
}
if ( result_map[ i + 1 ][ j + 1 ] == '*' && i+1 < size && j+1 < size )//判断右下的雷
{
integral += 1;
}
if ( result_map[ i + 1 ][ j - 1 ] == '*' && i+1 < size && j-1 >= 0 )//判断左下的雷
{
integral += 1;
}
if ( result_map[ i - 1 ][ j - 1 ] == '*' && i-1 >= 0 && j-1 >= 0 )//判断左上的雷
{
integral += 1;
}
if ( integral != '0' )
{
result_map[ i ][ j ] = integral;
}
}
}
}
}
//复制数组
void copy_array ( int size , char array_a[size][size] , char array_b[size][size] )
{
for ( int i = 0 ; i < size ; i ++ )
{
for ( int j = 0 ; j < size ; j ++ )
{
array_a[ i ][ j ] = array_b[ i ][ j ];
}
}
}
//储存和判断
int replace_appear_map ( int integral , int size , int coordinate_y , int coordinate_x , char appear_map[size][size] ,
char copy_appear_map[size][size] , char result_map[size][size]
)
{
int copy_coordinate_x = coordinate_x;//备份x
int copy_coordinate_y = coordinate_y;//备份y
if ( result_map[ coordinate_y ][ coordinate_x ] == '*' )//判断有没有雷
{
while ( getchar ( ) != '\n' );//清除缓存
print_interface ( size , result_map );//输出原版地图
printf ( "——踩到地雷了——\n" );
printf ( " ***** \n" );
printf ( " * * \n" );
printf ( "* O O *\n" );
printf ( "* ^ *\n" );
printf ( " * /___\\ \n" );
printf ( " ***** \n" );
home_procedure ( 1 );//返回主页
}
else if ( appear_map[ coordinate_y ][ coordinate_x ] == '&' )//判断有无旗
{
while ( getchar ( ) != '\n' );//清除缓存
printf ( "此处有旗\n" );
}
else//点开
{
copy_appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换备份地图
appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换显示地图
if ( result_map[ coordinate_y ][ coordinate_x ] == '-' )//空白情况
{
while ( result_map[ coordinate_y ][ coordinate_x - 1 ] == '-' )
{
integral += 1;
-- coordinate_x;
copy_appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换备份地图
appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换显示地图
}
coordinate_x = copy_coordinate_x;//还原x
while ( result_map[ coordinate_y ][ coordinate_x + 1 ] == '-' )
{
integral += 1;
++ coordinate_x;
copy_appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换备份地图
appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换显示地图
}
coordinate_x = copy_coordinate_x;//还原x
while ( result_map[ coordinate_y - 1 ][ coordinate_x ] == '-' )
{
integral += 1;
-- coordinate_y;
copy_appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换备份地图
appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换显示地图
}
coordinate_x = copy_coordinate_x;//还原x
while ( result_map[ coordinate_y + 1 ][ coordinate_x ] == '-' )
{
integral += 1;
++ coordinate_y;
copy_appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换备份地图
appear_map[ coordinate_y ][ coordinate_x ] = result_map[ coordinate_y ][ coordinate_x ];//替换显示地图
}
coordinate_x = copy_coordinate_y;//还原y
}
return integral + 1;//增加一个回合
}
}
//扫雷程序
void mode_procedure ( int size , int bomb )
{
int integral = 0;//判断下了多少次
int coordinate_x = 0;//为储存横坐标申请内存空间
int coordinate_y = 0;//为储存纵坐标申请内存空间
char result_map[size][size];//为结果界面申请内存空间
char appear_map[size][size];//为显示界面申请内存空间
char copy_appear_map[size][size];//为显示界面的复制申请内存空间
initialization_appear_map ( size , appear_map );//初始化显示界面
initialization_result_map ( size , bomb , result_map );//初始化结果界面
copy_array ( size , copy_appear_map , appear_map );//复制显示数组
copy_appear_map[ coordinate_y ][ coordinate_x ] = '@';//设置备份数组第一次显示
while ( 1 )
{
if ( integral == size * size - bomb )
{
while ( getchar ( ) != '\n' );//清除缓存
printf ( "——扫雷成功———" );
printf ( " ***** \n" );
printf ( " * * \n" );
printf ( "* O O *\n" );
printf ( "* ∇ *\n" );
printf ( " * \\___/ \n" );
printf ( " ***** \n" );
home_procedure ( 1 );//返回主页
}
char pick;//初始化用户的选择
print_interface ( size , copy_appear_map );//打印当前界面
printf ( "输入W,S,A,D进行上下左右移动\n" );
printf ( "输入Q确认选择,输入E插旗\n" );
printf ( ":" );
while ( getchar ( ) != '\n' );//清除缓存
scanf ( "%c" , & pick );//获取用户的选择
if ( pick == 'W' || pick == 'w' )//判断向上
{
if ( coordinate_y <= 0 )
{
coordinate_y = 0;
}
else
{
copy_appear_map[ coordinate_y ][ coordinate_x ] = appear_map[ coordinate_y ][ coordinate_x ];
coordinate_y -= 1;
copy_appear_map[ coordinate_y ][ coordinate_x ] = '@';
}
}
if ( pick == 'S' || pick == 's' )//判断向下
{
if ( coordinate_y >= size - 1 )
{
coordinate_y = size - 1;
}
else
{
copy_appear_map[ coordinate_y ][ coordinate_x ] = appear_map[ coordinate_y ][ coordinate_x ];
coordinate_y += 1;
copy_appear_map[ coordinate_y ][ coordinate_x ] = '@';
}
}
if ( pick == 'A' || pick == 'a' )//判断向左
{
if ( coordinate_x <= 0 )
{
coordinate_x = 0;
}
else
{
copy_appear_map[ coordinate_y ][ coordinate_x ] = appear_map[ coordinate_y ][ coordinate_x ];
coordinate_x -= 1;
copy_appear_map[ coordinate_y ][ coordinate_x ] = '@';
}
}
if ( pick == 'D' || pick == 'd' )//判断向右
{
if ( coordinate_x >= size - 1 )
{
coordinate_x = size - 1;
}
else
{
copy_appear_map[ coordinate_y ][ coordinate_x ] = appear_map[ coordinate_y ][ coordinate_x ];
coordinate_x += 1;
copy_appear_map[ coordinate_y ][ coordinate_x ] = '@';
}
}
if ( pick == 'Q' || pick == 'q' )//判断确定
{
integral = replace_appear_map ( integral , size , coordinate_y , coordinate_x , appear_map ,
copy_appear_map , result_map );
}
if ( pick == 'E' || pick == 'e' )//判断插旗
{
if ( appear_map[ coordinate_y ][ coordinate_x ] == '&' )
{
appear_map[ coordinate_y ][ coordinate_x ] = '#';
copy_appear_map[ coordinate_y ][ coordinate_x ] = '#';
}
else if ( appear_map[ coordinate_y ][ coordinate_x ] == '#' )
{
appear_map[ coordinate_y ][ coordinate_x ] = '&';
copy_appear_map[ coordinate_y ][ coordinate_x ] = '&';
}
}
}
}
//选择难度
void difficulty_procedure ( int length , int mode )
{
char pick;//接收用户的选择
char mode_a[] = "简单模式 \n";
char mode_b[] = "困难模式 \n";
char mode_c[] = "地狱模式 \n";
char mode_n[] = "返回上级 \n";
char mode_e[] = "简答模式←\n";
char mode_f[] = "困难模式←\n";
char mode_g[] = "地狱模式←\n";
char mode_m[] = "返回上级←\n";
printf ( "——模式选择——\n" );
switch ( mode )
{
case 1:
{
printf ( "%s" , mode_e );
printf ( "%s" , mode_b );
printf ( "%s" , mode_c );
printf ( "%s" , mode_n );
break;
}
case 2:
{
printf ( "%s" , mode_a );
printf ( "%s" , mode_f );
printf ( "%s" , mode_c );
printf ( "%s" , mode_n );
break;
}
case 3:
{
printf ( "%s" , mode_a );
printf ( "%s" , mode_b );
printf ( "%s" , mode_g );
printf ( "%s" , mode_n );
break;
}
case 4:
{
printf ( "%s" , mode_a );
printf ( "%s" , mode_b );
printf ( "%s" , mode_n );
printf ( "%s" , mode_m );
break;
}
}
printf ( "输入W,S进行上下移动\n" );
printf ( "输入Q确认\n" );
printf ( ":" );
while ( getchar ( ) != '\n' );//清除缓存
scanf ( "%c" , & pick );
if ( pick == 'q' || pick == 'Q' )
{
switch ( mode )
{
case 1:
{
mode_procedure ( length , length * length / 5 );
break;
}
case 2:
{
mode_procedure ( length , length * length / 3 );
break;
}
case 3:
{
mode_procedure ( length , length * length / 2 );
break;
}
case 4:
{
home_procedure ( 1 );
break;
}
}
}
else if ( pick == 'W' || pick == 'w' )
{
mode -= 1;
if ( mode <= 1 )
{
mode = 1;
}
difficulty_procedure ( length , mode );//返回主页
}
else if ( pick == 'S' || pick == 's' )
{
mode += 1;
if ( mode >= 4 )
{
mode = 4;
}
difficulty_procedure ( length , mode );//返回主页
}
else
{
difficulty_procedure ( length , mode );//返回主页
}
}
//主页
void home_procedure ( int figure )
{
char pick;//接收用户的选择
char mode_a[] = "初级模式 \n";
char mode_b[] = "中级模式 \n";
char mode_c[] = "高级模式 \n";
char mode_n[] = "退出游戏 \n";
char mode_e[] = "初级模式←\n";
char mode_f[] = "中级模式←\n";
char mode_g[] = "高级模式←\n";
char mode_m[] = "退出游戏←\n";
printf ( "——扫雷——\n" );
switch ( figure )
{
case 1:
{
printf ( "%s" , mode_e );
printf ( "%s" , mode_b );
printf ( "%s" , mode_c );
printf ( "%s" , mode_n );
break;
}
case 2:
{
printf ( "%s" , mode_a );
printf ( "%s" , mode_f );
printf ( "%s" , mode_c );
printf ( "%s" , mode_n );
break;
}
case 3:
{
printf ( "%s" , mode_a );
printf ( "%s" , mode_b );
printf ( "%s" , mode_g );
printf ( "%s" , mode_n );
break;
}
case 4:
{
printf ( "%s" , mode_a );
printf ( "%s" , mode_b );
printf ( "%s" , mode_c );
printf ( "%s" , mode_m );
break;
}
}
printf ( "输入W,S进行上下移动\n" );
printf ( "输入Q进入\n" );
printf ( ":" );
scanf ( "%c" , & pick );
if ( pick == 'q' || pick == 'Q' )
{
switch ( figure )
{
case 1:
{
difficulty_procedure ( 9 , 1 );
}
case 2:
{
difficulty_procedure ( 12 , 1 );
}
case 3:
{
difficulty_procedure ( 15 , 1 );
}
case 4:
{
printf ( "欢迎下次使用\n" );
exit ( 0 );
}
}
}
else if ( pick == 'W' || pick == 'w' )
{
figure -= 1;
if ( figure <= 1 )
{
figure = 1;
}
home_procedure ( figure );//返回主页
}
else if ( pick == 'S' || pick == 's' )
{
figure += 1;
if ( figure >= 4 )
{
figure = 4;
}
home_procedure ( figure );//返回主页
}
else
{
home_procedure ( figure );
}
}
//主函数
int main ()
{
srand ( ( unsigned ) time ( NULL ) );//将当前时间戳设置为随机种子
home_procedure ( 1 );//进入主页
return 0;
}