最近三天国内重大新闻,网站推广与优化怎么做,知识产权网站开发,羊毛网站建设视频和三子棋一样#xff0c;主函数先设计游戏菜单界面#xff0c;这里就不做展示了。 初始化棋盘 初级扫雷大小为9*9的棋盘#xff0c;但排雷是周围一圈进行排雷(8格)#xff0c;而边界可能会越界。数组扩大了一圈,行和列都加了2#xff0c;所以我们用一个11*11的数组来初始化… 和三子棋一样主函数先设计游戏菜单界面这里就不做展示了。 初始化棋盘 初级扫雷大小为9*9的棋盘但排雷是周围一圈进行排雷(8格)而边界可能会越界。数组扩大了一圈,行和列都加了2所以我们用一个11*11的数组来初始化棋盘。 同时为了让玩家定位哪一行哪一列的坐标我们要将行列打印出来。 #define ROW 9
#define COL 9#define ROWS ROW2
#define COLS COL2
//初级10个雷
#define EASY_COUNT 10
由于是两个棋盘初始化我们可以多传一个字符参数初始化不同棋盘
void init_mine(char board[ROWS][COLS], int rows, int cols, char set)
{for (int i 0; i rows; i){for (int j 0; j cols; j){board[i][j] set;}}
}
棋盘打印 由于扫雷游戏的特殊性我们要设计两个棋盘一个用于放置雷的信息(存放两种字符0为无雷1为有雷)一个用于放排查出的雷信息(*为默认界面数字字符代表周围8格雷的个数)。 void display_board(char board[ROWS][COLS], int row, int col)
{int i 0;int j 0;for (j 0; j col; j){printf(%d , j);//列打印}printf(\n);for (i 1; i row; i){printf(%d , i);//行打印for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);}
} 由于数组是从下标一开始的这里我们防止打印的行列错位可以打印个0来对齐。 设置雷 在9*9棋盘里随机放雷雷用字符1表示初级放10个雷。 void set_mine(char mine[ROWS][COLS], int row, int col)
{int n EASY_COUNT;while (n--){int i rand() % row1;//1~9int j rand() % col1;if (mine[i][j] 0)mine[i][j] 1;}
} 效果 找雷 找雷要分几个流程先选择坐标然后显示该坐标是雷还是安全区如果是雷游戏结束。如果是安全区还需判断4周有多少雷获胜条件是将所有安全区标出即可胜利。 在此基础上还要检查坐标是否越界以及是否被排查过等问题。 void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x 0;int y 0;int win 0;while (win col * row - EASY_COUNT){printf(请输入要排查雷的坐标:);scanf(%d %d, x, y);if (x 1 x row y1 ycol){if (mine[x][y] ! 1){if (show[x][y] *){int ret get_mine_count(mine, x, y);show[x][y] ret 0;//得到雷的个数(字符)display_board(show, ROW, COL);win;}else printf(坐标被占用\n);}else{printf(踩雷了游戏结束\n);break;}}else{printf(坐标非法\n );}}if (win row * col - EASY_COUNT){printf(恭喜你排雷成功\n);display_board(mine, ROW, COL);}
}
获取周围雷 我们用到0~1字符ascii码连续的特点(相差1)将8个坐标相加减去8个0的ASCII码值就得到雷的个数。 int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return (mine[x - 1][y] mine[x - 1][y - 1] mine[x][y - 1] mine[x 1][y - 1] mine[x 1][y] mine[x 1][y 1] mine[x][y 1] mine[x - 1][y 1] - 8 * 0);} 测试时我们可以将放雷的数组打印出来方便观察周围是否有相应个数的雷测试游戏胜利也可以将雷的个数设置多一些判断胜利是否正常输出。 完整代码
//game.c
#include game.h
void init_mine(char board[ROWS][COLS], int rows, int cols, char set)
{for (int i 0; i rows; i){for (int j 0; j cols; j){board[i][j] set;}}
}
void display_board(char board[ROWS][COLS], int row, int col)
{int i 0;int j 0;for (j 0; j col; j){printf(%d , j);}printf(\n);for (i 1; i row; i){printf(%d , i);for (j 1; j col; j){printf(%c , board[i][j]);}printf(\n);}
}
void set_mine(char mine[ROWS][COLS], int row, int col)
{int n EASY_COUNT;while (n--){int i rand() % row1;//1~9int j rand() % col1;if (mine[i][j] 0)mine[i][j] 1;}
}
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return (mine[x - 1][y] mine[x - 1][y - 1] mine[x][y - 1] mine[x 1][y - 1] mine[x 1][y] mine[x 1][y 1] mine[x][y 1] mine[x - 1][y 1] - 8 * 0);}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x 0;int y 0;int win 0;while (win col * row - EASY_COUNT){printf(请输入要排查雷的坐标:);scanf(%d %d, x, y);if (x 1 x row y1 ycol){if (mine[x][y] ! 1){if (show[x][y] *){int ret get_mine_count(mine, x, y);show[x][y] ret 0;//得到雷的个数(字符)display_board(show, ROW, COL);win;}else printf(坐标被占用\n);}else{printf(踩雷了游戏结束\n);break;}}else{printf(坐标非法\n );}}if (win row * col - EASY_COUNT){printf(恭喜你排雷成功\n);display_board(mine, ROW, COL);}
}
//test.c#include game.hvoid menu()
{printf( 1. play \n);printf( 0. exit \n);
}
void game()
{char board[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };init_mine(show, ROWS, COLS, *);init_mine(board, ROWS, COLS, 0);set_mine(board, ROW, COL);display_board(board, ROW, COL);display_board(show, ROW, COL);find_mine(board, show, ROW, COL);display_board(show, ROW, COL);
}
int main()
{int input 0;srand((unsigned int)time(NULL));do{menu();printf(请选择:);scanf(%d, input);switch (input){case 1:game();break;case 0:printf(退出游戏\n);break;default:printf(选择错误,重新选择\n);break;}} while (input);return 0;
}
//game.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once#include stdio.h
#include stdlib.h
#include time.h#define ROW 9
#define COL 9#define ROWS ROW2
#define COLS COL2
#define EASY_COUNT 10
void init_mine(char board[ROWS][COLS], int row, int col, char set);//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col);//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);