ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-20 18:29:51  阅读:156  来源: 互联网

标签:int 五子棋 board 详细 printf 易懂 棋盘 COL ROW



前言

提示:经过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的视频和比特蛋哥的五子棋代码所写,感谢各位观看,觉得有帮助的小伙伴希望可以点个赞啊,感谢各位

标签:int,五子棋,board,详细,printf,易懂,棋盘,COL,ROW
来源: https://blog.csdn.net/qq_56633773/article/details/120393548

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有