c语言基础五子棋,十分的易懂理解,详细解释,容易上手


前言

提示:经过b站和视频学习后编程


提示:以下是本篇文章正文内容,下面案例可供参考

文章目录

五子棋

本篇博客主要写了关于c语言的五子棋代码
思路:
五子棋我们可以将代码分成棋盘和棋子两大部分,理所当然的,我们需要知道棋子下棋的位置和棋盘的大小。然后在五子棋中,我们是每下完一次棋便需要进行一次胜负的判定虽然在生活当中,在五子棋刚开始我们不会去思考胜负,但下到后面,我们仔细想想,我们是不是每下一次棋,便会思考胜负。当然,在回过头去想,对于编程来说,下棋的位置也需要进行思考

头文件

因为是一个小程序,所以我并没有写在头文件中,而是和源文件放在一起,方便修改

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define Player1 1//这里表示游戏的三种情况:玩家1胜,玩家2胜,游戏继续
#define Player2 2
#define next 3
#define ROW 11//棋盘大小
#define COL 11

因为 我已注释,便不过多赘述

展示棋盘(display)

我是选择先做棋盘的展示,这样才会方便我之后写代码进行验证
因为我是喜欢从1开始计算,所以我让x和y从1开始计数
⭐注意:这里的x,y并不是全局变量中的x,y。对于函数来说,当名字重复时,会优先使用本函数内的变量,而不是全局变量的x,y
然后对于玩家1则用&表示,而玩家2则用*表示

void display(int board[][COL],int row,int col){//此函数用来展示棋盘
	int x;
	printf("\t");
	for (x = 1; x < row; x++) {
		printf("%d\t", x);
	}
	printf("\n");
	for (x = 1; x < row; x++) {
		int y = 1;
		printf("%d\t", x);
		for (; y < row; y++) {
			if (board[x][y] == Player1)
				printf("&\t");
			else if (board[x][y] == Player2)
				printf("*\t");
			else
				printf("#\t");
		}
		printf("\n");
	}
}

下棋(PlayMove)

在进行下棋代码前,我先展示了一下棋盘是否能成功,再进行下棋函数
我们需要把棋盘这个二维数组进行传入,然后who表示当前下棋的玩家,而who2是我为了避免棋盘上,若已有棋子,则无法在此位置上下棋
这里需要while进行循环,直到下棋成功(为了避免棋子越界或犯规)

void PlayMove(int board[][COL],int row,int col,int who,int who2) {
	//第一个who是来表示当前下棋的人,第二个who是避免在已有棋子的位置下棋
	while (1) {
		printf("玩家%d走:", who);
		scanf("%d%d", &x, &y);//这里的x,y是全局变量,用来获取下棋的位置
		if (x >= 1 && x < row && y >= 1 && y < col) {//不能越界
			if (board[x][y] != who && board[x][y] != who2) {
				board[x][y] = who;
				break;
			}
			else
				printf("位置已占!\n");
			
		}
		else
			printf("不在范围内!\n");
	}

}

主体函数(game)

首先开辟棋盘的内存,并展示棋盘,然后在while循环内进行下棋,展示棋盘
由于每次下完棋后必须要进行胜负判断,所以紧接Isover函数,只有Isover返回Player1或Player2时,才可以退出循环,并显示结果

void game() {//game函数是主体函数
	int board[ROW][COL];//定义棋盘大小
	memset(board, ROW, COL);//给棋盘开创内存
	int result = next;
	display(board, ROW, COL);
	while (1) {
		PlayMove(board,ROW,COL,Player1,Player2);//先玩家1走,再展示棋盘,在进行胜负判定,最后再返回结果
		display(board, ROW, COL);
		result = Isover(board, ROW, COL, Player1);
		if (result != next)//若result为next,则游戏继续,若不是next,则退出循环,返回结果
			break;
		PlayMove(board, ROW, COL, Player2,Player1);
		display(board, ROW, COL);
		result = Isover(board, ROW, COL, Player2);
		if (result != next)
			break;
	}
	printf("胜利者是Player%d",result);
}

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define Player1 1//这里表示游戏的三种情况:玩家1胜,玩家2胜,游戏继续
#define Player2 2
#define next 3
#define ROW 11//棋盘大小
#define COL 11

