C语言实现三子棋游戏(也实现N子棋)

这是我作为一个初学者第一次尝试搞出来的东西,它不但可以实现三子棋游戏,通过修改#define的定义,还可以实现N子棋游戏。

首先,分析该游戏需要的逻辑
  1. 作为一个游戏,它首先需要有一个用户菜单,让用户选择开始或选择退出游戏,故需使用一个do while循环(需要在程序的一开始就显示菜单,并且在正常游戏流程结束时再次让玩家选择继续或者退出)来显示菜单并接收用户的输入,以此判断玩家是否玩游戏。
  2. 在玩家选择退出游戏是跳出循环,若玩家选择开始游戏,则进入游戏函数(game)。
  3. 作为一个下棋游戏,应该先让其显示棋盘,接着让玩家选择棋子的坐标位置(这里需要一个二维数组),然后电脑方利用头文件stdlib.h头文件、srand以及rand函数来生成一个随机坐标值。
  4. 利用二维数组将对应的坐标位置填入玩家或电脑的棋子,并在每次填入后打印此时的棋盘供玩家观察。
  5. 此时已完成了怎么下棋的问题,我自己在做的时候觉得判断输赢是最难的部分,我利用了四个循环来判断连行、连列、左上至右下以及右上至左下。
  6. 此时游戏基本完成,只需将各个函数按顺序连接起来即可。
play
exit
没有胜方
平局
开始菜单
显示棋盘
退出
输入
判断输赢
玩家或电脑
告知平局

以下是代码部分

首先,在头文件中写入

#include<stdio.h>
#include<stdlib.h>

#define ROW 3
#define COL 3//修改此处可实现N子棋

void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(char board[ROW][COL], int row, int col);
void Player(char board[ROW][COL], int row ,int col);
void Computer(char board[ROW][COL], int row, int col);

char IsWin(char board[ROW][COL], int row, int col);


以上均为函数声明,而游戏程序的主函数我也在以下写出

#include "game.h"//头文件名
int main()
{
	srand((unsigned int)time(NULL));//随机数种子
	menu();
	return 0;
}

在上边,利用头文件stdlib.h,srand函数,rand函数生成随机数。
menu函数内容:

void menu()
{
	int input = 0;
	do
	{
		printf("*******************\n");
		printf("****** 1.PLAY *****\n");
		printf("****** 0.EXIT *****\n");
		printf("*******************\n");
		scanf("%d", &input);
		if (input == 1)
			game();
		else if (input == 0)
		{
			printf("退出游戏\n");
			break;
		}
			
		else
			printf("非法输入\n");

	} while (1);
}

进行游戏则进入game函数,如下:

void game()
{
	char board[ROW][COL] = {0};
	char ret = 0;
	InitBoard(board, ROW, COL);
	PrintBoard(board, ROW, COL);
	while (1)
	{
		Player(board, ROW, COL);
		PrintBoard(board, ROW, COL);
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
		Computer(board , ROW, COL);
		PrintBoard(board, ROW, COL);
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢!\n");
	else if (ret == '#')
		printf("电脑赢!\n");
	else if (ret == 'Q')
		printf("平局!\n");
	
}

创建棋盘函数:

void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';//在其中输入空格字符
		}
	}
}

打印棋盘函数:

void PrintBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}//打印竖着的 “ | ”
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("___");
				if (j < col - 1)
					printf("|");
			}//打印 "__"
			printf("\n");
		}
	}
	printf("\n");
}

效果如下图
打印好的棋盘
用于接收玩家坐标并下对应棋子的函数:

void Player(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走\n\n");
	while (1)
	{
		printf("请输入要走的坐标: ");
		scanf("%d %d", &x, &y);
		if (x <= ROW && y <= COL && x >= 1 && y >= 1)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';//减去一是为了符合逻辑(大部分朋友会认为坐标是从1开始的,实际数组中是从零开始的)
				break;
			}
			else
			{
				printf("坐标被占用!\n");
			}
		}//需判断坐标是否存在或被占用
		else
			printf("坐标非法!\n\n");
	}
}

电脑输入Computer函数:

void Computer(char board[ROW][COL], int row, int col)
{
	printf("电脑走: \n\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

判断输赢函数:

char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	int Player = 0;
	int Computer = 0;
	int win = 0;
	while (i <= row)//判断行
	{
		Player = 0;
		Computer = 0;
		j = 0;
		while (j < (col - 1))
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] == '*')
				Player++;
			if (board[i][j] == board[i][j + 1] && board[i][j] == '#')
				Computer++;
			if (Player == (row - 1))
				return '*';
			else if (Computer == (row - 1))
				return '#';
			j++;
		}
		i++;
	}
	i = 0;
	j = 0;
	Player = 0;
	Computer = 0;
	while (j <= row)//判断列
	{
		Player = 0;
		Computer = 0;
		i = 0;
		while (i < (col - 1))
		{
			if (board[i][j] == board[i + 1][j] && board[i][j] == '*')
				Player++;
			if (board[i][j] == board[i + 1][j] && board[i][j] == '#')
				Computer++;
			if (Player == (row - 1))
				return '*';
			else if (Computer == (row - 1))
				return '#';
			i++;
		}
		j++;
	}
	Player = 0;
	Computer = 0;
	/*i = 0;
	j = 0;*/
	for (i = 0; i < row; i++)//斜左上至右下
	{
		if (board[i][i] == board[i + 1][i + 1] && board[i][i] == '*')
			Player++;
		if (board[i][i] == board[i + 1][i + 1] && board[i][i] == '#')
			Computer++;
		if (Player == (row - 1))
			return '*';
		else if (Computer == (row - 1))
			return '#';
	}
	Player = 0;
	Computer = 0;
	for (i = 0, j = (col - 1); i < row, j > 0 ; i++ , j--)//斜右上至左下
	{
			if (board[i][j] == board[i + 1][j - 1] && board[i][j] == '*')
				Player++;
			if (board[i][j] == board[i + 1][j - 1] && board[i][j] == '#')
				Computer++;
			if (Player == (row - 1))
				return '*';
			else if (Computer == (row - 1))
				return '#';
	}


	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				win++;
		}
	}
	if (win == 0)
		return 'Q';
	    return 'C';
}
至此程序已经基本完成,只需将各个函数有机的组合在一起即可,假如你想实现更多子棋,仅需将#define定义的行数列数修改即可。
这里贴上工程文件

github 链接.

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值