三子棋(附源码)

2022/1/16 1:04:20

本文主要是介绍三子棋(附源码),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一.基本流程

1.创建初始菜单页面

2.初始化棋盘(3*3)

3.打印棋盘内容

4.玩家下棋

5.电脑随机下棋

6.判断输赢

二.游戏设计

函数声明:

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

#define ROW 3   //行
#define COL 3    //列
//菜单函数
void meau();
//初始化棋盘
void InitChess(char board[ROW][COL]);
//打印棋盘
void Showboard(char board[ROW][COL]);
//玩家下棋
void Player(char board[ROW][COL]);
//电脑下棋
void Computer(char board[ROW][COL]);
//判断输赢
//玩家赢 W
//玩家数 L
//平局 F
//游戏继续 C
char JudgeWin(char board[ROW][COL]);
//进行游戏
void Game();

菜单界面:

//菜单函数
void meau()
{
	printf("******************************************\n");
	printf("*******         1.  PLAY         *********\n");
	printf("*******         0.  EXIT         *********\n");
	printf("******************************************\n");
}

初始化棋盘:

将3*3的棋盘内容初始化为空格

//初始化棋盘  初始化为空格
void InitChess(char board[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			board[i][j] = ' ';
		}
	}
}

打印棋盘:

//打印棋盘
void Showboard(char board[ROW][COL])
{
	int i;
	for (i = 0; i < ROW; i++)
	{
		int j;
		for (j = 0; j < COL; j++)
		{
			printf(" %c ", board[i][j]);  //打印每一行的每一个数据和后面分隔符
			printf("|");
		}
		printf("\n");  //换行
		if (i < ROW-1)
		{
			int j;
			for (j = 0; j < COL; j++)
			{
				printf("---");
				printf("|");
			}
			printf("\n");
		}
	}
}

这种方法可以打印n*n式的棋盘

效果演示:

 

玩家落棋:

考虑内容:

1.在棋盘范围内落子,若不在范围内,重新输入

2.输入坐标为玩家主观感受,并非二维数组正常下标、例如(0,0)位置玩家需输入(1,1)

代码演示:

void Player(char board[ROW][COL])
{
	int x = 0;
	int y = 0;
	printf("请玩家落子\n");
	while (1)
	{
		printf("请输入棋子的坐标:");
		scanf("%d %d", &x, &y);
		//判断坐标是否合法 (玩家输入的坐标从1开始并非二维数组的0开始)
		if (x>=1&& x<=ROW && y>=1 && y<=COL)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
				printf("位置已有棋子,请重新输入\n");
		}
		else
		{
			printf("棋子位置不在合法范围内,请重新输入\n");
		}
	}
}

电脑随机落棋:

使用时间函数,产生随机值(不过此方法电脑想赢玩家太难),在棋盘范围内落子

在主函数内下时间戳srand函数

void Computer(char board[ROW][COL])
{
	printf("电脑落子\n");
	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '+';
			break;
		}	
	}
}

效果演示:

 判断输赢:

//玩家赢 返回W
//玩家数返回 L
//平局返回F (判断是否和棋)
//游戏继续返回 C

1.判断输赢,从各行,各列,对角线是否满足

2.判断和棋,需要判断棋盘内容是否已满创建IsFull函数,此函数只应用于判断输赢,可设置为static静态保护,隐藏文件。

代码实现:

//判断棋盘是否满了
static int Isfull(char board[ROW][COL])//只服务与判断输赢 利用static静态
{
	int i, j;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] == ' ')
				return 0;   //没有满
		}
	}
	return 1; //满了
}
//判断输赢
char JudgeWin(char board[ROW][COL])
{
	//判断三行
	for (int row = 0; row < ROW; row++)
	{

			if (board[row][0] != ' '&& board[row][0] == board[row][1]&& board[row][1] == board[row][2]) 
		{
			
			if (board[row][0] == '*')
				return 'W';
			else
				return 'L';
				
		}
		
	}
	//判断三列
	for (int col = 0; col < COL; col++) 
	{
		if (board[0][col] != ' '&& board[0][col] == board[1][col]&& board[0][col] == board[2][col]) 
		{
			if (board[0][col] == '*')
				return 'W';
			else
				return 'L';
	
		}
	}
	//判断对角线
	if (board[1][1] != ' '&& board[0][0] == board[1][1]&& board[1][1] == board[2][2]) 
	{
		if (board[1][1] == '*')
			return 'W';
		else
			return 'L';
	}
	if (board[2][0] != ' '&& board[2][0] == board[1][1]&& board[2][0] == board[0][2])
	{
		if (board[2][0] == '*')
			return 'W';
		else
			return 'L';
	}
	//判断平局
	//如果棋盘满了 返回1 没满返回0
	if (Isfull(board) ==1)
	{
		return 'F';
	}
	else
	return 'C';

}

进行游戏:

void Game()
{
	//储存数据 二维数组
	char board[ROW][COL];
	char net = 0;  //接受游戏状态
	InitChess(board);
	Showboard(board);
	while (1)
	{
		//玩家下棋
		Player(board);
		Showboard(board);
		net = JudgeWin(board);
		if (net != 'C')  
			break;
		//电脑下棋
		Computer(board);
		Showboard(board);
		net = JudgeWin(board);
		if (net != 'C')
			break;
	}
	if (net == 'W')
	{
		printf("恭喜玩家获胜\n");
	}
	else if (net == 'L')
	{
		printf("真可惜玩家输了\n");
	}
		
	else if(net=='F')
		printf("平局\n");
	
}

