200行代码实现N子棋(以五子棋为例)

😀😀😀😀😀先赞后看养成习惯😀😀😀😀😀

请添加图片描述

提示:先上演示效果🐵🐵🐵🐵🐵
在这里插入图片描述


前言

棋文化是构成中华民族文化的一部分,现今世界上流行广泛的棋种大多起源于中国。 当今,大有风靡全球之势的五子棋,就是起源于中国的黑白传统棋种之一。如今五子棋已经成为了一种老少皆宜的”双人运动”,作为一个编程人员,我们应该如何去实现它呢?接下来博主就来跟从大家一起探寻五子棋的实现思路。

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

一、五子棋的主要实现思路

额,棋盘总得先一个吧,而且棋盘上现在不应该有东西吧,类似于这样
在这里插入图片描述

棋盘有了是不是就该下棋了,比如这样你走一步我走一步(为了体现我们人类的高尚品德,我们想让电脑走),效果图如下:在这里插入图片描述
好了到了这里,最关键的一步来了,你走了一步,我走了一步,是不是你或我每走一步都有可能会赢或者会输,,接下来我来带大家具体实现一下这几个主要函数
总的流程在这里插入图片描述

二、打印棋盘和初始化棋盘

void Initialize(char a[][C])//这是初始化棋盘
{
	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < R; j++)
		{
			a[i][j] = ' ';


		}
	}

}

void PrintfArr(char a[][C])//打印棋盘
{
	int n = 1;
	for (int m = 1; m <=C; m++)
	{
		printf("  %d ",m);//这是打印列号(就是你效果图上看的那极其丑陋的部分😁😁😁😁😁看到的)
	}
	printf(" 电脑->X || 玩家->O");//打印图列电脑X,玩家O
	puts("  ");
	for (int i = 0; i < R; i++)
	{
		printf("  ");
		for (int j = 0; j < C; j++)
		{
			printf("+---");
		}
		puts("+");
		printf("%2d", n);//打印行号
		n++;
		for (int k = 0; k < C; k++)
		{
			printf("| %c ", a[i][k]);
		}
		puts("|");

	}
	printf("  ");
	for (int j = 0; j < C; j++)
	{
		printf("+---");
	}
	puts("+");

}

三、电脑和玩家的移动


int ComputerMove(char a[][C])//这是电脑的
{
	int x = 0;
	int y = 0;
	x = rand() % R;//固定了坐标生成在[0,R-1] [0,C-1]的范伟
	y = rand() % C;//让电脑的坐标随机生成(当然这种随机的做法使得电脑变得比较笨),这也是玩家基本不会输的重要理由
	while (a[x][y] != ' ')//如果第一次生成的坐标不合法,就会重新生成
	{
		x = rand() % R;
		y = rand() % C;
	}
	a[x][y] = 'X';//这一步是电脑下的位置
return WhoWin(a,x,y,'X');//电脑下完过后,用一个返回值判断一下电脑下完这一步过后的输赢情况
}

int HumanMove(char a[][C])//这是人类的
{
	int x = 0;
	int y = 0;
	printf("请输入你的坐标>:");
	scanf("%d%d",&x,&y);
	while ((x > R || x < 1) || (y > C || y <1) || a[x-1][y-1] != ' ')
	{
		printf("坐标非法,请重新输入>:");
		scanf("%d%d",&x,&y);
	}
	a[x-1][y-1] = 'O';
	return WhoWin(a, x - 1, y - 1, 'O');

}

四、判断输赢

其实输赢情况无非就想一个“米”字一样,只需考虑横,竖,左斜,右斜这几种情况
我们可以用一个变量count来统计横,竖,左斜,右斜的情况,(电脑为例)只要我a[x][y]==‘x’,coun就记录一下,只要其中有一种情况满足(count>=5),我们就可以判断输赢了。如果没有一种情况能满足,那么在判断一下棋盘是否已经满了,如果没满则游戏继续(我们用return count来表示胜负,return -1表示游戏继续return 1表示没有赢家,平局)。上图演示
在这里插入图片描述
我们统计红色圈起来的的count:
横->count=1;
竖->count=1;
左斜->count=3;
右斜->count=1;
棋盘也没满,就return -1;

int WhoWin(char a[][C],int x,int y,char ch)
{
	int count = 0;
	int x1 = x;
	int y1 = y;
	//横着来
	while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0)&&a[x1][y1++]==ch)//保证++过后数组不会越界访问
	{
		count++;
	}
	x1 = x;
	y1 = y;//x1,y1重新赋值,又从开始位置从新统计,实例(-----X[X]XXX)先统计[]左边或右边,在统计其右边或左边,,,下面也是一样的道理
	while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1][y1--] == ch)
		count++;
	if (count >= Size+1)
		return count;
	
	x1 = x;
	y1 = y;
	count = 0;
	/竖着来
	while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) &&a[x1++][y1]==ch)
		count++;
	x1 = x;
	y1 = y;
	while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1--][y1]==ch)
		count++;
	if (count >= Size+1)
		return count;
	
	count = 0;
	x1 = x;
	y1 = y;
	/左下来
	while ((x1<R&&x1>=0)&&(y1<C&&y1>=0)&&a[x1++][y1++]==ch)
	{
		count++;
	}
	x1 = x;
	y1 = y;
	while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1--][y1--] == ch)
		count++;
	if (count >= Size+1)
		return count;
	
	count = 0;
	x1 = x;
	y1 = y;
	//左下来
	while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1++][y1--] == ch)
		count++;
	x1 = x;
	y1 = y;
	while ((x1< R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1--][y1++] == ch)
		count++;
	if (count >= Size+1)
		return count;
	//
	if (IsFull(a) == true)
		return 1;//(没有谁赢)棋盘满了,游戏结束
	return -1;//都不满足且棋盘未满,游戏继续

}

