一 主要涉及到的知识点:
1.1 数组:
1 二维数组
1.2 循环语句:
1. for循环语句
2. while()循环
2. do while()语句
1.3 if else 判断语句
这里随便找一个, 玩家下棋的逻辑判断
1.4 switch() 语句
1.5 函数:
1. 函数的定义:
1.6 如何将不同的.c文件,在主函数调用其他.c的函数逻辑代码:
1.test.c: 这里是主函数文件
2. game.c 这个是函数逻辑代码文件
3. game.h 这个是头文件
首先怎么在主函数test,c文件调用game.c里的代码, 这里需要将函数定义声明,放到头文件里,然后需要的话, 就将这个头文件导入即可, 这里三子棋里就有使用, 如下图所示:
这里是主函数导入头文件,就可以使用函数逻辑代码, 要想使用就需要先声明如图:
这里就是函数的声明,将函数声明就可以在主函数里, 导入头文件, 进行函数的调用使用
1.7 随机数的生成与定义:
1.7.1 rand()
需要使用的时候, 调用rand()函数, 就可以生成32767范围内里的证书数, 但是在使用它之前要, 设置随机数的生成起点; 如1.5.2
1.7.2 srand((unsigned int)time(NULL))
这里为什么这样,我就不叙述了, 要想了解的, 可以自己深入查一下.
二 游戏代码讲解:
2.1 打印界面函数定义:
这里首先要打印游戏界面, 然后让玩家进行选择, 选择1进入游戏, 选择0退出游戏;如图所示:
2.2 判断进入游戏或者退出游戏:
如下图所示, 这里通过do while 循环进入, 然后打印界面后, 玩家要输入是否进入游戏或者退出游戏, 通过switch语句进行判断, 1进入游戏,0退出游戏,出入去其他就打印输入错误
2.3 进入三子棋函数:
//进入三子棋函数
ThreeChessFunction();
进入游戏函数里,这里定义了一个二维数组,进行存储数据, 紧接着就是 //初始化棋盘,
InitializeCheckerboard(ThreeChessArr, ROW, COL); 如下图,就是将' '存入二维数组里.
//打印棋盘
PrintfCheckerboard(ThreeChessArr, ROW, COL);
打印棋盘,如下图, 这里是第一个for循环是行循环, 行循环就是第一次循环, 打印第一行, 进入后 打印的第一行, 然后将空格存入数组里, 再将|也存进去,这个是打印数据,然后打印分隔符----|----|----, 这里需要注意的是, 分隔符还有|最后一个都不需要打印,通过判断行列然后循环判断里-1
2.4 下棋
进入循环里, 然后玩家和电脑进行下棋, 玩家下棋函数逻辑代码分析:如下图:
首先玩家输入坐标后, 进行判断, 这里判断的是, 玩家输入的坐标是否正确
电脑下棋:
电脑下棋比较简单, 直接判断数组里是否有空位, 有直接就将随机生成的数,将#存入进去
2.5 判断输赢
判断输赢, 这里我就不叙述,都有注释
三 源代码如下:
3.1 test.c文件:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//函数定义逻辑-------------------------------------------------------------
//打印界面函数定义
void menu()
{
printf("*****************************************\n");
printf("************** 1. play **************\n");
printf("************** 0. exit **************\n");
printf("*****************************************\n");
}
//定义三子棋函数
void ThreeChessFunction()
{
//定义二维数组
char ThreeChessArr[ROW][COL] = { 0 };
//初始化棋盘
InitializeCheckerboard(ThreeChessArr, ROW, COL);
//打印棋盘
PrintfCheckerboard(ThreeChessArr, ROW, COL);
char ret = 0 ;
//下棋
while (1)
{
//玩家下棋
PlayerMove(ThreeChessArr, ROW, COL);
//判断输赢
ret = IsWin(ThreeChessArr, ROW, COL);
//如果ret返回值不等于'C',退出循环
if (ret != 'C')
{
break;
}
//打印棋盘
PrintfCheckerboard(ThreeChessArr, ROW, COL);
//电脑下棋
ComputerMove(ThreeChessArr, ROW, COL);
//判断输赢
ret = IsWin(ThreeChessArr, ROW, COL);
//如果ret返回值不等于'C',退出循环
if (ret != 'C')
{
break;
}
//打印棋盘
PrintfCheckerboard(ThreeChessArr, ROW, COL);
}
//判断ret返回值,
if (ret == '*')
{
printf("玩家赢了\n");
}
else if (ret == '#')
{
printf("电脑赢了\n");
}
else
{
printf("平局了\n");
}
//打印棋盘
PrintfCheckerboard(ThreeChessArr, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL)); //设置随机数的生成起点
int input = 0;
do
{
//1.打印界面
menu();
printf("清选择:>");
//2.输入是否进入游戏或退出游戏
scanf("%d", &input);
//3.通过switch语句进行判断
switch (input)
{
case 1:
{
//进入三子棋函数
ThreeChessFunction();
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
default:
{
printf("输入错误!\n");
break;
}
}
} while (input);
return 0;
}
3.2 game.h 文件:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//通过宏定义变量,后边可以随时更改
#define ROW 3
#define COL 3
//初始化棋盘
void InitializeCheckerboard(char ThreeChessArr[ROW][COL], int row, int col);
//打印棋盘
void PrintfCheckerboard(char ThreeChessArr[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char ThreeChessArr[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char ThreeChessArr[ROW][COL], int row, int col);
//判断输赢
//1.玩家赢 '*'
//2.电脑赢 '#'
//3.平局 'Q'
//4.继续 'C'
char IsWin(char ThreeChessArr[ROW][COL], int row, int col);
3.3 game.h 文件
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//初始化棋盘
void InitializeCheckerboard(char ThreeChessArr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
ThreeChessArr[i][j] = ' ';
}
}
}
//打印棋盘
void PrintfCheckerboard(char ThreeChessArr[ROW][COL], int row, int col)
{
//首先打印 | | |
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", ThreeChessArr[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
//打印分割信息
if (i < row - 1)
{
int h = 0;
for (h = 0; h < col; h++)
{
printf("---");
if (h < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
//玩家下棋
void PlayerMove(char ThreeChessArr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋:>\n");
while (1)
{
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (ThreeChessArr[x - 1][y - 1] == ' ')
{
ThreeChessArr[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,不能下棋,请选择其他位置\n");
}
}
else
{
printf("非法坐标,请重新输入\n");
}
}
}
//电脑下棋
void ComputerMove(char ThreeChessArr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋:>\n");
while (1)
{
x = rand() & row; //0-2
y = rand() & col; //0-2
if (ThreeChessArr[x][y] == ' ')
{
ThreeChessArr[x][y] = '#';
break;
}
}
}
//判断是否是平局函数定义
//返回1为平局,返回0则继续
int IsFull(char ThreeChessArr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (ThreeChessArr[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
//1.玩家赢 '*'
//2.电脑赢 '#'
//3.平局 'Q'
//4.继续 'C'
char IsWin(char ThreeChessArr[ROW][COL], int row, int col)
{
//判断行
int i = 0;
for (i = 0; i < row; i++)
{
if (ThreeChessArr[i][0] == ThreeChessArr[i][1] &&
ThreeChessArr[i][1] == ThreeChessArr[i][2] && ThreeChessArr[i][1] != ' ')
{
return ThreeChessArr[i][1];
}
}
//判断列
int j = 0;
for (j = 0; j < col; j++)
{
if (ThreeChessArr[0][j] == ThreeChessArr[1][j] &&
ThreeChessArr[1][j] == ThreeChessArr[2][j] && ThreeChessArr[1][j] != ' ')
{
return ThreeChessArr[1][j];
}
}
//判断对角线
if (ThreeChessArr[0][0] == ThreeChessArr[1][1] &&
ThreeChessArr[1][1] == ThreeChessArr[2][2] && ThreeChessArr[1][1] != ' ')
{
return ThreeChessArr[1][1];
}
if (ThreeChessArr[0][2] == ThreeChessArr[1][1] &&
ThreeChessArr[1][1] == ThreeChessArr[2][0] && ThreeChessArr[1][1] != ' ')
{
return ThreeChessArr[1][1];
}
//没有人赢,平局
if (IsFull(ThreeChessArr, row, col))
{
return 'Q';
}
//继续
return 'C';
}