主函数:

#define _CRT_SECURE_NO_WARNINGS
#include"play.h"


int main()
{
	int num;
	srand((unsigned int)time(NULL));
	do
	{
		meau();
		printf("请选择>");
		scanf("%d", &num);
		switch (num)
		{
		case 1:
			Game();
			break;
		case 0:
			printf("退出游戏^*^\n");
			break;
		default:
			printf("选择错误,请重新输入\n");
			break;
		}
	} while (num);
		
	return 0;
}

游戏效果展示:

这种方法满足基本实现,但是电脑过于笨重,可以在电脑落子的函数进行针对于于玩家获胜的算法设计

源代码:

//头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3 
#define COL 3   
//菜单函数
void meau();
//初始化棋盘
void InitChess(char board[ROW][COL]);
//打印棋盘
void Showboard(char board[ROW][COL]);
//玩家下棋
void Player(char board[ROW][COL]);
//电脑下棋
void Computer(char board[ROW][COL]);
//判断输赢
//玩家赢 W
//玩家数 L
//平局 F
//游戏继续 C
char JudgeWin(char board[ROW][COL]);
//进行游戏
void Game();

//函数实现
#define _CRT_SECURE_NO_WARNINGS
#include"play.h"

//菜单函数
void meau()
{
	printf("******************************************\n");
	printf("*******         1.  PLAY         *********\n");
	printf("*******         0.  EXIT         *********\n");
	printf("******************************************\n");
}

//初始化棋盘  初始化为空格
void InitChess(char board[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘
void Showboard(char board[ROW][COL])
{
	int i;
	for (i = 0; i < ROW; i++)
	{
		int j;
		for (j = 0; j < COL; j++)
		{
			printf(" %c ", board[i][j]);  //打印每一行的每一个数据和后面分隔符
			printf("|");
		}
		printf("\n");  //换行
		if (i < ROW-1)
		{
			int j;
			for (j = 0; j < COL; j++)
			{
				printf("---");
				printf("|");
			}
			printf("\n");
		}
	}
}
//玩家下棋
void Player(char board[ROW][COL])
{
	int x = 0;
	int y = 0;
	printf("请玩家落子\n");
	while (1)
	{
		printf("请输入棋子的坐标:");
		scanf("%d %d", &x, &y);
		//判断坐标是否合法 (玩家输入的坐标从1开始并非二维数组的0开始)
		if (x>=1&& x<=ROW && y>=1 && y<=COL)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
				printf("位置已有棋子,请重新输入\n");
		}
		else
		{
			printf("棋子位置不在合法范围内,请重新输入\n");
		}
	}
}
//电脑下棋
void Computer(char board[ROW][COL])
{
	printf("电脑落子\n");
	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '+';
			break;
		}	
	}
}
//判断棋盘是否满了
static int Isfull(char board[ROW][COL])//只服务与判断输赢 利用static静态
{
	int i, j;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] == ' ')
				return 0;   //没有满
		}
	}
	return 1; //满了
}
//判断输赢
char JudgeWin(char board[ROW][COL])
{
	//判断三行
	for (int row = 0; row < ROW; row++)
	{

			if (board[row][0] != ' '&& board[row][0] == board[row][1]&& board[row][1] == board[row][2]) 
		{
			
			if (board[row][0] == '*')
				return 'W';
			else
				return 'L';
				
		}
		
	}
	//判断三列
	for (int col = 0; col < COL; col++) 
	{
		if (board[0][col] != ' '&& board[0][col] == board[1][col]&& board[0][col] == board[2][col]) 
		{
			if (board[0][col] == '*')
				return 'W';
			else
				return 'L';
	
		}
	}
	//判断对角线
	if (board[1][1] != ' '&& board[0][0] == board[1][1]&& board[1][1] == board[2][2]) 
	{
		if (board[1][1] == '*')
			return 'W';
		else
			return 'L';
	}
	if (board[2][0] != ' '&& board[2][0] == board[1][1]&& board[2][0] == board[0][2])
	{
		if (board[2][0] == '*')
			return 'W';
		else
			return 'L';
	}
	//判断平局
	//如果棋盘满了 返回1 没满返回0
	if (Isfull(board) ==1)
	{
		return 'F';
	}
	else
	return 'C';

}
//进行游戏
void Game()
{
	//储存数据 二维数组
	char board[ROW][COL];
	char net = 0;  //接受游戏状态
	InitChess(board);
	Showboard(board);
	while (1)
	{
		//玩家下棋
		Player(board);
		Showboard(board);
		net = JudgeWin(board);
		if (net != 'C')  
			break;
		//电脑下棋
		Computer(board);
		Showboard(board);
		net = JudgeWin(board);
		if (net != 'C')
			break;
	}
	if (net == 'W')
	{
		printf("恭喜玩家获胜\n");
	}
	else if (net == 'L')
	{
		printf("真可惜玩家输了\n");
	}
		
	else if(net=='F')
		printf("平局\n");
	
}


//测试用例(主函数)
#include"play.h"

int main()
{
	int num;
	srand((unsigned int)time(NULL));
	do
	{
		meau();
		printf("请选择>");
		scanf("%d", &num);
		switch (num)
		{
		case 1:
			Game();
			break;
		case 0:
			printf("退出游戏^*^\n");
			break;
		default:
			printf("选择错误,请重新输入\n");
			break;
		}
	} while (num);
		
	return 0;
}

 



这篇关于三子棋(附源码)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程