1.三子棋运行前提
首先该游戏的运行需要用到三个文件:分别是test.c(三子棋主体内容)、game.c(三子棋的函数逻辑实习)、game.h(游戏的头文件)。
注:为什么不将文件和归成一个文件的原因,是因为将文件分区便于各自模块的管理、测试bug,除此之外模块的分区,也利于代码生成的效率。
2.主体逻辑和游戏内容
(1)菜单的创建
一个游戏的开始需要一个菜单,当它选择一个选项时开始游戏,选择一个选项退出游戏,而当他选择了其他选项则要提示它选择错误,这样也就形成了一个开始菜单。
而在一局游戏中,不可能是只玩一把,所以这里需要引进一个循环:我选择使用switch语句,这样当你选择0时才会退出,其他的则会继续循环这个游戏过程。
(2)游戏主体逻辑的完成(game()函数的实现)
对于三子棋这个游戏而言,我们首先需要一个棋盘:引用一个二维数组就可以完成”board[][]",而棋盘的大小可以形成为"board[3][3]",为了之后可以方便更改棋盘的大小,或者是完善为五子棋,所以这里可以定义两个变量ROW和COL,而这些定义都放在头文件game.h,便于之后模块的引用。
(2.1)棋盘初始化
棋盘的一开始是没有元素存在的,但是为了表示它们我们需要用空格去初始化它,使它的每一个棋盘中包含着空格元素。这里运用两个嵌套的for循环就可以完成,就像打印99乘法表一样。
(2.2)打印整体棋盘
初始化棋盘之后,就需要给予棋盘一个轮廓:只需要将棋盘分为两个单元就行,一个是" %d |"和"---|"。然后再将这两个单元分别打印,运用for语句循环打印就可。
棋盘代码如下:
---------------------------------------------------------------------------------------------------------------------------------
(2.3)主体游戏环节
主体逻辑就是玩家先下棋,然后到电脑下棋(注:这里涉及电脑下棋的一个随机性,所以引用一个时间函数time)、之后就到了游戏的胜负判断。
3.具体代码
(1)game.c代码如下
#include "game.h"
//棋盘初始化 进行空格填充
void Zero_board(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
for (x = 0;x < row;x++)
{
for (y = 0;y < col;y++)
{
board[x][y] = ' ';
}
}
}
//给予棋盘边界画面
void image_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
printf(" %c ", board[i][j]);//打印棋盘下棋位置0*0|0*0|0*0
if (j < col-1)
printf("|");
}
putchar('\n');
//打印棋盘周围图案 ——|——|——
if (i < row - 1)
{
for (j = 0;j < col;j++)
{
printf("---");
if (j < col - 1)//控制最后一次不打印
printf("|");
}
printf("\n");
}
}
}
//玩家下棋
void Player(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
printf("玩家下棋:>");
while (1)
{
printf("请输入坐标:>");
scanf("%d %d", &i, &j);
if (i >= 1 && i <= row && j >= 1 && j <= col)//判断坐标的合法性
{
if (board[i - 1][j - 1] = ' ')
{
board[i - 1][j - 1] = '*';
break;
}
else
{
printf("坐标已被占用,不能下棋,请重新选择其他位置\n");
}
}
else
{
printf("坐标非法,重新输入!!\n");
}
}
}
//电脑下棋
void Computer(char board[ROW][COL], int row, int col)
{
printf("电脑开始下棋:>\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;//限定取值范围为0~2
y = rand() % col;
if (board[x][y] = ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断棋盘是否满了
//满了返回1 没满返回0
int Is_full(char board[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 (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
char Win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];//
}
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//没有人赢,就要平局
if (Is_full(board, row, col))
{
return 'Q';
}
//游戏继续
return 'C';
}
(2)test.c代码如下
#include "game.h"
void meun()//菜单
{
printf("*****************************\n");
printf("********* 1. paly *********\n");
printf("********* 0. exit *********\n");
printf("*****************************\n");
}
void game()//游戏环节
{
char ret = 0;
char board[ROW][COL] = { 0 };//得到一个3*3棋盘 或者也可以是n*n的棋盘
//对这个棋盘初始化,赋予它为空白值
Zero_board(board, ROW,COL );
//给予棋盘边界画面
image_board(board, ROW, COL);
while (1)
{
Player(board, ROW, COL);
//判断输赢
ret = Win(board, ROW, COL);
if (ret != 'C')
{
break;
}
image_board(board, ROW, COL);
Computer(board, ROW, COL);
//判断输赢
ret = Win(board, ROW, COL);
if (ret != 'C')
{
break;
}
image_board(board, ROW, COL);
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
image_board(board, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int a = 0;
do
{
meun();
printf("请输入你的选择:>");
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入\n");
}
} while (a);
return 0;
}
(3)game.h代码如下
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <time.h>
#include <stdio.h>
#define ROW 3
#define COL 3
void Zero_board(char board[ROW][COL],int row,int col);
void image_board(char board[ROW][COL], int row, int col);
void Player(char board[ROW][COL], int row, int col);
void Computer(char board[ROW][COL], int row, int col);
int Is_full(char board[ROW][COL], int row, int col);
char Win(char board[ROW][COL], int row, int col);
4.总结
该代码还有许多可以改进的地方:1.电脑下棋可以优化,增加其难度。2.增加规则可以化为五子棋。
最后代码中有不足,或者不懂的地方,欢迎在评论区指正或提问!!!