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

本文介绍了如何编写一个简单的三子棋游戏,包括游戏逻辑、菜单交互、玩家与电脑的回合交替、棋盘状态判断等功能。通过分文件编写,实现了游戏的模块化,便于维护和扩展。同时,代码中包含了关键函数的实现细节,如初始化棋盘、玩家和电脑的落子、判断胜负等,展示了游戏开发的基本思路。
摘要由CSDN通过智能技术生成

目录

一、三子棋游戏的实现逻辑

二、三子棋游戏的具体实现

1.打印菜单界面

2.初始化棋盘

3.打印棋盘

4.玩家下棋

4.判断胜负

5.电脑下棋

6.游戏逻辑的实现

三、三子棋游戏的分文件编写

四、三子棋游戏的结果展现


一、三子棋游戏的实现逻辑

1.玩家进入游戏菜单

2.玩家输入选择:进入游戏or离开游戏or选择错误,重新选择

3.玩家进入游戏,开始落子

4.电脑落子

5.判断胜负

6.选择是否继续游戏

电脑下棋-'*'     玩家下棋-'o'


二、三子棋游戏的具体实现

1.打印菜单界面

//打印菜单
void menu()
{
	printf("******************\n");
	printf("*****请选择:******\n");
	printf("*****1.play*******\n");
	printf("*****0.exit*******\n");
	printf("******************\n");
}

2.初始化棋盘

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] = ' ';
		}
	}
}

3.打印棋盘

//打印棋盘
void display(char board[ROW][COL], int row, int col)
{
	int i = 0;
	printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]);
	for ( i = 1; i < row ; i++)
	{
		printf("-----------\n");
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
	}
}

4.玩家下棋

//玩家落子-'o'
void playermove(char board[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	
	printf("玩家落子\n");
	while (1)
	{
		printf("请输入棋子坐标: ");
		scanf("%d %d", &x, &y);

		//1.判断输入坐标是否在棋盘内
		//2.判断输入坐标是否被占用
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = 'o';
				break;
			}
			else
			{
				printf("该位置已被占用,请重新输入!\n");
			}
		}
		else
		{
			printf("输入坐标不在棋盘范围内,请重新输入!\n");
		}
	}
	
}

4.判断胜负

//判断棋盘是否被填满
//返回1-是,返回0-否
int isfull(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

//判断输赢
//返回'o'-玩家赢
//返回'*'-电脑赢
//返回'Q'-平局
//返回'C'-继续游戏
char iswin(char board[ROW][COL], int row, int col)
{
	int i = 0;

	//1.判断横行的情况
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	//2.判断纵列情况
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}
	//3.判断斜对角线情况
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//4.判断是否平局
	if (isfull(board, ROW, COL) == 1)
	{
		return 'Q';
	}
	return 'C';
}

5.电脑下棋

//电脑落子-'*'
//电脑随机落子
void computermove(char board[ROW][COL], int row, int col)
{
	printf("电脑落子\n");
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (board[x][y] == ' ')
		{
			board[x][y] = '*';
			break;
		}
	}
}

6.游戏逻辑的实现

void game()
{
	char board[ROW][COL] = { 0 };
	char ret = 0;

	//1.初始化棋盘
	initboard(board, ROW, COL);

	//2.打印棋盘
	display(board, ROW, COL);

	while (1)
	{
		//3.玩家落子,打印棋盘,判断输赢
		playermove(board, ROW, COL);
		display(board, ROW, COL);
	    ret = iswin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}

		//4.电脑落子,打印棋盘,判断输赢
		computermove(board, ROW, COL);
		display(board, ROW, COL);
		ret = iswin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	//5.判断输赢
	if (ret == 'o')
	{
		printf("玩家赢\n");
	}
	if (ret == '*')
	{
		printf("电脑赢\n");
	}
	if (ret == 'Q')
	{
		printf("平局\n");
	}
}

注意事项:

1.使用宏定义棋盘的行、列,方便以后修改;

2.每写完一个函数运行一次,防止出现错误;

3.注意break的使用。


三、三子棋游戏的分文件编写

头文件game.h 

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//宏定义棋盘行列
#define ROW 3
#define COL 3

//函数声明
void menu();

void game();

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

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

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

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

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

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

源文件game.c 

#include"game.h"

void game()
{
	char board[ROW][COL] = { 0 };
	char ret = 0;

	//1.初始化棋盘
	initboard(board, ROW, COL);

	//2.打印棋盘
	display(board, ROW, COL);

	while (1)
	{
		//3.玩家落子,打印棋盘,判断输赢
		playermove(board, ROW, COL);
		display(board, ROW, COL);
	    ret = iswin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}

		//4.电脑落子,打印棋盘,判断输赢
		computermove(board, ROW, COL);
		display(board, ROW, COL);
		ret = iswin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	//5.判断输赢
	if (ret == 'o')
	{
		printf("玩家赢\n");
	}
	if (ret == '*')
	{
		printf("电脑赢\n");
	}
	if (ret == 'Q')
	{
		printf("平局\n");
	}
}

//打印菜单
void menu()
{
	printf("******************\n");
	printf("*****请选择:******\n");
	printf("*****1.play*******\n");
	printf("*****0.exit*******\n");
	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 display(char board[ROW][COL], int row, int col)
{
	int i = 0;
	printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]);
	for ( i = 1; i < row ; i++)
	{
		printf("-----------\n");
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
	}
}



//玩家落子-'o'
void playermove(char board[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	
	printf("玩家落子\n");
	while (1)
	{
		printf("请输入棋子坐标: ");
		scanf("%d %d", &x, &y);

		//1.判断输入坐标是否在棋盘内
		//2.判断输入坐标是否被占用
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = 'o';
				break;
			}
			else
			{
				printf("该位置已被占用,请重新输入!\n");
			}
		}
		else
		{
			printf("输入坐标不在棋盘范围内,请重新输入!\n");
		}
	}
	
}

//判断棋盘是否被填满
//返回1-是,返回0-否
int isfull(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

//判断输赢
//返回'o'-玩家赢
//返回'*'-电脑赢
//返回'Q'-平局
//返回'C'-继续游戏
char iswin(char board[ROW][COL], int row, int col)
{
	int i = 0;

	//1.判断横行的情况
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	//2.判断纵列情况
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}
	//3.判断斜对角线情况
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//4.判断是否平局
	if (isfull(board, ROW, COL) == 1)
	{
		return 'Q';
	}
	return 'C';
}

//电脑落子-'*'
//电脑随机落子
void computermove(char board[ROW][COL], int row, int col)
{
	printf("电脑落子\n");
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (board[x][y] == ' ')
		{
			board[x][y] = '*';
			break;
		}
	}
}

源文件test.c 

//三子棋游戏

#include"game.h"

int main()
{
	int choice = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("玩家请选择: ");
		scanf("%d", &chose);
		switch (choice)
		{
		case 1:
			game(); break;
		case 0:
			printf("您已离开游戏!\n"); break;
		default:
			printf("输入错误,请重新选择!\n"); break;
		}
	} while (choice);

	return 0;
}

四、三子棋游戏的结果展现


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值