扫雷
来源:互联网 发布:voip网络电话机 编辑:程序博客网 时间:2024/05/17 05:13
我们要模范小游戏扫雷,需要我们完成以下几点:
1、在Windows系统下,先玩几把扫雷游戏,想一想它是如何实现的。
2、通过观察游戏,我们可以想到需要用两个二维数组来实现扫雷的功能。
3、游戏刚开始,需要需要显示棋盘,用“*”遮盖雷的坐标,所以要有一个填充棋盘的函数。
4、通过rand()函数,随机生成雷的坐标,埋雷的函数。
5、每次扫过后,都要显示新的棋盘,显示棋盘的函数,同时显示该坐标周围雷的个数,并在该坐标上显示出来。
6、如果要想第一次踩不到雷的,需要把该坐标下得雷移动到其他不是雷的坐标。
7、最后需要一个函数判断是否扫雷成功。
game.h
宏函数的定义如下:
#ifndef __GAME_H__#define __GAME_H__#define ROWS 12#define COLS 12#define M 10void init_board(char board[ROWS][COLS],int rows,int cols,char ch);void lay_mine(char board[ROWS][COLS],int rows,int cols,int m);void dis_play(char board[ROWS][COLS],int rows,int clos);void one_input(char board1[ROWS][COLS],int x,int y,int count);int mine_count(char board1[ROWS][COLS],char board2[ROWS][COLS],int x,int y);int check_win(char board[ROWS][COLS],int rows,int clos);#endif//__GAME_H__
game.c
各个函数的功能实现代码
填充棋盘函数:
void init_board(char board[ROWS][COLS],int rows,int cols,char ch) { int i = 0; int j = 0; for(i = 0;i < rows;i++) { for(j = 0;j < cols;j++) { board[i][j] = ch; } }}
随机埋雷的函数:
void lay_mine(char board[ROWS][COLS],int rows,int cols,int m) { int i = 0; while(i<m) { while(1) { int x = (rand()%(ROWS-2))+1; int y = (rand()%(COLS-2))+1; if(board[x][y] != '1') { board[x][y] = '1'; break; } } i++; }}
显示棋盘的函数:
void dis_play(char board[ROWS][COLS],int rows,int clos) { int i = 0; int j = 0; printf(" "); for(i = 1;i<rows-1;i++) { printf("%3d",i); } printf("\n"); for(i = 0;i<rows-1;i++) { printf("---"); } printf("\n"); for(i = 1;i < rows-1;i++) { printf("%2d|",i); for(j = 1;j < clos-1;j++) { printf("%3c",board[i][j]); } printf("\n"); }}
第一次输入坐标,保证踩不到雷
void one_input(char board1[ROWS][COLS],int x,int y,int count) { int x1 = 0; int y1 = 0; if((count == 1)&&(board1[x][y] == '1')) { while(1) { x1 = (rand()%(ROWS-2))+1; y1 = (rand()%(COLS-2))+1; if(board1[x1][y1] == '0') //把雷移走 { int tmp; tmp = board1[x][y]; board1[x][y] = board1[x1][y1]; board1[x1][y1] = tmp; break; } } }}
计算该坐标周围雷的个数,判断是否踩到雷了
int mine_count(char board1[ROWS][COLS],char board2[ROWS][COLS],int x,int y) //周围雷的个数{ if(board1[x][y] == '1') //踩到雷,返回‘b’ { board2[x][y] = '1'; return 'b'; } if(board1[x][y] == '0') { board2[x][y] = (board1[x-1][y-1] + board1[x-1][y] + board1[x-1][y+1] + board1[x][y-1] + board1[x][y+1] + board1[x+1][y-1] + board1[x+1][y] + board1[x+1][y+1]) - (7*48) ; } return 1;}
判断输赢:
int check_win(char board1[ROWS][COLS],int rows,int cols) { int i = 0; int j = 0; int m = 0; for(i = 1;i <rows-1; i++) { for(j = 1;j <cols-1;j++) { if(board1[i][j] != '*') { m++; } } } if(m == (100-M)) { return 'n'; } return 1;}
test.c
main函数:
#include"game.h"#include<stdio.h>#include<stdlib.h>#include<time.h>void menu(){ printf("******************************\n"); printf("***** 1.paly 2.exit ****\n"); printf("******************************\n");}void game(){ int count = 0; int ret = 0; int x = 0; int y = 0; char mine[ROWS][COLS] ; char show[ROWS][COLS] ; init_board(mine,ROWS,COLS,'0'); init_board(show,ROWS,COLS,'*'); lay_mine(mine,ROWS,COLS,M); dis_play(show,ROWS,COLS); dis_play(mine,ROWS,COLS); while(1) { printf("请输入坐标:"); while(1) { scanf("%d %d",&x,&y); if(((x>10)||(x<1))||((y>10)||(y<1))) { printf("输入坐标有误,请重新输入!\n"); } else { count++; break; } } one_input(mine,x,y,count); //第一次踩到雷不炸 //dis_play(mine,ROWS,COLS); ret = mine_count(mine,show,x,y); if(ret =='b') { break; } dis_play(show,ROWS,COLS); ret = check_win(show,ROWS,COLS); if(ret == 'n') { break; } } if(ret == 'b') { printf("很遗憾,你被炸死了!\n"); } if(ret == 'n') { printf("恭喜你,扫雷成功!\n"); }}int main(){ int input = 0; srand((unsigned)time(NULL)); while(1) { menu(); printf("请选择:"); scanf("%d",&input); switch(input) { case 1: game(); break; case 2: return 0; break; default: printf("选择错误,请重新选择:"); break; } } system("pause"); return 0;}
测试代码如下
设置雷的个数为99,第一次不炸,把该坐标的雷移到不是雷额地方,扫雷成功
设置雷的个数为98,输入两次才能踩到雷,扫雷失败
以上代码基本实现了扫雷的功能,希望对大家的学习有所帮助。
阅读全文
0 0
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- 扫雷
- POJ 3349.Snowflake Snow Snowflakes
- Ubuntu 16.04LTS 安装 MATLAB 2014B
- iOS 自定义绘制气泡
- PHP面向对象 知识点总结
- 数据转图
- 扫雷
- php中的匿名函数和闭包(closure)及use的作用
- MyEclipse中复制项目之后部署项目出现不能部署,纠正问题之后出现404
- 2017 CCPC 秦皇岛 A:Balloon Robot
- PL/SQL 测试 调用PROCEDURE 和FUNCTION
- 安装Eclipse Jee Oxygen后项目的js和json文件报错
- CV论文笔记(三)Convolutional-De-Convolutional Networks for Precise Temporal Action Localization in Untrimm
- 不调用C++/C字符串库函数,实现字符串复制函数strcpy
- 接口的回调与回调机制