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

  • 32
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
一个很好的五子棋c语言程序代码,最重要的是能运行正确!!! #include #include #include #include #include #define CROSSRU 0xbf /*右上角点*/ #define CROSSLU 0xda /*左上角点*/ #define CROSSLD 0xc0 /*左下角点*/ #define CROSSRD 0xd9 /*右下角点*/ #define CROSSL 0xc3 /*左边*/ #define CROSSR 0xb4 /*右边*/ #define CROSSU 0xc2 /*上边*/ #define CROSSD 0xc1 /*下边*/ #define CROSS 0xc5 /*十字交叉点*/ /*定义棋盘左上角点在屏幕上的位置*/ #define MAPXOFT 5 #define MAPYOFT 2 /*定义1号玩家的操作键键码*/ #define PLAY1UP 0x1157/*上移--'W'*/ #define PLAY1DOWN 0x1f53/*下移--'S'*/ #define PLAY1LEFT 0x1e41/*左移--'A'*/ #define PLAY1RIGHT 0x2044/*右移--'D'*/ #define PLAY1DO 0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/ #define PLAY2UP 0x4800/*上移--方向键up*/ #define PLAY2DOWN 0x5000/*下移--方向键down*/ #define PLAY2LEFT 0x4b00/*左移--方向键left*/ #define PLAY2RIGHT 0x4d00/*右移--方向键right*/ #define PLAY2DO 0x1c0d/*落子--回车键Enter*/ /*若想在游戏中途退出, 可按 Esc 键*/ #define ESCAPE 0x011b /*定义棋盘上交叉点的状态, 即该点有无棋子 */ /*若有棋子, 还应能指出是哪个玩家的棋子 */ #define CHESSNULL 0 /*没有棋子*/ #define CHESS1 'O'/*一号玩家的棋子*/ #define CHESS2 'X'/*二号玩家的棋子*/ /*定义按键类别*/ #define KEYEXIT 0/*退出键*/ #define KEYFALLCHESS 1/*落子键*/ #define KEYMOVECURSOR 2/*光标移动键*/ #define KEYINVALID 3/*无效键*/ 下载可看到完整的...
五子棋是一种非常经典的棋类游戏,以下是一个简单的五子棋C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define ROW 15 #define COL 15 void show_board(char board[][COL]); int judge_win(char board[][COL], int row, int col); int main(){ char board[ROW][COL]; memset(board, ' ', sizeof(board)); //初始化棋盘为空格 int row, col; char symbol = 'X'; //X先手,O后手 while(1){ show_board(board); printf("请 %c 方输入下棋的位置(e.g. 3,4):", symbol); scanf("%d,%d", &row, &col); if(row >= 1 && row <= ROW && col >= 1 && col <= COL && board[row-1][col-1] == ' '){ board[row-1][col-1] = symbol; if(judge_win(board, row-1, col-1)){ show_board(board); printf("%c 方胜利!\n", symbol); break; } symbol = (symbol == 'X' ? 'O' : 'X'); //交换下棋方 } else{ printf("输入有误,请重新输入!\n"); } } return 0; } //显示棋盘 void show_board(char board[][COL]){ printf(" "); for(int i=1; i<=COL; i++){ printf("%d ", i); } printf("\n"); for(int i=0; i<ROW; i++){ printf("%d ", i+1); for(int j=0; j<COL; j++){ printf("%c ", board[i][j]); } printf("\n"); } } //判断胜利 int judge_win(char board[][COL], int row, int col){ int i, j, count; //判断横向五子连珠 count=1; for(i=col-1; i>=0 && board[row][i]==board[row][col]; i--,count++); for(i=col+1; i<COL && board[row][i]==board[row][col]; i++,count++); if(count >= 5) return 1; //判断纵向五子连珠 count=1; for(i=row-1; i>=0 && board[i][col]==board[row][col]; i--,count++); for(i=row+1; i<ROW && board[i][col]==board[row][col]; i++,count++); if(count >= 5) return 1; //判断右上斜向五子连珠 count=1; for(i=row-1, j=col+1; i>=0 && j<COL && board[i][j]==board[row][col]; i--,j++,count++); for(i=row+1, j=col-1; i<ROW && j>=0 && board[i][j]==board[row][col]; i++,j--,count++); if(count >= 5) return 1; //判断右下斜向五子连珠 count=1; for(i=row-1, j=col-1; i>=0 && j>=0 && board[i][j]==board[row][col]; i--,j--,count++); for(i=row+1, j=col+1; i<ROW && j<COL && board[i][j]==board[row][col]; i++,j++,count++); if(count >= 5) return 1; return 0; } ``` 运行后,会显示一个15x15的棋盘,玩家可以输入坐标下棋,程序会判断胜负并交换下棋方。注意,这只是一个简单的示例,还有很多需要完善的地方,例如输入错误时的处理、和AI对战等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值