目录
1.简介
根据百度百科三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。
本篇文章我们分几个部分给出三子棋的C语言源码和它的实现方式。
2.源码和解释
①main主函数
int main() {
srand(time(NULL));//初始化随机数生成器
int x = 0;
do {//do while可以保证我们至少进行一次test()函数的判定
test(x);//初始化数组,画棋盘和判定是否开始游戏
} while (test(x) == 1);//test函数返回1就继续玩
return 0;
}
②test函数
int test(int x) {
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 2.exit *****\n");
printf("******************\n");//开始界面
scanf("%d", &x);//读取是否开始游戏的判定数
if (x == 1) {//开始游戏
printf("开始游戏\n");
char arr[ROW][COL] = { 0 };//初始化数组
init(arr, ROW, COL);//初始化数组
board(arr, ROW, COL);画棋盘
game(arr, ROW, COL);//游戏主要代码
return 1;
}
else if (x == 2) {//退出游戏
printf("退出游戏\n");
return 0;
}
else {//输入其它数,再给机会重新输入
printf("输入错误,请重新输入\n");
return 1;
}
}
③init函数
init(char arr[ROW][COL], int row, int col) {\\传递数组和它的行列数
int x = 0;
int y = 0;
for (x = 0;x < row;x++) {
for (y = 0;y < col;y++) {//遍历每一个数
arr[x][y] = ' ';//初始化数组为一个空格
}
}
}
④board函数
void board(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
for (x = 0;x < row;x++) {//一格一格画就好
for (y = 0;y < col;y++) {
if (y < col - 1) {
printf(" %c ", arr[x][y]);
printf("|");
}
else
printf(" %c ", arr[x][y]);//最后一行不一样
}
printf("\n");
for (y = 0;y < col;y++) {
if (x < row - 1 && y < col - 1)
printf("---|");
else if (y == col - 1 && x != row - 1)//最后一列不一样
printf("---");
}
printf("\n");
}
}
⑤game函数
void game(char arr[ROW][COL], int row, int col) {
while (1) {//直接死循环
printf("玩家下棋,请输入棋子坐标:\n");//玩家先下
player(arr, row, col);//玩家落子
board(arr, ROW, COL);//重画落子后的棋盘
if (is_win(arr, ROW, COL) == '*') {//判胜负
printf("PLAYER WIN\n");
printf("\n");
break;
}
if (is_full(arr, ROW, COL) == ' ')//判定平局
break;
printf("电脑下棋:\n");
computer(arr, row, col);//电脑落子
board(arr, ROW, COL);//重画落子后的棋盘
if (is_win(arr, ROW, COL) == '#') {//判胜负
printf("COMPUTER WIN\n");
printf("\n");
break;
}
if (is_full(arr, ROW, COL) == ' ')//判满
break;
}
}
⑥palyer函数
void player(char arr[ROW][COL], int row, int col) {
int x = 1;
int y = 1;
scanf("%d %d", &x, &y);//读取落子位置
if (arr[x - 1][y - 1] == ' ')//行和列从零开始,附和大部分人的认知;判空
arr[x - 1][y - 1] = '*';//下棋
else {
printf("落子位置不存在或者落子位置已被占用,请重新输入:\n");//落子为止非法就重下
player(arr, row, col);//重下
}
}
⑦computer函数
void computer(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
x = rand() % 3;//随机生成0,1,2的横坐标
y = rand() % 3;//纵坐标
if (arr[x][y] == ' ')//判空
arr[x][y] = '#';//下棋
else
computer(arr, row, col);//不空重下
}
⑧is_win函数
char is_win(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
int z = 0;
//主对角线判定
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
return arr[0][0];
//斜对角线判定
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[2][0] != ' ')
return arr[2][0];
//行判定
for (x = 0;x < row;x++) {
if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][0] != ' ')
return arr[x][0];
}
//列判定
for (y = 0;y < col;y++) {
if (arr[0][y] == arr[1][y] && arr[1][y] == arr[2][y] && arr[0][y] != ' ')
return arr[0][y];
}
}
⑨is_full函数
char is_full(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
int z = 0;//读取到一个不空就加一
for (x = 0; x < row;x++) {
for (y = 0;y < col;y++) {
if (arr[x][y] != ' ')
z++;//不空就加一
}
}
if (z == 9) {//全满就是z数到了9
printf("平局,重开。\n");//满了没赢就平局,那就重玩
return ' ';
}
}
⑩全部源码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ROW 3
#define COL 3
#include "game.h"
#include <time.h>
void board(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
for (x = 0;x < row;x++) {
for (y = 0;y < col;y++) {
if (y < col - 1) {
printf(" %c ", arr[x][y]);
printf("|");
}
else
printf(" %c ", arr[x][y]);
}
printf("\n");
for (y = 0;y < col;y++) {
if (x < row - 1 && y < col - 1)
printf("---|");
else if (y == col - 1 && x != row - 1)
printf("---");
}
printf("\n");
}
}
init(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
for (x = 0;x < row;x++) {
for (y = 0;y < col;y++) {
arr[x][y] = ' ';
}
}
}
void player(char arr[ROW][COL], int row, int col) {
int x = 1;
int y = 1;
scanf("%d %d", &x, &y);
if (arr[x - 1][y - 1] == ' ')
arr[x - 1][y - 1] = '*';
else {
printf("落子位置不存在或者落子位置已被占用,请重新输入:\n");
player(arr, row, col);
}
}
void computer(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
x = rand() % 3;
y = rand() % 3;
if (arr[x][y] == ' ')
arr[x][y] = '#';
else
computer(arr, row, col);
}
char is_win(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
int z = 0;
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
return arr[0][0];
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[2][0] != ' ')
return arr[2][0];
for (x = 0;x < row;x++) {
if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][0] != ' ')
return arr[x][0];
}
for (y = 0;y < col;y++) {
if (arr[0][y] == arr[1][y] && arr[1][y] == arr[2][y] && arr[0][y] != ' ')
return arr[0][y];
}
}
char is_full(char arr[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
int z = 0;
for (x = 0; x < row;x++) {
for (y = 0;y < col;y++) {
if (arr[x][y] != ' ')
z++;
}
}
if (z == 9) {
printf("平局,重开。\n");
return ' ';
}
}
void game(char arr[ROW][COL], int row, int col) {
while (1) {
printf("玩家下棋,请输入棋子坐标:\n");
player(arr, row, col);
board(arr, ROW, COL);
if (is_win(arr, ROW, COL) == '*') {
printf("PLAYER WIN\n");
printf("\n");
break;
}
if (is_full(arr, ROW, COL) == ' ')
break;
printf("电脑下棋:\n");
computer(arr, row, col);
board(arr, ROW, COL);
if (is_win(arr, ROW, COL) == '#') {
printf("COMPUTER WIN\n");
printf("\n");
break;
}
if (is_full(arr, ROW, COL) == ' ')
break;
}
}
int test(int x) {
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 2.exit *****\n");
printf("******************\n");
scanf("%d", &x);
if (x == 1) {
printf("开始游戏\n");
char arr[ROW][COL] = { 0 };
init(arr, ROW, COL);
board(arr, ROW, COL);
game(arr, ROW, COL);
return 1;
}
else if (x == 2) {
printf("退出游戏\n");
return 0;
}
else {
printf("输入错误,请重新输入\n");
return 1;
}
}
int main() {
srand(time(NULL));
int x = 0;
do {
test(x);
} while (test(x) == 1);
return 0;
}
3.运行结果
①step 1(开始界面)
②step 2
输入1开始。
输入2退出。
输入其它重新输入。
③step 3(落子)
④获胜
中间一列三个一样,都是星号,玩家获胜。
⑤平局
4.总结
在写完这个人工智障版的三字棋后,我仔细琢磨了能不能让电脑落子智能一些,于是花了四个小时琢磨,写了很多层嵌套,但最终还是限制于个人目前的能力没能完成。待我学习到算法后,我会开发出人工智能版的三子棋,和棋的概率弄得非常高,到时候我会再发表文章,名字就叫《三字棋(智能版)》。
感谢地阅读,如果觉得可以的话,点点赞赞吧,下期见。