前言:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
扫雷游戏(初级)编写:
编辑
创建文件项目:
编辑
菜单打印:test.c
菜单打印 test.c #include<stdio.h> void menu() { printf("******扫雷游戏(初级)C语言版********\n"); printf("*************************************\n"); printf("***** 1.Play(输入1:开始游戏)*****\n"); printf("***** 0.Exit(输入0:退出游戏)*****\n"); printf("*************************************\n"); printf("\n"); printf(" ——By 作者:新晓·故知\n"); } void game() { printf("扫雷\n"); } void test() { 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); } int main() { test(); return 0; }
编辑
打印棋盘:
1.game.h 头文件的包含 #include <stdio.h> //#include <time.h> //#include <stdlib.h> 符号的声明 #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 //#define EASY_COUNT 10 函数的声明 初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); 打印棋盘 void DisplayBoard(char board[ROWS][COLS], int row, int col); 2.game.c #include "game.h" void InitBoard(char board[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++) { board[i][j] = set; } } } void DisplayBoard(char board[ROWS][COLS], int row, int col) { //1~9 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 ", board[i][j]); } printf("\n"); } } 3.test.c #include "game.h" void menu() { printf("******扫雷游戏(初级)C语言版********\n"); printf("*************************************\n"); printf("***** 1.Play(输入1:开始游戏)*****\n"); printf("***** 0.Exit(输入0:退出游戏)*****\n"); printf("*************************************\n"); printf("\n"); printf(" ——By 作者:新晓·故知\n"); } void game() { //printf("扫雷\n"); //创建数组 char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息 char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息 //初始化mine数组为全'0' InitBoard(mine, ROWS, COLS, '0'); //初始化show数组为全'*' InitBoard(show, ROWS, COLS, '*'); ////打印棋盘 DisplayBoard(mine, ROW, COL); DisplayBoard(show, ROW, COL); } void test() { 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); } int main() { test(); return 0; }
编辑
编辑
布置雷:
布置雷: 1.game.h //头文件的包含 #include <stdio.h> #include <time.h> //#include <stdlib.h> //符号的声明 #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 //#define EASY_COUNT 10 //函数的声明 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); //打印棋盘 void DisplayBoard(char board[ROWS][COLS], int row, int col); //布置雷 void SetMine(char mine[ROWS][COLS], int row, int col); 2.gamer.c #include "game.h" void InitBoard(char board[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++) { board[i][j] = set; } } } void DisplayBoard(char board[ROWS][COLS], int row, int col) { //1~9 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 ", board[i][j]); } printf("\n"); } } void SetMine(char mine[ROWS][COLS], int row, int col) { int count = 10; 此处控制布置雷的个数! while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } 3.test.c #include "game.h" void menu() { printf("******扫雷游戏(初级)C语言版********\n"); printf("*************************************\n"); printf("***** 1.Play(输入1:开始游戏)*****\n"); printf("***** 0.Exit(输入0:退出游戏)*****\n"); printf("*************************************\n"); printf("\n"); printf(" ——By 作者:新晓·故知\n"); } void game() { //printf("扫雷\n"); //创建数组 char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息 char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息 //初始化mine数组为全'0' InitBoard(mine, ROWS, COLS, '0'); //初始化show数组为全'*' InitBoard(show, ROWS, COLS, '*'); ////打印棋盘 //DisplayBoard(mine, ROW, COL); //真正进行排雷会屏蔽此语句,此语句可查看雷的位置坐标 //DisplayBoard(show, ROW, COL); //真正进行排雷会屏蔽此语句,此语句可查看雷的位置坐标 //布置雷 SetMine(mine, ROW, COL); DisplayBoard(mine, ROW, COL); } void test() { 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); } int main() { test(); return 0; }
编辑
编辑
知识点:字符±(*/)ASCII码 ' 0 '=字符
编辑
编辑
编辑
编辑
扫雷游戏(初级)完整代码:
1.创建头文件:game.h
代码如下:
game.h //头文件的包含 #include <stdio.h> #include <time.h> #include <stdlib.h> //符号的声明 #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 //此处控制布置雷的个数,最终版将会设置成时间随机生成雷的个位数!!! //函数的声明 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); //打印棋盘 void DisplayBoard(char board[ROWS][COLS], int row, int col); //布置雷 void SetMine(char mine[ROWS][COLS], int row, int col); //排查雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
2.创建源文件: game.c
代码如下:
game.c #include "game.h" void InitBoard(char board[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++) { board[i][j] = set; } } } void DisplayBoard(char board[ROWS][COLS], int row, int col) { //1~9 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 ", board[i][j]); } printf("\n"); } } void SetMine(char mine[ROWS][COLS], int row, int col) { int count = EASY_COUNT;//此处控制布置雷的个数,最终版将会设置成时间随机生成雷的个位数 while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } 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'; //n + '0' 可以得到字符n !!! } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0; while (win < row * col - EASY_COUNT) { printf("请输入要排查雷的坐标:>"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾,你被炸死了!\n"); DisplayBoard(mine, row, col); break; } else { //计算x,y坐标周围有几个雷 int n = get_mine_count(mine, x, y); show[x][y] = n + '0'; //n + '0' 可以得到字符n !!! DisplayBoard(show, row, col); win++; } } else { printf("输入坐标非法,无法排雷,请重新输入!\n"); } } if (win == row * col - EASY_COUNT) { printf("恭喜你,排雷成功!\n"); DisplayBoard(mine, row, col); } }
3.创建源文件: test.c
代码如下:
test.c #define _CRT_SECURE_NO_WARNINGS #include "game.h" void menu() { printf("******扫雷游戏(初级)C语言版********\n"); printf("*************************************\n"); printf("***** 1.Play(输入1:开始游戏)*****\n"); printf("***** 0.Exit(输入0:退出游戏)*****\n"); printf("*************************************\n"); printf("\n"); printf(" ——By 作者:新晓·故知\n"); } void game() { //printf("扫雷\n"); //创建数组 char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息 char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息 //初始化mine数组为全'0' InitBoard(mine, ROWS, COLS, '0'); //初始化show数组为全'*' InitBoard(show, ROWS, COLS, '*'); ////打印棋盘 //DisplayBoard(mine, ROW, COL); //真正进行排雷会屏蔽此语句,此语句可查看雷的位置坐标 //DisplayBoard(show, ROW, COL); //真正进行排雷会屏蔽此语句,此语句可查看雷的位置坐标 //布置雷 SetMine(mine, ROW, COL); //DisplayBoard(mine, ROW, COL); //DisplayBoard(mine, ROW, COL); //排雷 FindMine(mine, show, ROW, COL); } void test() { int input = 0; srand((unsigned int)time(NULL));//时间随机生成数 do { menu(); //printf("请选择:>"); printf("请选择游戏开始或结束:>\n"); printf("#输入数字1代表游戏开始,输入数字0代表游戏结束#\n"); printf("#坐标输入方式:数字-空格键-数字#\n"); scanf("%d", &input); switch (input) { case 1: //扫雷 game(); break; case 0: printf("退出游戏!\n"); break; default: printf("选择错误,请重新输入!\n"); break; } } while (input); } int main() { test(); return 0; }
4.按照提示运行程序即可
运行结果示例:
编辑
编辑
使用说明:
(1)红框标记语句可控制“雷”的位置坐标的显示与隐藏:
编辑
(2)红框标记语句可更改“雷”的数量 :
因本程序设置棋盘大小为9*9,故此处数量区间为[0,81],
编辑
(3)红框标记语句可进行棋盘大小更改 :
将数字9更改即可,数字9代表棋盘操作大小,ROW+2代表棋盘总大小,
即操作棋盘大小为9*9,总棋盘大小(加上外框)为11*11
编辑
题例:
递归例1:
#include <stdio.h> int Fun(int n) { if (n == 5) return 2; else return 2 * Fun(n + 1); } int main() { int ret = Fun(2); printf("%d\n", ret); return 0; }
编辑
编辑
递归例题2:
//编写一个函数 reverse_string(char* string)(递归实现) //实现:将参数字符串中的字符反向排列,不是逆序打印。 //要求:不能使用C函数库中的字符串操作函数。 //比如 : //char arr[] = "abcdef"; //逆序之后数组的内容变成:fedcba #include <string.h> int my_strlen(char* s) { int count = 0; while (*s != '\0') { count++; s++; } return count; } //[a b c d e f g \0] 递归版本 void reverse_string(char* arr) { int len = my_strlen(arr); char tmp = *arr; *arr = *(arr + len - 1); *(arr + len - 1) = '\0'; //使得剩下的仍为有效字符串,以\0结尾 if(my_strlen(arr+1)>1) //设置跳出条件,防止死循环 reverse_string(arr+1); //当字符串>=2,就递归 *(arr + len - 1) = tmp; //将前面的字符交换到尾部 } int main() { char arr[] = "abcdefg"; reverse_string(arr); printf("%s\n", arr);//fedcba return 0; }
编辑
//参数是数组--使用C函数库中的strlen #include<stdio.h> #include<string.h> void reverse_string(char arr[]) { int left = 0; int right = strlen(arr) - 1; //交换 while (left < right) { char tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } int main() { char arr[] = "abcdef"; reverse_string(arr); printf("%s\n", arr); return 0; }
不使用C函数库中的strlen:
编辑
参数用指针的形式 #include <string.h> int my_strlen(char* s) { int count = 0; while (*s != '\0') { count++; s++; } return count; } void reverse_string(char* str) { char* left = str; char* right = str + my_strlen(str) - 1; while (left<right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } }
编辑
参数是数组的形式 #include <string.h> int my_strlen(char* s) { int count = 0; while (*s != '\0') { count++; s++; } return count; } void reverse_string(char arr[]) { int left = 0; int right = my_strlen(arr)-1; //交换 while (left<right) { char tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } }
编辑
递归例题3:
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和 例如,调用DigitSum(1729),则应该返回1 + 7 + 2 + 9,它的和是19 输入:1729,输出:19 int DigitSum(size_t n) { if (n <= 9) return n; else return DigitSum(n / 10) + n % 10; } int main() { size_t num = 0; scanf("%u", &num); int ret = DigitSum(num); printf("%d\n", ret); return 0; }
编辑
编辑
编辑
编辑
递归例题4:
//实现n的k次方(不使用库函数) double Pow(int n, int k) { if (k == 0) return 1; else if (k > 0) return n * Pow(n, k - 1); else return 1.0 / Pow(n, -k); } int main() { int n = 0; int k = 0; scanf("%d %d", &n, &k); double ret = Pow(n, k); printf("%lf\n", ret); return 0; }
编辑