超简单三子棋小游戏(c语言版)

发布于:2022-11-28 ⋅ 阅读:(320) ⋅ 点赞:(0)

一:三子棋代码实现逻辑分析

(1):棋盘打印
图片构思:先打印一行棋盘 %c | %c | %c ,最后一个不用加分隔符在后面
在打印一行分割符- - -|- - -|- - -,最后一个不用加分隔符在后面
一行棋盘的打印构思图
在这里插入图片描述
(2):玩家下棋逻辑
a:输入坐标
b:判断坐标是否合法,不合法重新输入
c:坐标若合法在判断该坐标是否被占用,若该坐标位置被占用,请重新输入
(3):电脑下棋逻辑
a:使用随机数函数rand(),随机输入坐标
b:判断坐标是否被占用
(4):判断输赢继续下棋逻辑
a:横纵、对角线任意一条三个字符连为一条线则就判断为赢,返回三个字符中的一个即可,'*‘为玩家赢、’#‘为电脑赢
b:判断完输赢后若无输赢,再判断棋盘是否满,棋盘满了横纵、对角线都无三个字符连成一条线则为平局返回一个字符’Q’,若棋盘没有满则返回字符’C’继续游戏

二:三子棋代码实现

1:先创建三个文件

test.c测试文件
game.c三子棋函数实现文件
game.h存放要使用的头文件和函数声明、默认值定义的文件

2:test.c

(1):在test.c中提供一个菜单函数,为玩家提供选择

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

(2):开辟一个数组存放游戏数据与定义一个初始化数组函数

char board[ROW][COL] = { 0 };
init_board(board, ROW, COL);

(3):打印棋盘函数定义

display_board(board, ROW, COL);//打印棋盘函数定义

棋盘图片构思
在这里插入图片描述

(4):再定义玩家下棋、电脑下棋与判断游戏状态

//玩家下棋
			player_board(board, ROW, COL);//玩家下棋函数定义
			display_board(board, ROW, COL);//打印棋盘函数定义
			//判断对局情况 输 赢 平局 游戏继续
			//玩家赢* 电脑赢# 平局Q 游戏继续C
			 ret = is_win(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
			//电脑下棋
			compter_board(board, ROW, COL);//电脑下棋函数定义
			display_board(board, ROW, COL);
			//判断对全局情况 输 赢 平局 游戏继续
			//玩家赢* 电脑赢# 平局Q 游戏继续C
			ret = is_win(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
		}
		if (ret == '*')
		{
			printf("玩家赢\n");
		}
		else if (ret == '#')
		{
			printf("电脑赢\n");
		}
		else if (ret == 'Q')
		{
			printf("平局\n");
		}

test.c完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("*******************************\n");
	printf("******     1:play      *******\n");
	printf("******     0:exit      *******\n");
	printf("*******************************\n");


}
void game()
{
	printf("开始游戏:>\n");
	//创建一个3*3数组存储数据
		char board[ROW][COL] = { 0 };
	//初始化棋盘
		init_board(board, ROW, COL);
	//打印棋盘
		display_board(board, ROW, COL);
	//接收返回值判断变量创建
		char ret = 0;
		while (1)
		{
			//玩家下棋
			player_board(board, ROW, COL);
			display_board(board, ROW, COL);
			//判断对局情况 输 赢 平局 游戏继续
			//玩家赢* 电脑赢# 平局Q 游戏继续C
			 ret = is_win(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
			//电脑下棋
			compter_board(board, ROW, COL);
			display_board(board, ROW, COL);
			//判断对全局情况 输 赢 平局 游戏继续
			//玩家赢* 电脑赢# 平局Q 游戏继续C
			ret = is_win(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
		}
		if (ret == '*')
		{
			printf("玩家赢\n");
		}
		else if (ret == '#')
		{
			printf("电脑赢\n");
		}
		else if (ret == 'Q')
		{
			printf("平局\n");
		}

}
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("输入错误重新输入:>\n");
			break;
		}

	} while (input);
}

2:game.c

(1):初始化棋盘函数实现

//初始化棋盘函数
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

(2):打印棋盘函数实现

//打印棋盘函数实现
void display_board(char board[ROW][COL], int row, int col)
{
	//(" %c | %c | %c ")棋盘一行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)//末尾不打印分隔符
			{
				printf("|");
			}
		}
		printf("\n");
		//分隔符:---|---|---
		for (j = 0; j < row; j++)
		{
			  
			if (i < row - 1)
			{
				printf("---");//最后一行下面不用分隔符
				if (j<row -1)//末尾不打印分隔符
				printf("|");
			}
		}
		printf("\n");
	}
}

(3):玩家下棋函数实现与电脑下棋函数实现

//玩家下棋函数实现
void player_board(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	int x = 0;
	int y = 0;
	printf("请输入下棋坐标:>");
	while (1)
	{
		scanf("%d %d", &x, &y);
		//判断坐标是否合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//坐标是否被占用
			if (board[x-1][y-1] == ' ')
			{
				board[x-1][y-1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入:>");
			}
		}
		else
		{
			printf("坐标非法请重新输入:>");
		}
	}


}



//电脑下棋函数实现
void compter_board(char board[ROW][COL], int row, int col)
{
	//电脑随机输入
	printf("电脑下棋\n");

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

(4):判断游戏状态函数实现

static int  is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (' ' == board[i][j])
			{
				return 0;
			}
		}
	}
	return 1;
}

//判断对局情况
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}


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


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


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

	if (is_full(board, ROW, COL) == 1)//判断棋盘是否满
	{
		return 'Q';//返回'Q'平局
	}
	return 'C';//返回'C'游戏继续
}

