系统学习之C复习(4)数组2-创新互联
1. 设置框架,并确定游戏逻辑是否正常运行
分享名称:系统学习之C复习(4)数组2-创新互联
URL标题:http://scyanting.com/article/ddohid.html
1.布置雷, 10个;
目前成都创新互联已为千余家的企业提供了网站建设、域名、网站空间、网站托管运营、企业网站设计、丹寨网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。2.扫雷
2. 模块化,将游戏主体单独列一个C文件与h文件 3. 确定游戏信息输入坐标,
是雷 —— Game over
不是雷 ——告诉你这个坐标周围8个坐标范围内有几个雷
直到把所有非雷的位置全部找出,游戏结束,扫雷成功
首先布置雷的信息
char mine[9][9];
'1' - 雷
'0' - 非雷
注意:
由于扫雷中边缘的坐标出触发后,会扫描周围8个坐标,防止数组越界,我们设置两层 数组。避免数组越界
char mine[11][11]
排查出的雷的信息
char show[9][9];
* - 未排查
数组字符 - 已排查
char show[11][11];
初始化界面棋盘 和 打印棋盘
void game(char board, int row, int col) { char mine[ROWS][COLS] = { 0 };//'0'用于存放布置的雷的信息 char show[ROWS][COLS] = { 0 };//'*'用于存放排查出的雷的信息 //初始化棋盘 init_board(mine, ROWS, COLS, '0'); init_board(show, ROWS, COLS, '*'); //打印棋盘 show_board(mine, ROW, COL); //用于查看 show_board(show, ROW, COL); }
void init_board(char arr[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for (i = 0; i< rows; i++) { for (j = 0; j< cols; j++) { arr[i][j] = set; //用于设置这个棋盘中我需要填充哪个字符 } } } void show_board(char arr[ROWS][COLS], int row, int col) { int i = 0; int j = 0; for (i = 0; i<= col; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i<= row; i++) { printf("%d ", i);//打印行 for (j = 1; j<= col; j++) { printf("%c ",arr[i][j]); } printf("\n"); } }
打印玩棋盘后,我们需要将雷 放入棋盘中。 所以布置雷的位置,在打印棋盘函数之前。
set_mine(mine,ROW,COL); //打印棋盘 show_board(mine, ROW, COL); //打印棋盘
//布置雷 void set_mine(char mine[ROWS][COLS], int row, int col) { int count = EASY_COUNT; int x = 0; int y = 0; while (count) { x = rand() % row + 1; y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1';//布置雷 count--; } } }
由于后续需要计算某一坐标点周围的雷的数目,
此处将雷设置为‘1’,无雷的地方设置为0 。 方便后续的计算雷的数目。
当布置完雷,打印棋盘后,便是需要玩家去排除雷的位置了。
排查雷 在布置雷的棋盘内寻找,后传到排查出雷的棋盘内。故此两个数组都需要
find_mine(mine, show, ROW, COL);//排查雷 void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; printf("请输入要排查的坐标"); scanf("%d %d", &x, &y); if (1<= x && x<= 9 && 1<= y && y<= 9)//检查坐标是否合法 { if (mine[x][y] == '1') { printf("寄——游戏结束\n"); show_board(mine, ROW, COL);//死亡回放 } else { int count = get_mine_count(mine, x, y);//计算周围雷的数目 show[x][y] = count + '0'; show_board(show, ROW, COL); } } else { printf("坐标非法,请重新输入"); } }
get_mine_count(mine, x, y)函数 将九宫格内的字符全部相加,再减去 '0'字符,那么剩下的便是九宫格范围内的 '1'的个数。 int get_mine_count(char mine[ROWS][COLS], int x, int y) { int i = 0; int j = 0; int sum = 0; for (i = -1; i< 2 ; i++) { for (j = -1; j< 2; j++) { sum += mine[x + i][y + j]; // x-1 y-1 y y+1 // x y-1 y y+1 // x+1 y-1 y y+1 } } return sum = sum - 9 * '0'; 由于中间那个x,y坐标一定不是雷,故此可以直接循环,然后减去9个'0' } 也可以直接相加,那么就不必考虑X,Y。 int get_mine_count(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'; }
注意此处运行的结果
输入坐标1 1.为什么他只计算了里面的数据?
因为外面一圈都是一开始定义的'0' 。
这里只是显示 int 123456789,但是没有改变 本身的 mine[0][0] = '0'
功能:展开一片空白区域。
条件:1:该坐标不是雷,2.该坐标周围8个坐标不是雷 3. 该坐标未被排查过
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享名称:系统学习之C复习(4)数组2-创新互联
URL标题:http://scyanting.com/article/ddohid.html