栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

三子棋C语言代码

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

三子棋C语言代码

三子棋C语言代码的实现
使用C语言实现三子棋
基本流程

1.菜单界面选择开始游戏或退出游戏;
2.创建棋盘并初始化;
3.打印棋盘并开始下棋;
4.玩家先下,用*表示玩家下棋,以输入xy坐标来下棋;
5.判断输赢(*表示玩家赢;#表示电脑赢;Q表示平局;C表示继续下一局);
6.电脑下,用#表示电脑下棋;
7.判断输赢;
8.回到2继续下棋。

创建菜单界面

1开始游戏 0退出游戏;

void menu()
{
	printf("**********************n");
	printf("***1.play  0.exit ****n");
	printf("**********************n");
}

界面显示

创建棋盘

使用三行三列的二维数组表示,元素类型为char;

//数组存放走出的棋盘信息
	char board[BOW][COL] = { 0 };//全部空格
#define BOW 3
#define COL 3

使用宏定义可提高代码扩展性

初始化棋盘
void InitBoard(char board[BOW][COL], int bow, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < bow; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
打印棋盘
void DisplayBoard(char board[BOW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//打印一行的数据
		//printf(" %c | %c | %c n",board[i][0],board[i][1],board[i][2]);//简单方法
		int j = 0;
		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 PlayerMove(char board[BOW][COL], int bow, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走:>n");

	while (1)
	{
		printf("请输入要下的坐标:>");
		scanf("%d%d", &x, &y);
		//判断xy坐标合法性
		if (x >= 1 && x <= bow && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;//下棋成功跳出循环
			}
			else
			{
				printf("该坐标被占用n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入:n");
		}
	}

}
电脑下棋

电脑随机生成行列坐标来下棋,用#表示

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

}

在主函数中使用srand((unsigned int)time(NULL)); 确保得到的行列坐标为随机的;

判断输赢

1.先约定‘*’为玩家赢;‘#’为电脑赢;‘Q’为平局;‘C’为继续游戏;

2.判定是否平局
a.调用IsFull函数。
b.如果数组中有元素为’ ‘,那么没满,返回0。如果全不为’ ',满了,返回1。
c.如果棋盘满了未分出胜负,平局。

3.判定输赢

//返回1表示棋盘满了
//返回0,没满

int IsFull(char board[BOW][COL], int bow, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < bow; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//没满
			}
		}
	}
	return 1;//满了
}

char IsWin(char board[BOW][COL], int bow, int col)
{
	int i = 0;
	//横三行
	for (i = 0; i < bow; i++)
	{
		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++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}
	//两对角线
	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];
	//判断是否平局
	if(i == IsFull(board, BOW, COL))
	{
		return 'Q';
	}
	return 'C';
}
结果演示

1.玩家赢

2.电脑赢

3.平局

所有代码实现

1.test.c

#define _CRT_SECURE_NO_WARNINGS
//测试三子棋游戏


#include "game.h"
void menu()
{
	printf("**********************n");
	printf("***1.play  0.exit ****n");
	printf("**********************n");
}

void game()
{

	printf("三子棋n");
	//数组存放走出的棋盘信息
	char board[BOW][COL] = { 0 };//全部空格
	//初始化棋盘
	InitBoard(board, BOW, COL);
	//打印棋盘
	DisplayBoard(board, BOW, COL);
	char ret = 0;
	//下棋
	while (1)
	{
		//玩家下棋
		PlayerMove(board, BOW, COL);
		DisplayBoard(board, BOW, COL);
		//判断玩家是否赢
		ret = IsWin(board, BOW, COL);
		if (ret != 'C')
			break;
		//电脑下棋
		ComputerMove(board, BOW, COL);
		DisplayBoard(board, BOW, COL);
		//判断电脑是否赢
		ret = IsWin(board, BOW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
	{
		printf("玩家赢n");
	}
	else if (ret == '#')
	{
		printf("电脑赢n");
	}
	else 
	{
		printf("平局n");
	}
}

void test1() 
{
	int input = 0;
	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");
			break;
		}
	} while (input);
}

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

2.game.c

#define _CRT_SECURE_NO_WARNINGS

#include "game.h"

void InitBoard(char board[BOW][COL], int bow, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < bow; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

void DisplayBoard(char board[BOW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//打印一行的数据
		//printf(" %c | %c | %c n",board[i][0],board[i][1],board[i][2]);
		int j = 0;
		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 PlayerMove(char board[BOW][COL], int bow, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走:>n");

	while (1)
	{
		printf("请输入要下的坐标:>");
		scanf("%d%d", &x, &y);
		//判断xy坐标合法性
		if (x >= 1 && x <= bow && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;//下棋成功跳出循环
			}
			else
			{
				printf("该坐标被占用n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入:n");
		}
	}

}

void ComputerMove(char board[BOW][COL], int bow, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走:>n");


	while (1)
	{
		x = rand() % bow;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}

}


//返回1表示棋盘满了
//返回0,没满

int IsFull(char board[BOW][COL], int bow, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < bow; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//没满
			}
		}
	}
	return 1;//满了
}

char IsWin(char board[BOW][COL], int bow, int col)
{
	int i = 0;
	//横三行
	for (i = 0; i < bow; i++)
	{
		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++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}
	//两对角线
	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];
	//判断是否平局
	int ret = IsFull(board, BOW, COL);
	if(ret == 1)
	{
		return 'Q';
	}
	return 'C';
}

3.game.h

#pragma once

#define BOW 3
#define COL 3

#include
#include
#include

//声明
void InitBoard(char board[BOW][COL], int bow, int col);
void DisplayBoard(char board[BOW][COL], int row, int col);
void PlayerMove(char board[BOW][COL], int bow, int col);
void ComputerMove(char board[BOW][COL], int bow, int col);

//告诉四种游戏状态;
//玩家赢;  '*'
//电脑赢;  '#'
//平局;    'Q'
//继续;    'C'

char IsWin(char board[BOW][COL], int bow, int col); 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935885.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号