五、判断棋盘是否满

bool IsFull(char a[][C])
{
	for (int i = 0; i < R; i++)
		for (int j = 0; j < C; j++)
			if (a[i][j] == ' ')
				return false;
	return true;

}

六、所引头文件和函数声明

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<time.h>
#include<stdbool.h>
#define R 15
#define C 15
#define Size 5//几子棋
void Initialize(char a[][C]);//初始化棋牌
void PrintfArr(char a[][C]);//打印棋盘
int ComputerMove(char a[][C]);//电脑移动
int HumanMove(char a[][C]);//人类移动
int WhoWin(char a[][C],int x,int y,char ch);//判断输赢
bool IsFull(char a[][C]);//棋盘是否已满

七、敲个主函数让游戏“活”起来

#include"Gobang.h"
void test1()
{
	int com = 0;
	int man = 0;
	char arr[R][C];
	Initialize(arr);
	while (1)
	{
	   com=ComputerMove(arr);
	if (com == Size+1 )
	{
		system("cls");
		PrintfArr(arr);
		printf("小菜鸡,居然让电脑赢了\a\a\a\n");
		break;
	}
	else if (com == 1)
	{
		system("cls");
		PrintfArr(arr);
		printf("平局\a\a\a\n");
		break;
	}
		PrintfArr(arr);
		///分界线
		man=HumanMove(arr);
		if (man >= Size+1 )
		{
			system("cls");
			PrintfArr(arr);
			printf("恭喜你赢了(狗叫)\a\a\a\n");
			break;
		}
		else if (man >= 1)
		{
			system("cls");
			PrintfArr(arr);
			printf("平局\a\a\a\n");
			break;
		}
		system("cls");
	}
	
}

int main()
{
	srand((int)time(NULL));
	test1();

	return 0;
}

八、运行结果展示

在这里插入图片描述

总结

菜单的话,读者感兴趣的话,可以自行下去写一下,
程序有不完美的地方,欢迎大家指出其中的bug
欢迎大家,在评论区留言
在这里插入图片描述
最后别忘了一键三连哦,你的支持就是博主的动力!😁😁😁😁😁😀

  • 55
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
以下是一个简单的C语言实现五子棋代码示例: ```c #include <stdio.h> #define SIZE 15 char board[SIZE][SIZE]; // 棋盘 void initBoard() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { board[i][j] = ' '; } } } void printBoard() { printf(" "); for (int i = 0; i < SIZE; i++) { printf("%2d", i); } printf("\n"); for (int i = 0; i < SIZE; i++) { printf("%2d", i); for (int j = 0; j < SIZE; j++) { printf(" %c", board[i][j]); } printf("\n"); } } int checkWin(int row, int col, char player) { int count = 0; int i, j; // 横向检查 for (i = col - 4; i <= col; i++) { if (i >= 0 && i + 4 < SIZE) { count = 0; for (j = i; j <= i + 4; j++) { if (board[row][j] == player) { count++; } } if (count == 5) { return 1; } } } // 纵向检查 for (i = row - 4; i <= row; i++) { if (i >= 0 && i + 4 < SIZE) { count = 0; for (j = i; j <= i + 4; j++) { if (board[j][col] == player) { count++; } } if (count == 5) { return 1; } } } // 左上到右下斜向检查 for (i = row - 4, j = col - 4; i <= row && j <= col; i++, j++) { if (i >= 0 && i + 4 < SIZE && j >= 0 && j + 4 < SIZE) { count = 0; for (int k = 0; k < 5; k++) { if (board[i + k][j + k] == player) { count++; } } if (count == 5) { return 1; } } } // 左下到右上斜向检查 for (i = row + 4, j = col - 4; i >= row && j <= col; i--, j++) { if (i >= 0 && i - 4 < SIZE && j >= 0 && j + 4 < SIZE) { count = 0; for (int k = 0; k < 5; k++) { if (board[i - k][j + k] == player) { count++; } } if (count == 5) { return 1; } } } return 0; } int main() { int row, col; char player = 'X'; initBoard(); while (1) { printBoard(); printf("Player %c's turn. Enter row and column: ", player); scanf("%d %d", &row, &col); if (row < 0 || row >= SIZE || col < 0 || col >= SIZE) { printf("Invalid input. Please try again.\n"); continue; } if (board[row][col] != ' ') { printf("This position is already occupied. Please try again.\n"); continue; } board[row][col] = player; if (checkWin(row, col, player)) { printf("Player %c wins!\n", player); break; } player = (player == 'X') ? 'O' : 'X'; } return 0; } ```
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南猿北者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值