C语言小游戏---三子棋

本文介绍如何用C语言实现三子棋游戏。先说明了游戏规则,玩家与电脑下棋,三个棋子连成行、列或斜着连则游戏结束。接着阐述基本思路,包括main函数和game函数的运用及宏定义棋盘大小。最后给出代码实现,涵盖main函数、game函数各部分及game.h头文件,并列出源代码。

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

相信大家都有玩过五子棋小游戏,今天我们来用C语言实现这个游戏吧!

目录

一、游戏规则

二、基本思路

三、代码实现

1.main()函数

2.game()函数:

(1)初始化函数

(2)打印棋盘函数

(3)玩家下棋函数和电脑下棋函数

(4)判断函数

(5)判断结束函数和打印获胜函数(这个是根据上一步的判断函数返回值来作为判断条件)

game()函数源代码:

3.game.h头文件

四、源代码

test.c

game.c

game.h


一、游戏规则

游戏开始,玩家下棋,当三个棋子连成一行或者一列或者斜着连,则游戏结束。

在此程序中,我们用电脑代替另一名玩家进行下棋。

二、基本思路

1.main函数:与扫雷游戏类似,运用do-while语句,switch-case语句,使游戏可以重复玩。

2.game()函数中:打印棋盘函数,下棋函数(玩家和电脑),判断棋子函数。

3.宏定义:棋盘的大小(可以在宏定义上更改)

三、代码实现

1.main()函数

运用运用do-while语句,switch-case语句,使游戏可以重复玩。

void menu()
{
	printf("*****************\n");
	printf("**** 1. play ****\n");
	printf("**** 0. exit ****\n");
	printf("*****************\n");
}
int main() {
	int input;
	srand((unsigned int)time(NULL));//随机数
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
		}
	} while (input);
	return 0;

}

2.game()函数:

首先定义一个二维数组,用来存储棋子和打印棋盘。

(1)初始化函数

将所有格子初始成空格

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] = ' ';
		}
	}
}
(2)打印棋盘函数

初始化后,我们希望打印这样的棋盘

在这里我们运用二维数组来实现:用 “ | ”和“ --- ”来完成格子边框的实现。

void Displayboard(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");
	}
}

最终程序呈现的是这样一个格子:

(3)玩家下棋函数和电脑下棋函数

打印好棋盘后,玩家开始游戏,选择坐标进行下棋。我们这里用“ * ”来表示玩家的棋子。

运用while的一个死循环来实现玩家多次下棋,用二维数组来记录玩家下的棋子。

void Playerboard(char board[ROW][COL], int row, int col)
{
	int a;
	int b;
	while (1)
	{
		printf("请玩家输入坐标:");
		scanf("%d%d", &a, &b);
		if (a >= 1 && a <= row && b >= 1 && b <= row)
		{
			if (board[a - 1][b - 1] == ' ')
			{
				board[a - 1][b - 1] = '*';

				break;
			}
			else
			{
				printf("坐标已被占用,请重新输入!\n");
			}
		}
		else
			printf("坐标输入非法!请重新输入!\n");

	}
}

 电脑也是类似,但是不同的是电脑下的棋子是随机值(因为当前没有进行AI人工智能的学习,所以只能用随机值来代替电脑棋子)。这里我们用“ 0 ”来表示电脑下的棋子并记录。

void Computerboard(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋\n");
	int a;
	int b;
	while (1)
	{
		a = rand() % row;
		b = rand() % col;
		if (board[a][b] == ' ')
		{
			board[a][b] = '0';
			break;
		}
	}

}
(4)判断函数

判断胜利条件,也是这个游戏中最重要的一个函数。我们这里定义一个char的类型函数,这里我们判定的只是三子棋,若想判定五子棋需要改一下if中的条件。

判断斜行的时候需要加上一个判定条件,因为如果从0开始判断有可能会数组越界(board[ i ][ j-1 ]和board[ i ][ j - 2 ]),导致无法判断斜行。

    //返回C -- 继续
    //返回* -- 玩家赢
    //返回O -- 电脑赢
    //返回P -- 平局

char Determineboard(char board[ROW][COL], int row, int col)
{
	//返回C -- 继续
	//返回* -- 玩家赢
	//返回O -- 电脑赢
	//返回P -- 平局
	int i;
	int j;
	//判断行
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j] != ' ')
			{
				return board[i][j];
			}

		}
		/*if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1]!=' ')
		{
			return board[i][1];
		}*/

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

		}
		/*if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}*/

	}
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < row; j++)
		{
			if (i < col - 2 && j < row - 2)
			{
				if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] && board[i][j] != ' ')
				{
					return board[i][j];
				}
			}
		}
		/*if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		{
			return board[1][1];
		}*/

	}
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < row; j++)
		{
			if (i < col - 2 && j > row - 2)
			{
				if (board[i][j] == board[i + 1][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2] && board[i][j] != ' ')
				{
					return board[i][j];
				}
			}
		}
		/*	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
			{
				return board[1][1];
			}*/

	}
	if (Fullboard(board, ROW, COL))
	{
		return 'P';
	}
	return 'C';
}

中间还穿插这一个函数(棋盘是否满棋子),若满棋子,则是平局。

