c语言-简单实现三子棋小游戏

博主在掌握数组知识后,运用C语言制作了一个三子棋小游戏,并扩展到多子棋模式。游戏目前支持两位玩家对弈,但在实现玩家与电脑对战时,电脑的下棋策略较为随机,水平较低。博主期待能通过改进算法提高电脑的智能性,并欢迎读者分享建议和进行讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天看了有关数组的一些知识后,便尝试用数组做了个三子棋小游戏,并扩展到了多子棋:

文章目录


#游戏的菜单选择及程序主体部分(test.c):

#include "game.h"

int n = 0;	//n为输入数,玩家输入几,便可以玩几子棋。
//游戏菜单
void menu()
{
	printf("**************************\n");
	printf("***** 1.play  0.exit *****\n");
	printf("**************************\n");
}
//棋盘的创建初始化及玩游戏过程
void game()
{
	char board[ROW][COL] = { 0 };
	Init_board(board, ROW, COL);
	Display_board(board, ROW, COL);
	Play_game(board, ROW, COL);
}
//菜单选择部分
void test()
{
	srand((unsigned int)time(NULL));
	int input = 0;

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("您想玩哪种游戏?(三子棋到n字棋)输入数字即可:>");
			scanf("%d", &n);
			game();
			break;
		case 0:
			printf("退出成功!\n");
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

#头文件包含,宏的创建及所用函数的声明(game.h):

#ifndef __GAME_H__
#define __GAME_H__

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

#define ROW 10	//棋盘的行数
#define COL 10	//棋盘的列数

void Init_board(char board[ROW][COL], int row, int col);
void Display_board(char board[ROW][COL], int row, int col);
void Play_game(char board[ROW][COL], int row, int col);
char Iswin(char board[ROW][COL], int row, int col);

#endif //__GAME_H__

#所用函数的实现(game.c):

#include "game.h"

extern int n;

//初始化棋盘
void Init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	memset(board, ' ', row * col * sizeof(board[0][0]));
}

//打印当前棋盘
void Display_board(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++)
		{
			if (j < col - 1)
			{
				printf(" %c |", board[i][j]);
			}
			else
			{
				printf(" %c \n", board[i][j]);
			}
		}
		if (i < row - 1) 
		{
			for (j = 0; j < col; j++)
			{
				if (j < col - 1)
				{
					printf("---|");
				}
				else
				{
					printf("---\n");
				}
			}
		}
	}
}

//判断输赢
char Iswin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	char tmp = 0;
	int num = 0;
	int m = 0;

	//判断行
	for (i = 0; i < row; i++)
	{
		num = 1;
		tmp = board[i][0];
		for (j = 1; j < col; j++)
		{
			if (tmp == board[i][j] && tmp != ' ')
			{
				num++;
			}
			else
			{
				tmp = board[i][j];
				num = 1;
			}
			if (num == n)
			{
				return tmp;
			}
		}
	}
	
	//判断列
	for (j = 0; j < col; j++)
	{
		num = 1;
		tmp = board[0][j];
		for (i = 1; i < row; i++)
		{
			if (tmp == board[i][j] && tmp != ' ')
			{
				num++;
			}
			else
			{
				tmp = board[i][j];
				num = 1;
			}
			if (num == n)
			{
				return tmp;
			}
		}
	}

	//判断下半部分\对角线
	m = 0;
	while (m <= row - n)
	{
		tmp = board[m][0];
		num = 1;
		for (i = m + 1; i < row; i++)
		{
			if (tmp == board[i][i - m] && tmp != ' ')
			{
				num++;
			}
			else
			{
				tmp = board[i][i - m];
				num = 1;
			}
			if (num == n)
			{
				return tmp;
			}
		}
		m++;
	}
	//判断上半部分\对角线
	m = 1;
	while (m <= col - n)
	{
		tmp = board[0][m];
		num = 1;
		for (j = m + 1; j < col; j++)
		{
			if (tmp == board[j - m][j] && tmp != ' ')
			{
				num++;
			}
			else
			{
				tmp = board[j - m][j];
				num = 1;
			}
			if (num == n)
			{
				return tmp;
			}
		}
		m++;
	}

	//判断下半部分/对角线
	m = 0;
	while (m <= row - n)
	{
		tmp = board[m][row - 1];
		num = 1;
		for (i = m + 1; i < row; i++)
		{
			if (tmp == board[i][col - 1 - i + m] && tmp != ' ')
			{
				num++;
			}
			else
			{
				tmp = board[i][col - 1 - i + m];
				num = 1;
			}
			if (num == n)
			{
				return tmp;
			}
		}
		m++;
	}

	//判断上半部分/对角线
	m = col - 2;
	while (m >= n - 1)
	{
		tmp = board[0][m];
		num = 1;
		for (j = m - 1; j >= 0; j--)
		{
			if (tmp == board[m - j][j] && tmp != ' ')
			{
				num++;
			}
			else
			{
				tmp = board[m - j][j];
				num = 1;
			}
			if (num == n)
			{
				return tmp;
			}
		}
		m--;
	}

	return -1;
}