game.c完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"



//初始化棋盘函数
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘函数实现
void display_board(char board[ROW][COL], int row, int col)
{
	//(" %c | %c | %c ")棋盘一行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)//末尾不打印分隔符
			{
				printf("|");
			}
		}
		printf("\n");
		//分隔符:---|---|---
		for (j = 0; j < row; j++)
		{
			  
			if (i < row - 1)
			{
				printf("---");//最后一行下面不用分隔符
				if (j<row -1)//末尾不打印分隔符
				printf("|");
			}
		}
		printf("\n");
	}
}


//玩家下棋函数实现
void player_board(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	int x = 0;
	int y = 0;
	printf("请输入下棋坐标:>");
	while (1)
	{
		scanf("%d %d", &x, &y);
		//判断坐标是否合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//坐标是否被占用
			if (board[x-1][y-1] == ' ')
			{
				board[x-1][y-1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入:>");
			}
		}
		else
		{
			printf("坐标非法请重新输入:>");
		}
	}


}



//电脑下棋函数实现
void compter_board(char board[ROW][COL], int row, int col)
{
	//电脑随机输入
	printf("电脑下棋\n");

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

static int  is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (' ' == board[i][j])
			{
				return 0;
			}
		}
	}
	return 1;
}

//判断对局情况
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}


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


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


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

	if (is_full(board, ROW, COL) == 1)//判断棋盘是否满
	{
		return 'Q';//返回'Q'平局
	}
	return 'C';//返回'C'游戏继续
}

3:game.h

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



#define ROW 3//定义行数
#define COL 3//定义列数


//初始化棋盘声明
void init_board(char board[ROW][COL],int row,int col);

//打印棋盘声明
void display_board(char board[ROW][COL], int row, int col);

//玩家下棋声明
void player_board(char board[ROW][COL], int row, int col);

//电脑下棋声明
void compter_board(char board[ROW][COL], int row, int col);

//判断对局情况
char is_win(char board[ROW][COL], int row, int col);

三:三子棋完整代码

(1):test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("*******************************\n");
	printf("******     1:play      *******\n");
	printf("******     0:exit      *******\n");
	printf("*******************************\n");


}
void game()
{
	printf("开始游戏:>\n");
	//创建一个3*3数组存储数据
		char board[ROW][COL] = { 0 };
	//初始化棋盘
		init_board(board, ROW, COL);
	//打印棋盘
		display_board(board, ROW, COL);
	//接收返回值判断变量创建
		char ret = 0;
		while (1)
		{
			//玩家下棋
			player_board(board, ROW, COL);
			display_board(board, ROW, COL);
			//判断对局情况 输 赢 平局 游戏继续
			//玩家赢* 电脑赢# 平局Q 游戏继续C
			 ret = is_win(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
			//电脑下棋
			compter_board(board, ROW, COL);
			display_board(board, ROW, COL);
			//判断对全局情况 输 赢 平局 游戏继续
			//玩家赢* 电脑赢# 平局Q 游戏继续C
			ret = is_win(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
		}
		if (ret == '*')
		{
			printf("玩家赢\n");
		}
		else if (ret == '#')
		{
			printf("电脑赢\n");
		}
		else if (ret == 'Q')
		{
			printf("平局\n");
		}

}
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("输入错误重新输入:>\n");
			break;
		}

	} while (input);
}

(2): game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"



//初始化棋盘函数
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘函数实现
void display_board(char board[ROW][COL], int row, int col)
{
	//(" %c | %c | %c ")棋盘一行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)//末尾不打印分隔符
			{
				printf("|");
			}
		}
		printf("\n");
		//分隔符:---|---|---
		for (j = 0; j < row; j++)
		{
			  
			if (i < row - 1)
			{
				printf("---");//最后一行下面不用分隔符
				if (j<row -1)//末尾不打印分隔符
				printf("|");
			}
		}
		printf("\n");
	}
}


//玩家下棋函数实现
void player_board(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	int x = 0;
	int y = 0;
	printf("请输入下棋坐标:>");
	while (1)
	{
		scanf("%d %d", &x, &y);
		//判断坐标是否合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//坐标是否被占用
			if (board[x-1][y-1] == ' ')
			{
				board[x-1][y-1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入:>");
			}
		}
		else
		{
			printf("坐标非法请重新输入:>");
		}
	}


}



//电脑下棋函数实现
void compter_board(char board[ROW][COL], int row, int col)
{
	//电脑随机输入
	printf("电脑下棋\n");

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

static int  is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (' ' == board[i][j])
			{
				return 0;
			}
		}
	}
	return 1;
}

//判断对局情况
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}


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


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


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

	if (is_full(board, ROW, COL) == 1)//判断棋盘是否满
	{
		return 'Q';//返回'Q'平局
	}
	return 'C';//返回'C'游戏继续
}

(3):game.h

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



#define ROW 3//定义行数
#define COL 3//定义列数


//初始化棋盘声明
void init_board(char board[ROW][COL],int row,int col);

//打印棋盘声明
void display_board(char board[ROW][COL], int row, int col);

//玩家下棋声明
void player_board(char board[ROW][COL], int row, int col);

//电脑下棋声明
void compter_board(char board[ROW][COL], int row, int col);

//判断对局情况
char is_win(char board[ROW][COL], int row, int col);

以上就是我对三子棋小游戏的代码实现与逻辑分析,欢迎大家一起学习分享,若有错误欢迎大家对我指导,我将会及时改正。

本文含有隐藏内容,请 开通VIP 后查看