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

C初阶—三子棋游戏

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

C初阶—三子棋游戏

这是我的第一个C语言小游戏:三子棋。

下面分享一下我的思路:

代码分为四个部分:utili.h是存放头文件;game.h是存放函数声明;game.c是游戏内所需要的函数的代码编写;gameMain.c是进行游戏的逻辑编写。

<1>打印菜单栏

首先我们进入游戏肯定会看到菜单栏进行选择玩游戏或者退出,1就是玩游戏,0就是退出游戏。代码如下:

//这里在gameMain.c源文件中	
int select = 1;
	while(select)
	{
		printf("********************************n");
		printf("*       简  易  三  子  棋     *n");
		printf("********************************n");
		printf("*          [1] Play            *n");
		printf("*          [0] Exit            *n");
		printf("********************************n");
		printf("请选择:>");
		scanf("%d", &select);

		if(select == 0)
			break;
		if(select != 1)
		{
			printf("输入的选项有误,请重新输入......n");
			continue;
		}

在这里我把菜单放到了主函数里,也可以单独写一个函数。

<2>初始化棋盘

三子棋游戏中的棋盘我们用空格来初始化,代码如下:

//这里在game.c源文件中
void InitChessBoard(char chess_board[ROW][COL])//ROW是行,COL是列,可以在文件前做一个宏定义
{                                              //#define  ROW 3
	for(int i=0; i 

<3>显示棋盘

这里打印出棋盘的样子,代码如下:

//utili.h头文件中的代码
//预防头文件重复引入
#ifndef _UTILI_H_
#define _UTILI_H_

#include
#include
#include

#endif 
//game.h头文件中的代码
#ifndef _GAME_H_
#define _GAME_H_

#include"utili.h"

#define  ROW 3
#define  COL 3

//函数申明
void StartGame();

void InitChessBoard(char chess_board[ROW][COL]);
void DisplayChessBoard(char chess_board[ROW][COL]);



#endif 
//这里在game.c源文件中
void DisplayChessBoard(char chess_board[ROW][COL])
{
	for(int i=0; i 

这里可以自己调整成自己喜欢的样子。

<4>玩家下棋

写完玩家下棋函数后在头文件里加入声明。

//game.c源文件中的代码

void PlayerMove(char chess_board[ROW][COL])
{
	int x, y;
	printf("玩家下棋.n");
	printf("请输入坐标:>");

	while(1)
	{
		scanf("%d %d", &x, &y);
		//检查坐标的有效性
		if(x<0||x>=ROW || y<0 || y>COL)
		{
			printf("输入的坐标不合法,请重新输入.....n");
			continue;
		}
		//检查坐标是否被占用
		if(chess_board[x][y] == ' ')
		{
			chess_board[x][y] = PLAYER_CHESS_SYMBAL;
			break;
		}
	}
}

<5>电脑下棋

电脑下棋要随机下棋可以写一个随机数函数(根据时间生成数值)

//电脑下棋
void ComputerMove(char chess_board[ROW][COL])
{
	int x, y;
	srand(time(0));//种一个随机数种子
	while(1)
	{
		x = rand()%ROW;
		y = rand()%COL;

		if(chess_board[x][y] == ' ')
		{
			chess_board[x][y] = COMPUTER_CHESS_SYMBAL; //'o'
			break;
		}
	}
}

<6>判满

我们需要判断胜负首先要知道棋盘是否下满,这就要我们写一个判满函数。代码如下:

bool ChessBoardFull(char chess_board[ROW][COL])
{
	for (int i = 0; i < ROW; ++i)
	{
		for (int j = 0; j < COL; ++j)
		{
			if (chess_board[i][j] == ' ')
			{
				return false;
			}
		}
	}
	return true;
}

<7>检查结果

有四种情况就是玩家赢,电脑赢,平局,继续游戏,我们可以有一个返回值,根据返回值来判。比如玩家赢我们就返回'x',电脑赢我们就返回'o',平局就返回'h',继续游戏就返回'c'。 

//检查结果
//'c': 继续
//'x':玩家赢
//'o': 电脑赢
//'h': 和棋
char CheckResult(char chess_board[ROW][COL])
{
	//1 检查行
	for (int i = 0; i < ROW; ++i)
	{
		if ((chess_board[i][0] != ' ') &&
			(chess_board[i][0] == chess_board[i][1]) &&
			(chess_board[i][0] == chess_board[i][2]))
			return chess_board[i][0];
	}
	//2 检查列
	for (int i = 0; i < ROW; ++i)
	{
		if ((chess_board[0][i] != ' ') &&
			(chess_board[0][i] == chess_board[1][i]) &&
			(chess_board[0][i] == chess_board[2][i]))
			return chess_board[0][i];
	}
	//3 检查对角线
	if ((chess_board[0][0] != ' ') &&
		(chess_board[0][0] == chess_board[1][1]) &&
		(chess_board[0][0] == chess_board[2][2]))
		return chess_board[1][1];
	if ((chess_board[1][1] != ' ') &&
		(chess_board[1][1] == chess_board[2][0]) &&
		(chess_board[1][1] == chess_board[0][2]))
		return chess_board[1][1];
	//4 检查是否和棋
	if (ChessBoardFull(chess_board))
		return 'h';
	return 'c';
}

<8>开始游戏

将以上所有的函数进行三子棋游戏逻辑进行组装函数,代码如下:

void StartGame()
{
	//定义棋盘
	char chess_board[ROW][COL];

	//初始化棋盘
	InitChessBoard(chess_board);

	//进入游戏
	char winner;
	while(1)
	{
		//显示棋盘
		DisplayChessBoard(chess_board);
		//玩家下棋
		PlayerMove(chess_board);
		//判断结果
		winner = CheckResult(chess_board);
		if(winner != 'c')
			break;

		
		//电脑下棋
		ComputerMove(chess_board);
		//判断结果
		winner = CheckResult(chess_board);
		if (winner != 'c')
			break;
	}
	DisplayChessBoard(chess_board);
	//显示结果
	if(winner == 'x')
	{
		//玩家赢
		printf("玩家胜利.n");
	}
	else if(winner == 'o')
	{
		//电脑赢
		printf("电脑胜利.n");
	}
	else if(winner == 'h')
	{
		//和棋
		printf("和棋.n");
	}
	else
	{
		//程序出错
		printf("error.n");
	}
}

<9>utili.h全部代码

//预防头文件重复引入
#ifndef _UTILI_H_
#define _UTILI_H_

#include
#include
#include

#endif 

<10>game.h全部代码

#ifndef _GAME_H_
#define _GAME_H_

#include"utili.h"

#define  ROW 3
#define  COL 3

//函数申明
void StartGame();

void InitChessBoard(char chess_board[ROW][COL]);
void DisplayChessBoard(char chess_board[ROW][COL]);
bool ChessBoardFull(char chess_board[ROW][COL]);
void PlayerMove(char chess_board[ROW][COL]);
void ComputerMove(char chess_board[ROW][COL]);
char CheckResult(char chess_board[ROW][COL]);


#endif 

<11>game.c全部代码

#include"game.h"

#define PLAYER_CHESS_SYMBAL 'x'
#define COMPUTER_CHESS_SYMBAL 'o'

//初始化棋盘
void InitChessBoard(char chess_board[ROW][COL])
{
	for(int i=0; i");

	while(1)
	{
		scanf("%d %d", &x, &y);
		//检查坐标的有效性
		if(x<0||x>=ROW || y<0 || y>COL)
		{
			printf("输入的坐标不合法,请重新输入.....n");
			continue;
		}
		//检查坐标是否被占用
		if(chess_board[x][y] == ' ')
		{
			chess_board[x][y] = PLAYER_CHESS_SYMBAL;
			break;
		}
	}
}

//电脑下棋
void ComputerMove(char chess_board[ROW][COL])
{
	int x, y;
	srand(time(0));
	while(1)
	{
		x = rand()%ROW;
		y = rand()%COL;

		if(chess_board[x][y] == ' ')
		{
			chess_board[x][y] = COMPUTER_CHESS_SYMBAL; //'o'
			break;
		}
	}
}

//检查结果
//'c': 继续
//'x':玩家赢
//'o': 电脑赢
//'h': 和棋
char CheckResult(char chess_board[ROW][COL])
{
	//1 检查行
	for (int i = 0; i < ROW; ++i)
	{
		if ((chess_board[i][0] != ' ') &&
			(chess_board[i][0] == chess_board[i][1]) &&
			(chess_board[i][0] == chess_board[i][2]))
			return chess_board[i][0];
	}
	//2 检查列
	for (int i = 0; i < ROW; ++i)
	{
		if ((chess_board[0][i] != ' ') &&
			(chess_board[0][i] == chess_board[1][i]) &&
			(chess_board[0][i] == chess_board[2][i]))
			return chess_board[0][i];
	}
	//3 检查对角线
	if ((chess_board[0][0] != ' ') &&
		(chess_board[0][0] == chess_board[1][1]) &&
		(chess_board[0][0] == chess_board[2][2]))
		return chess_board[1][1];
	if ((chess_board[1][1] != ' ') &&
		(chess_board[1][1] == chess_board[2][0]) &&
		(chess_board[1][1] == chess_board[0][2]))
		return chess_board[1][1];
	//4 检查是否和棋
	if (ChessBoardFull(chess_board))
		return 'h';
	return 'c';
}


//开始游戏
void StartGame()
{
	//定义棋盘
	char chess_board[ROW][COL];

	//初始化棋盘
	InitChessBoard(chess_board);

	//进入游戏
	char winner;
	while(1)
	{
		//显示棋盘
		DisplayChessBoard(chess_board);
		//玩家下棋
		PlayerMove(chess_board);
		//判断结果
		winner = CheckResult(chess_board);
		if(winner != 'c')
			break;

		
		//电脑下棋
		ComputerMove(chess_board);
		//判断结果
		winner = CheckResult(chess_board);
		if (winner != 'c')
			break;
	}
	DisplayChessBoard(chess_board);
	//显示结果
	if(winner == 'x')
	{
		//玩家赢
		printf("玩家胜利.n");
	}
	else if(winner == 'o')
	{
		//电脑赢
		printf("电脑胜利.n");
	}
	else if(winner == 'h')
	{
		//和棋
		printf("和棋.n");
	}
	else
	{
		//程序出错
		printf("error.n");
	}
}

<12>gameMain.c全部代码

#include"game.h"

int main(int argc, char *argv[])
{
	int select = 1;
	while(select)
	{
		printf("********************************n");
		printf("*       简  易  三  子  棋     *n");
		printf("********************************n");
		printf("*          [1] Play            *n");
		printf("*          [0] Exit            *n");
		printf("********************************n");
		printf("请选择:>");
		scanf("%d", &select);

		if(select == 0)
			break;
		if(select != 1)
		{
			printf("输入的选项有误,请重新输入......n");
			continue;
		}

		//开始游戏
		StartGame();
	}
	printf("Game Over, 拜拜......n");
	return 0;
}

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

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

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