使用C语言实现三子棋小游戏

使用C语言实现三子棋小游戏,第1张

使用C语言实现三子棋小游戏

我们可以把写代码的过程分为三个大部分来写。

定义为:

test.c-----用于测试游戏运行的逻辑

game.c--用于完成游戏的实现

game.h--用于函数的声明与符号定义

1.首先完成test.c部分:

这部分我们写四个函数:

void menu() //来设置一个简单的菜单

void game() //用于游戏的过程:棋盘建立、玩家/电脑下棋、判断输赢

void test() //用于游戏开始与结束

int main() //最后在main函数中调用运行

先完成menu函数:

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

用这建立一个简单的菜单。

再写game函数:

函数中创建了:InitBoard函数用于初始化棋盘

DisplayBoard函数用于打印棋盘

Player_move函数表示玩家下棋过程

computer_move函数表示电脑下棋过程

is_win函数用于判断输赢

实现这些函数的代码我们在game.c中完成。

void game()
{
	char ret;
	char board[ROW][COL] = { 0 };//存放下棋的数据
	InitBoard(board, ROW, COL);//初始化棋盘为空格
	
	DisplayBoard(board,ROW,COL);//打印一个棋盘的模型
	while (1)//这个过程完成玩家下棋、电脑下棋、打印棋盘、判断输赢
	{
		player_move(board, ROW, COL);//玩家下棋
		DisplayBoard(board, ROW, COL);//打印棋盘
		ret=is_win(board,ROW,COL);//判断输赢
		//玩家赢--*
		//电脑赢--#
		//平局--Q;
		//继续--C
		if (ret != 'C')
		{
			break;
		}


		//电脑下棋
		computer_move(board, ROW, COL);//电脑随机下棋
		DisplayBoard(board, ROW, COL);//打印棋盘
		ret = is_win(board, ROW, COL);//判断输赢
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
		printf("玩家赢n");
	else if (ret == '#')
		printf("电脑赢n");
	else
		printf("平局n");
}

2.完成game.c部分:

初始化棋盘:

void InitBoard(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 DisplayBoard(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++)
		{
			printf(" %c ", board[i][j]);
			if(j 

棋盘就长这样:

设置玩家下棋代码:

void player_move(char board[ROW][COL], int row, int col)
{
	int x, y;
	printf("玩家下棋n");
	
	while(1)
	{ 
		printf("请输入坐标:n");
		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("坐标占用,重新输入n");
			}
		}
		else//不符合规范就会重新输入
		{
			printf("坐标非法,重新输入:n");
		}
	}
}

 设置电脑下棋代码:

电脑下棋我们只需要让电脑随机生成一个坐标,且符合规范就行。

void computer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;

	printf("电脑下棋n");
	while (1)//让电脑生成随机数,且符合规范
	{
		x = rand() % row;//0--2
		y = rand() % col;//0--2
		if (board[x][y] == ' ')//让电脑只能下在未下棋的部分
			{
				board[x][y] = '#';//电脑的棋用#表示
				break;//下好后就停止轮到玩家下
			}
	}
	
}

判断游戏结果:

(1).if_full函数用于判断棋盘是否下满

int if_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;//满了
}

(2).is_win函数用于判断下棋输赢或平局

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][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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
//判断对角线是否相等
		return board[1][1];//如果相同就输出玩家或电脑的棋子
	//判断平局
	if (if_full(board, row, col) == 1)
	{
		return 'Q';如果棋盘下满,输出Q表示结束
	}
	return 'C';//输出C表示继续
}

3.头文件game.h:

我们可以自己创建一个头文件,把我们定义的函数攘括在这个头文件里面,这样可以减少代码的数量。

#define ROW 3//将ROW定义为3
#define COL 3//将COL定义为3,方便使用
#include
#include
#include
void InitBoard(char board[ROW][COL], int row,int col);//初始化
void DisplayBoard(char board[ROW][COL],int row,int col);打印棋盘
void player_move(char board[ROW][COL], int row, int col);玩家下棋
void computer_move(char board[ROW][COL], int row, int col);电脑下棋
char is_win(char board[ROW][COL], int row, int col);判断输赢

总结一下三个部分:

test.c:

#include"game.h"
void menu()
{
	printf("**************************n");
	printf("*********1.play***********n");
	printf("*********0.exit***********n");
	printf("**************************n");
}
void game()
{
	char ret;
	char board[ROW][COL] = { 0 };
	InitBoard(board, ROW, COL);
	
	DisplayBoard(board,ROW,COL);
	while (1)
	{
		player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret=is_win(board,ROW,COL);
		if (ret != 'C')
		{
			break;
		}
		computer_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
		printf("玩家赢n");
	else if (ret == '#')
		printf("电脑赢n");
	else
		printf("平局n");
}
void test()
{
	int input=0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入:n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:printf("三子棋:n"); game();
			break;
		case 0:printf("退出游戏n"); break;
		default:printf("输入错误n");
		}
	} while (input);

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

}

game.c:

#include"game.h"

void InitBoard(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 DisplayBoard(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++)
		{
			printf(" %c ", board[i][j]);
			if(j= 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_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;

	printf("电脑下棋n");
	while (1)
	{
		x = rand() % row;//0--2
		y = rand() % col;//0--2
		if (board[x][y] == ' ')
			{
				board[x][y] = '#';
				break;
			}
	}
	
}
int if_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][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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];
	
	if (if_full(board, row, col) == 1)
	{
		return 'Q';
	}
	return 'C';
}

game.h:

#define ROW 3
#define COL 3
#include
#include
#include
void InitBoard(char board[ROW][COL], int row,int col);
void DisplayBoard(char board[ROW][COL],int row,int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);

运行效果如下:

 

游戏思路简单,希望对大家有帮助,感兴趣支持一些咯!!!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5714366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存