函数+扫雷游戏
自定义函数理解起来很简单,即手搓函数。根据自己的需求,想要什么函数自己写出来书写函数的内容//函数的定义int main()int a,b;printf("请输入数值\n");//函数的调用return 0;函数的定义其实就包含了函数的申明,在写简单程序时可以直接写在源文件中。
一,函数是什么?
1,函数概练的引入
引入时,函数的英文名为function,中文翻译是:功能,作用。
在数学中都听过这个名称,两者只在名称上相同。
C语言中函数的作用是实现某种功能。
一个程序最基本的单位是函数,可以这麽说程序就是由函数组成的(稍后附加的扫雷游戏,两百多行代码就是有一个个函数组成的。)
例如:
#include<stdio.h>
int main()
{
printf("你好,C。");
return 0;
}
运行结果
这是一个最基本的程序,其中包含一个主函数:main函数
还有库函数:printf
为了更直观的理解这些,会附上两百多行的代码。
二.两个文件
1.源文件
书写函数的内容,定义
2.头文件
书写函数的申明
三,函数的分类
1.主函数
主函数:main
这是程序的入口,它可以出现在任何位置,但程序必须从main函数进入,一个C语言程序没有main函数,就是错误的,哪怕是最简单的程序。
#include<stdio.h>
int main()
{
printf("你好,C。");
return 0;
}
2.库函数
概念:库函数其实就是C语言的开发者把一些常用的功能,设计成函数,这样做是为了提升开发效率。
例如:输入-----scanf
输出-------printf
这些无需程序员自己设计。
注意:库函数的使用必须包含对应的头文件
#include<stdio.h>
int main()
{
printf("你好,C。");
return 0;
}
#include<stdio.h>就是头文件
3.自定义函数
自定义函数理解起来很简单,即手搓函数。
根据自己的需求,想要什么函数自己写出来
①函数的申明
函数的申明就是表明我们要用这个函数。
下面会写一个最简单的函数:加法函数
#include<stdio.h>
int add(int x,int y);
int main()
{
int a,b;
printf("请输入数值\n");
scanf("%d %d", &a, &b);
int c = add(a, b);
printf("%d", c);
return 0;
}
int add(int x, int y) {
return x + y;
}

②函数的定义
书写函数的内容
#include<stdio.h>
//函数的定义
int add(int x, int y) {
return x + y;
}
int main()
{
int a,b;
printf("请输入数值\n");
scanf("%d %d", &a, &b);
int c = add(a, b);//函数的调用
printf("%d", c);
return 0;
}
函数的定义其实就包含了函数的申明,在写简单程序时可以直接写在源文件中。
运行结果:
四.函数的调用
函数的调用就是使用函数
以加法函数为例斜体样式
#include<stdio.h>
//函数的定义
int add(int x, int y) {
return x + y;
}
int main()
{
int a,b;
printf("请输入数值\n");
scanf("%d %d", &a, &b);
int c = add(a, b);//函数的调用,使用函数
printf("%d", c);
return 0;
1.函数的形参与实参
在函数调用中必然会涉及到传参
我们把调用中传过去的参数叫做实参
int c = add(a, b);//函数的调用,使用函数
add里面要传过去的参叫做实参
函数定义或申明中接收实参的叫做形参
//函数的定义
//add函数里面的x,y是形参
int add(int x, int y) {
return x + y;
}
2.函数的返回值
函数是有返回值的,只不过一般情况不咋用。链式访问会用到
return语句,就是返回语句
函数的返回值有很多类型
例如:整型,浮点型,布尔类型以及无符号返回
下面有代表性的例子:
①整型返回
int add(int x, int y) {
return x + y;
}
在函数之前加上要返回类型即可
②无返回,用到void符号
#include<stdio.h>
void print(void)
{
printf("哈哈哈\n");
printf("哈哈哈\n");
printf("哈哈哈\n");
printf("哈哈哈\n");
}
int main()
{
print();
return 0;
}
运行结果:
五,函数的链式访问
这属于一个小知识点,比较简单,重点在理解
先思考:
#include<stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 32)));
return 0;
}
打印的结果是啥?
分析:首先这是个链式访问,要从里到外分析,打印32,这是肯定的
printf("%d", 32);
函数是有返回值的,用代码接收下
#include<stdio.h>
int main()
{
int r = printf("%d", 32);
printf("\n");
printf("r = %d", r);
return 0;
}
运行结果
接收的r=2,是因为32在ascll码表里是两个字符,被接收打印整数2.
在拆分
#include<stdio.h>
int main()
{
int r = printf("%d", 2);
printf("\n");
printf("r = %d", r);
return 0;
}
运行结果
最后得出结果3211
在举几个例题
#include<stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 32)));
printf("%d", printf("%d", printf("%d",printf("%d", 32))));
printf("%d", printf("%d", printf("%d", printf("%d", printf("%d", 32)))));
return 0;
}
六函数递归
1.递归是什么?
函数递归就是函数自己调用自己,也是一种特殊的函数
理解递归就是递推和回归两个过程,先递推再回归
例子:斐波那
1,斐波那
函数递归
#include<stdio.h>
int Fib(int n) {
if (n <= 2) {
return 1;
}
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n = 0;
printf("请输入斐波那\n");
scanf("%d", &n);
int r = Fib(n);
printf("%d", r);
return 0;
}
可以看到在函数fib里面又包含fib就这样一步步递推出去
最后来到n<=2时得到了返回值,有开始回归,最后得出结果
2.递归的好坏
递归如果面对数据过于庞大,那么·就会发生栈溢出
所以可用但不要过多依赖
上面代码试验一下

