三字棋(人工智障版)C语言源码和它的实现方式

目录

1.简介

2.源码和解释

①main主函数

②test函数

③init函数

④board函数

⑤game函数

⑥palyer函数

⑦computer函数

⑧is_win函数

⑨is_full函数

⑩全部源码

3.运行结果

①step 1(开始界面)

②step 2

③step 3(落子)

④获胜

⑤平局

4.总结


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.总结

        在写完这个人工智障版的三字棋后,我仔细琢磨了能不能让电脑落子智能一些,于是花了四个小时琢磨,写了很多层嵌套,但最终还是限制于个人目前的能力没能完成。待我学习到算法后,我会开发出人工智能版的三子棋,和棋的概率弄得非常高,到时候我会再发表文章,名字就叫《三字棋(智能版)》。

        感谢地阅读,如果觉得可以的话,点点赞赞吧,下期见。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值