编程记录,关于B站上鹏哥C语言课程中的练习记录
记录内容:C语言实现三子棋游戏(数组的应用)
-
关于分模块编程
分为三部分: 1.test.c 用于测试和运行
2.game.c 用于编写游戏运行内容
3.game.h 用于存放游戏相关的函数与数据 -
关于一些数据设置的原因
问题一:数组大小使用定义在game.h中的ROW与COL不直接在代码中设定
有利于后期对游戏的修改,增加灵活性。 -
编写逻辑
进行测试test.c
作为游戏首先要打印好菜单,编写一个简单地menu()函数。
通过do-while循环和switch条件语句,测试当用户输入相关内容时应当给出的反映。
通过简单的输出一些内容对整个测试进行判断。
逻辑测试完成。编写具体的游戏运行流程game()
(编写的每个子程序需要在game.h中声明,并且在game.c中完成。)
三子棋游戏基于数组形成棋盘,并通过不同的符号判断双方所下位置与输赢。
通过二维数组存储数据。
编写函数完成对棋盘的初始化,即在数组中保存空格。(问题一)
编写函数完成棋盘的打印。(本质是打印数组的内容)(将棋盘打印编程更加灵活的方式)
设置进入循环开始游戏,即玩家走,电脑走(通过输入坐标进行游戏)(用户为*,电脑为#)
编写函数让玩家下棋,需要提供数组、行、列(玩家的行列坐标与编程不同,注意差别)
玩家输入想下棋的行列位置;
判断坐标是否合法;
判断坐标是否已经占用;(是否是空格)
下棋成功,打印当前棋盘;
编写函数实现电脑下棋,类似玩家下棋,
电脑规定,所以一定合法;
生成随机数的一些固定代码如下:rand,srand,time
#include<stdlib.h>
#include<time.h>
x = rand() % row;
srand((unsigned int)time(NULL));
编写函数每次下棋结束都要判断当前状态(玩家赢*)(电脑赢#)(平局Q)(游戏继续C)。(设置*、#的原因?)
前三种游戏结束,打印棋盘展示当前状态。
输赢判断:行、列、对角线是否三个相等(任一不可以等于空格)
平局判断:无输赢而且棋盘被占满(数组里有没有空格 )
- game.h
//头文件的包含
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
//符号的定义
#define ROW 3
#define COL 3
//函数的声明
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputeMove(char board[ROW][COL], int row, int col);
//判断当前游戏状态
char IsWin(char board[ROW][COL], int row, int col);
//判断棋盘是否已满
int IsFull(char board[ROW][COL], int row, int col);
- game.c
#include"game.h"
//棋盘初始化
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)