案例描述
本案例要求创建一个棋盘,在棋盘生成的同时初始化棋盘,根据初始化后棋盘中棋子的位置来判断此时的棋局是否为一局好棋。具体要求如下:
- 棋盘的大小根据用户的指令确定
- 棋盘中的棋子数量也由用户指定
- 棋子的位置由随机函数随机确定,若生成的棋盘中有两颗棋子落在同一行或者是同一列,则判定为”好棋“,否则判定为“不是好棋”
案例分析
本案例需要根据用户输入的数据分别确定棋盘的大小和棋子的数量,所以棋盘大小和棋子数量是不确定的。为了避免存储空间的浪费,防止因空间不足造成的数据丢失,本案例可动态的申请堆上的空间,来存储棋盘。
从棋盘的创建到释放,大致包含一下几个步骤:
- 创建棋盘。棋盘的创建应包含空间的申请,用于存储棋盘中对应的信息
- 初始化棋盘。创建好的棋盘是一个空的棋盘,棋盘在现实之前应先被初始化
- 输出棋盘。创建并初始化的棋盘包含棋盘的逻辑信息,棋盘的输出应包含棋盘的格局。
- 销毁棋盘。动态申请的空间需要被释放
当然在创建棋盘之前,需要获取用户设置的棋盘信息,在初始化棋盘之时,也应根据用户设置的棋子数量来设置棋盘信息。
案例实现
1,案例设计
根据案例分析中的棋局生成的步骤设计程序,可将程序代码化为四个功能函数和一个主函数
- 创建棋盘
案例分析中已经提出,棋盘信息存放在动态生成的堆空间中。棋盘由n*n个表格组成,其形式类似矩阵,所以本案例中设计使用二级指针指向棋盘地址,在该函数中应实现棋盘空间的动态申请,并返回一个指向棋盘的二级指针。 - 初始化棋盘
在创建棋盘时,实质只开辟了存储空间,空间中尚未存放棋盘信息,所以在生成棋盘之前需要初始化棋盘信息。
棋盘信息的初始化可以利用指针完成。当棋盘上的棋子数量确定后,在棋盘范围内使用随机数函数随机确定每个棋子的位置。 - 输出棋盘
根据由前两个函数确定的棋盘信息搭建棋盘棋盘的外观可使用制表符搭建。若棋盘对应的位置有棋子,则将制表符替换为表示棋子的符号 - 销毁棋盘
在创建棋盘时申请的堆空间,应在使用完毕后手动释放 - 主函数
主函数中实现棋盘大小和棋子数量的设置,其中应定义一个二级指针,指向创建棋盘的函数返回的棋盘地址,随后依次调用初始化棋盘函数、输出棋盘函数和销毁棋盘的函数。
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//创建一个棋盘
int ** creatBoard(int n)
{
int **p = (int **)calloc(sizeof(int *),n);
//使用二级指针指向棋盘地址,棋盘空间的动态申请
int i = 0;
for(i = 0;i < n; i++)
{
p[i] = (int*)calloc(sizeof(int),n);
}