在输入59时一直没有结果,不是说代码有错,而是递推的数太多太大
//循环迭代
#include<stdio.h>
int Fib(int n) {
int a = 1;
int b = 1;
int c = 1;
while (n > 2) {
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
printf("请输入斐波那\n");
scanf("%d", &n);
int r = Fib(n);
printf("%d", r);
return 0;
}
运行结果

这是对的,只是int类型存不了这么大的数。
七.扫雷游戏
由于所学内容有限,无法做界面交互(就是大家点一点那种),所以只能在控制台用输入输出来实现代码。
下次写思路
完整代码:
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu() {
printf("************************\n");
printf("*********1.play*********\n");
printf("*********0.exit*********\n");
}
void game() {
char mine[Rows][Cols];//初始化为0
char show[Rows][Cols];//初始化为*
Initboard(mine, Rows, Cols, '0');
Initboard(show, Rows, Cols, '*');
DisPlay(show, Row, Col);
srand((unsigned int)time(NULL));
setmine(mine, Row, Col);
//DisPlay(mine, Row, Col);
Findmine(show,mine, Row, Col);
}
int main()
{
int input = 0;
menu();//游戏菜单
do {
printf("请输入数字:");
scanf("%d", &input);
switch (input)
{
case 1:
{
printf("欢迎进入游戏.\n");
game();
break;
}
case 0:
{
printf("退出游戏.");
break;
}
default:
{
printf("输入数据异常,请重新输入:");
break;
}
}
} while (input);
return 0;
}
game.h
#pragma once
#define Row 9//宏定义行
#define Col 9//宏定义列
#define Rows Row+2
#define Cols Col+2
#include<stdlib.h>
#include<time.h>
//初始化雷盘
void Initboard(char arr[Rows][Cols], int r, int c, char start);
//展示雷盘
void DisPlay(char arr[Rows][Cols], int r,int c);
//安装雷盘
void setmine(char mine[Rows][Cols], int r, int c);
//排雷
void Findmine(char show[Rows][Cols],char mine[Rows][Cols],int r, int c);
game.c
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
#define EASY_COUNT 10//雷的个数
void Initboard(char arr[Rows][Cols], int r, int c,char start) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
arr[i][j] = start;
}
}
}
void DisPlay(char arr[Rows][Cols], int r, int c) {
int i = 0;
int j = 0;
for (int j = 0; j <= c; j++) {
printf("%d ", j);
}
printf("\n");
for (int i = 1; i <= r; i++) {
printf("%d ", i);
for (int j = 1; j <= c; j++) {
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("\n");
}
void setmine(char mine[Rows][Cols], int r, int c) {
int count = EASY_COUNT;//雷的个数;
while (count) {
while (count) {
int x = rand() % r + 1;
int y = rand() % c + 1;
if (mine[x][y] = '0') {
mine[x][y] = '1';
count--;
}
else {
break;
}
}
}
}
//static int COUNTminecount(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');
//}
static int COUNTminecount(char mine[Rows][Cols], int x, int y) {
int sum = 0;
for (int i = -1; i <= 1; i++) {
for (int j = 0; j <= 1; j++) {
sum+=(mine[x+i][x+j] - '0');
}
}
return sum;
}
void Findmine(char show[Rows][Cols], char mine[Rows][Cols], int r, int c) {
int x = 0;
int y = 0;
int win = 0;
int count = EASY_COUNT;//雷的个数;
while (win < (r * c - count)) {
printf("请输入你的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 9 && y >= 1 && y <= 9) {
if (mine[x][y] == '1') {
DisPlay(mine, Row, Col);
break;
}
else {
//统计周围雷的个数
int count = COUNTminecount(mine, x, y);
show[x][y] = count + '0';
/*DisPlay();*/
DisPlay(show, Row, Col);
win++;
}
}
else {
printf("数据异常");
}
}
if (win == (r * c - count)) {
printf("恭喜挑战成功");
}
else
printf("抱歉,你被炸死了.");
}
更多推荐


所有评论(0)