int x = 0;//全局变量x,y,用来确定当前下棋的位置
int y = 0;

void display(int board[][COL],int row,int col){//此函数用来展示棋盘
	int x;
	printf("\t");
	for (x = 1; x < row; x++) {
		printf("%d\t", x);
	}
	printf("\n");
	for (x = 1; x < row; x++) {
		int y = 1;
		printf("%d\t", x);
		for (; y < row; y++) {
			if (board[x][y] == Player1)
				printf("&\t");
			else if (board[x][y] == Player2)
				printf("*\t");
			else
				printf("#\t");
		}
		printf("\n");
	}
}

int Isover(int board[][COL],int row,int col,int who) {//此函数用来判断胜负
	int Place_x[8] = { 0,0,1,-1,-1,1,-1,1 };//Place_x和Place_y共同来表示当前棋子的八个方向
	int Place_y[8] = { -1,1,0,0,-1,1,1,-1 };
	int num[4] = { 1,1,1,1 };//num数组则用来计数4条直线上的棋子
	for (int i = 0; i < 8; i++) {
		if (x + Place_x[i] >= 1 && y + Place_y[i] >= 1 && x + Place_x[i] <= ROW && y + Place_y[i] <= COL) {
			int _x = x;//每次for循环开始都需要重新回到当前棋子的位置
			int _y = y;
			for (int j = 0; j <= 4; j++) {
				_x += Place_x[i];
				_y += Place_y[i];
				if (board[x][y] == board[_x][_y]) {//如果是同一个玩家下的棋,则num数组计数+1
					num[i / 2] += 1;
					
				}
				else break;
				
			}
		}
	}
	for (int i = 0; i < 4; i++) {//当num数组总数,即某条直线上的棋子数有5颗或超过5颗,则返回胜者
		if (num[i] >= 5) {
			return who;
		}
	}
	return next;//若上面的for函数未满足条件,则游戏继续
}

void PlayMove(int board[][COL],int row,int col,int who,int who2) {
	//第一个who是来表示当前下棋的人,第二个who是避免在已有棋子的位置下棋
	while (1) {
		printf("玩家%d走:", who);
		scanf("%d%d", &x, &y);//这里的x,y是全局变量,用来获取下棋的位置
		if (x >= 1 && x < row && y >= 1 && y < col) {//不能越界
			if (board[x][y] != who && board[x][y] != who2) {
				board[x][y] = who;
				break;
			}
			else
				printf("位置已占!\n");
			
		}
		else
			printf("不在范围内!\n");
	}

}

void game() {//game函数是主体函数
	int board[ROW][COL];//定义棋盘大小
	memset(board, ROW, COL);//给棋盘开创内存
	int result = next;
	display(board, ROW, COL);
	while (1) {
		PlayMove(board,ROW,COL,Player1,Player2);//先玩家1走,再展示棋盘,在进行胜负判定,最后再返回结果
		display(board, ROW, COL);
		result = Isover(board, ROW, COL, Player1);
		if (result != next)//若result为next,则游戏继续,若不是next,则退出循环,返回结果
			break;
		PlayMove(board, ROW, COL, Player2,Player1);
		display(board, ROW, COL);
		result = Isover(board, ROW, COL, Player2);
		if (result != next)
			break;
	}
	printf("胜利者是Player%d",result);
}

int main() {
	int a = 1;
	while(a){
		game();
		printf("继续请输1,退出请输0\n");
		scanf("%d", &a);
	}
	return 0;
}

这篇代码是参照了b站up主SunistC的视频和比特蛋哥的五子棋代码所写,感谢各位观看,觉得有帮助的小伙伴希望可以点个赞啊,感谢各位

上一篇:关于简易三子棋的实现细节(C语言)


下一篇:4.数组dddd