//判断是否满棋子
int Fullboard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
(5)判断结束函数和打印获胜函数(这个是根据上一步的判断函数返回值来作为判断条件)
while (1)
	{
		Playerboard(board, ROW, COL);//玩家下棋
		Displayboard(board, ROW, COL);//打印棋盘
		ret = Determineboard(board, ROW, COL);//判断
		if (ret != 'C')
		{
			break;
		}
		Computerboard(board, ROW, COL);//电脑下棋
		Displayboard(board, ROW, COL);//打印棋盘
		ret = Determineboard(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家获胜\n");

	}
	else if (ret == '0')
	{
		printf("电脑获胜\n");
	}
	else
	{
		printf("平局!");
	}
game()函数源代码:
void game()
{
	char board[ROW][COL];
	char ret = 0;
	Initboard(board, ROW, COL);//初始化全部是空格
	Displayboard(board, ROW, COL);//打印棋盘

	while (1)
	{
		Playerboard(board, ROW, COL);//玩家下棋
		Displayboard(board, ROW, COL);//打印棋盘
		ret = Determineboard(board, ROW, COL);//判断
		if (ret != 'C')
		{
			break;
		}
		Computerboard(board, ROW, COL);//电脑下棋
		Displayboard(board, ROW, COL);//打印棋盘
		ret = Determineboard(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家获胜\n");

	}
	else if (ret == '0')
	{
		printf("电脑获胜\n");
	}
	else
	{
		printf("平局!");
	}

}

3.game.h头文件

由于该游戏函数比较多,所以干脆建一个头文件来集中函数定义,这样子会比较清晰,改动起来也比较方便。(ROW 和 COL是棋盘的大小,下来可以自己改动)

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 6
#define COL 6
void Initboard(char board[ROW][COL], int row, int col);
void Displayboard(char board[ROW][COL], int row, int col);
void Playerboard(char board[ROW][COL], int row, int col);
void Computerboard(char board[ROW][COL], int row, int col);
char Determineboard(char board[ROW][COL], int row, int col);
int Fullboard(char board[ROW][COL], int row, int col);

四、源代码

test.c

#include "game.h"
void menu()
{
	printf("*****************\n");
	printf("**** 1. play ****\n");
	printf("**** 0. exit ****\n");
	printf("*****************\n");
}
void game()
{
	char board[ROW][COL];
	char ret = 0;
	Initboard(board, ROW, COL);//初始化全部是空格
	Displayboard(board, ROW, COL);//打印棋盘

	while (1)
	{
		Playerboard(board, ROW, COL);//玩家下棋
		Displayboard(board, ROW, COL);//打印棋盘
		ret = Determineboard(board, ROW, COL);//判断
		if (ret != 'C')
		{
			break;
		}
		Computerboard(board, ROW, COL);//电脑下棋
		Displayboard(board, ROW, COL);//打印棋盘
		ret = Determineboard(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家获胜\n");

	}
	else if (ret == '0')
	{
		printf("电脑获胜\n");
	}
	else
	{
		printf("平局!");
	}

}
int main() {
	int input;
	srand((unsigned int)time(NULL));//随机数
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
		}
	} while (input);
	return 0;

}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
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 Displayboard(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");
	}
}

void Playerboard(char board[ROW][COL], int row, int col)
{
	int a;
	int b;
	while (1)
	{
		printf("请玩家输入坐标:");
		scanf("%d%d", &a, &b);
		if (a >= 1 && a <= row && b >= 1 && b <= row)
		{
			if (board[a - 1][b - 1] == ' ')
			{
				board[a - 1][b - 1] = '*';

				break;
			}
			else
			{
				printf("坐标已被占用,请重新输入!\n");
			}
		}
		else
			printf("坐标输入非法!请重新输入!\n");

	}
}
void Computerboard(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋\n");
	int a;
	int b;
	while (1)
	{
		a = rand() % row;
		b = rand() % col;
		if (board[a][b] == ' ')
		{
			board[a][b] = '0';
			break;
		}
	}

}
//判断是否满棋子
int Fullboard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
//判断棋子
char Determineboard(char board[ROW][COL], int row, int col)
{
	//返回C -- 继续
	//返回* -- 玩家赢
	//返回O -- 电脑赢
	//返回P -- 平局
	int i;
	int j;
	//判断行
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j] != ' ')
			{
				return board[i][j];
			}

		}
		/*if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1]!=' ')
		{
			return board[i][1];
		}*/

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

		}
		/*if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}*/

	}
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < row; j++)
		{
			if (i < col - 2 && j < row - 2)
			{
				if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] && board[i][j] != ' ')
				{
					return board[i][j];
				}
			}
		}
		/*if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		{
			return board[1][1];
		}*/

	}
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < row; j++)
		{
			if (i < col - 2 && j > row - 2)
			{
				if (board[i][j] == board[i + 1][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2] && board[i][j] != ' ')
				{
					return board[i][j];
				}
			}
		}
		/*	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
			{
				return board[1][1];
			}*/

	}
	if (Fullboard(board, ROW, COL))
	{
		return 'P';
	}
	return 'C';
}

game.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 6
#define COL 6
void Initboard(char board[ROW][COL], int row, int col);
void Displayboard(char board[ROW][COL], int row, int col);
void Playerboard(char board[ROW][COL], int row, int col);
void Computerboard(char board[ROW][COL], int row, int col);
char Determineboard(char board[ROW][COL], int row, int col);
int Fullboard(char board[ROW][COL], int row, int col);

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值