void Play_game(char board[ROW][COL], int row, int col)
{
	int r1 = 0;
	int c1 = 0;
	int r2 = 0;
	int c2 = 0;
	int count = 0;
	char ret = 0;

	while (1)
	{
		if (n == 3)
		{
			printf("玩家1下:>(1-%d)", n);
			scanf("%d%d", &r1, &c1);
			if (r1 > n || c1 > n || board[r1 - 1][c1 - 1] != ' ')
			{
				printf("输入错误!\n");
				continue;
			}
			if (board[r1 - 1][c1 - 1] == ' ')
			{
				board[r1 - 1][c1 - 1] = 'X';
			}
		}
		else
		{
			printf("玩家1下:>(1-%d)", row);
			scanf("%d%d", &r1, &c1);
			if (r1 > row || c1 > col || board[r1 - 1][c1 - 1] != ' ')
			{
				printf("输入错误!\n");
				continue;
			}
			if (board[r1 - 1][c1 - 1] == ' ')
			{
				board[r1 - 1][c1 - 1] = 'X';
			}
		}
		Display_board(board, ROW, COL);
		count++;
		ret = Iswin(board, ROW, COL);
		if (ret == 'X')
		{
			printf("玩家1赢!\n");
			break;
		}

		if (count == ((row * col + 1) / 2))
		{
			printf("平局!\n");
			break;
		}

		if (n == 3)
		{
			I:
			printf("玩家2下:>(1-%d)", n);
			scanf("%d%d", &r2, &c2);
			if (r2 > n || c2 > n || board[r2 - 1][c2 - 1] != ' ')
			{
				printf("输入错误!\n");
				goto I;
			}
			if (board[r2 - 1][c2 - 1] == ' ')
			{
				board[r2 - 1][c2 - 1] = 'O';
			}
		}
		else
		{
			L:
			printf("玩家2下:>(1-%d)", row);
			scanf("%d%d", &r2, &c2);
			if (r2 > row || c2 > col || board[r2 - 1][c2 - 1] != ' ')
			{
				printf("输入错误!\n");
				goto L;
			}
			if (board[r2 - 1][c2 - 1] == ' ')
			{
				board[r2 - 1][c2 - 1] = 'O';
			}
		}
		Display_board(board, ROW, COL);
		ret = Iswin(board, ROW, COL);
		if (ret == 'O')
		{
			printf("玩家2赢!\n");
			break;
		}
	}
}

这个小程序,虽然是实现了三子棋以及n子棋,但是我只是完成了两个玩家可以正常对弈,玩家和电脑玩时,电脑的下棋步骤太过随机,导致结果就是电脑特别的菜,并不会阻挡玩家。希望各位在看过之后,有任何可以改进电脑下棋算法的想法,可以教教我,我也会再想想好的办法,互相讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值