三子棋创作(c语言)

三子棋创作(c语言),第1张

我们写三子棋之前首先要思考一下三子棋的实现逻辑:


一、

1、游戏菜单,是选择开始游戏还是结束游戏

2、打印一个棋盘出来,并且进行棋盘的初始化(即没有旗子的棋盘)

3、玩家下棋(用*表示)

4、电脑下棋(用#表示)

5、判断胜负(电脑和玩家下完棋之后,均要判断)


二、具体 *** 作步骤

1、首先我们要打印游戏的菜单界面部分

1表示开始游戏,0表示退出游戏;

void meau()
{
	printf("*****************************\n");
	printf("******  1.开始游戏  *********\n");
	printf("******  0.退出游戏  *********\n");
	printf("*****************************\n");
}

2、我们要创建一个主函数,

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

用 test() 函数表示我们要进入游戏部分;

3、我们要把test函数具体部分写出来,创建一个void类型的函数

void test()
{
	int input = 0;
	do
	{
		meau();//进入test部分,首先打印菜单
		printf("请输入:>");
		scanf_s("%d", &input);//输入1/0,是否开始游戏
	
		switch (input)
		{
		case 1:
			printf("游戏开始\n");//开始游戏
			game();//游戏开始后进入game函数部分
			break;//game执行完后跳出循环
		case 0:
			printf("退出游戏\n");
			break;//选择退出游戏,直接跳出循环
		default:
			printf("输入错误,请重新输入:>");
			break;

		}
	} while (input);//在我们输入数字的情况下,一直执行循环
}

4、选择开始游戏后,创建一个game()函数,并作为三子棋逻辑实现的主要部分;

void game()
{
    char board[ROW][COL] = { 0 };//创建一个数组,存放数据
	InitBoard(board, ROW, COL);//初始化棋盘为全空格
	DisplayBoard(board, ROW, COL);//打印棋盘
}

   1、初始化棋盘为全空格棋盘

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] = ' ';//将空格放入期盼的每一个元素内
		}
	}
}

  2、打印出这个初始化的棋盘

void DisplayBoard(char board[3][3], 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 < col- 1)
				printf("|");//打印竖着的分割线,以便分出第几列
		
		}
		printf("\n");//某一行打完之后 ,换行
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");//打印横着的分割线,以便分出第几行
				if (j < col - 1)
					printf("|");//打印竖着的分割线,以便分出第几列
			}
			printf("\n");//某一行打完之后 ,换行
		}
	}
}

 3、我们运行一下目前的代码,会得到一个这样的棋盘


五、接着我们要写出玩家下棋的函数部分,玩家下完棋之后,电脑继续下棋,因此这是一个循环,因此我们的game()函数内部也就要写成下面这样

void game()
{
	char board[ROW][COL] = { 0 };//创建一个数组,存放数据
	InitBoard(board, ROW, COL);//初始化棋盘为全空格
	DisplayBoard(board, ROW, COL);//打印棋盘
	while (1)
	{
		printf("玩家下棋:>");
		Player_move(board, ROW, COL);//玩家下棋
		DisplayBoard(board, ROW, COL);//再次打印棋盘

		printf("电脑下棋\n");
		Computer_move(board, ROW, COL);//电脑下棋
		DisplayBoard(board, ROW, COL);//再次打印棋盘
    }
}

 

六、我们要写出玩家下棋的具体步骤:因为玩家并不知道电脑是从第0行开始执行的,因此我们要   将玩家输入的坐标(x,y)变成(x-1,y-1)作为电脑执行的命令;

void Player_move(char board[3][3], int row, int col)
{
	int x = 0;
	int y = 0;
	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] = '*';//如果没有被其他棋子占用,那么将代表玩家的*放入棋盘内部
		}
		else
		{
			printf("坐标已被占用,请重新输入!\n");//如果已经被其他棋子占用,那么重新输入
		}
	}
	else
	{
		printf("坐标非法,请重新输入!\n");
	}
}


七、玩家下完棋之后,电脑要接着下棋,因此,我们需要把大脑下棋的步骤写出来

void Computer_move(char board[3][3], int row, int col)
{
	int x = 0;
	int y = 0;
	x = rand() % row;//电脑随机生成一个数,取余之后的数字一定可用
	y = rand() % col;
	if (board[x][y] == ' ')//判断是否被占用
		board[x][y] = '#';//如果未被占用,那么将代表电脑的'#'放进去
}

    注意:由于我们需要随机生成一个数字,因此我们需要在我们的test()函数内部加上这样一行代     码srand((unsigned int)time(NULL)); ,我们的头文件中也需要再加上#include那么我们的test()将会变成下面这样

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));//时间轴随机生成一个数字
	do
	{
		meau();
		printf("请输入:>");
		scanf_s("%d", &input);
	
		switch (input)
		{
		case 1:
			printf("游戏开始\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入:>");
			break;

		}
	} while (input);
}

 

八、无论是玩家还是电脑下完棋之后都要进行判断胜负,因此我们要分析一下如何写出判断胜负  的代码,我们写一个w_win()函数来判断,游戏无非三种情况,1、玩家胜利,2、电脑胜利,           3、平局

char w_win(char board[3][3], 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];
	//判断平局
	int x = 0;
	for (x = 0; x < row; x++)
	{
		int y = 0;
		for (y = 0; y< col; y++)
		{
			if (board[x][y] != ' ')
				return 'c';
		}
	}
	
}

   九、我们在game()函数内部创建一个char 类型的ret来接收w_win()函数所返回的值, 如果返       回的是'*',那么玩家胜利,如果返回的是'#',那么电脑胜利,如果返回的是'c',那么平局。


因此             我们需要在game()函数内部变成下面这样

void game()
{
	char ret = 0;
	char board[ROW][COL] = { 0 };//创建一个数组,存放数据
	InitBoard(board, ROW, COL);//初始化棋盘为全空格
	DisplayBoard(board, ROW, COL);//打印棋盘
	while (1)
	{
		printf("玩家下棋:>");
		Player_move(board, ROW, COL);//玩家下棋
		DisplayBoard(board, ROW, COL);//再次打印棋盘
		ret = is_win(board, ROW, COL);//判断输赢

		printf("电脑下棋\n");
		Computer_move(board, ROW, COL);//电脑下棋
		DisplayBoard(board, ROW, COL);//再次打印棋盘
		ret = is_win(board, ROW, COL);//判断输赢


		if (ret == '*')
		{
			printf("玩家赢了,游戏结束!\n");
			break;
		}
		if (ret == '#')
		{
			printf("电脑赢了,游戏结束!\n");
			break;
		}
		if (ret == 'q')
		{
			printf("平局!\n");
		}
		if (ret == 'c')
		{
			printf("游戏继续!\n");
		}
	}
}

 总结:为了方便我们观看,因此我们可以创建一个game.h的头文件来进行函数声明,并可以使用  宏定义#define来改变我们的行和列

#pragma once

#define ROW 3
#define COL 3
#include
#include
#include

void InitBoard(char board[3][3],int row,int col);//初始化棋盘
void DisplayBoard(char board[3][3],int row,int col);//打印棋盘
void Player_move(char board[3][3], int row,int col);//玩家下棋
void Computer_move(char board[3][3], int row, int col);//电脑下棋
char is_win(char board[3][3], int row, int col);//判断输赢

最后,下面是三子棋的完整代码,如有错误,请私聊我并指正。


#define _CRT_SECURE_NO_WARNINGS 1
#include
#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[3][3], 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 < col- 1)
				printf("|");
		
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}
void Player_move(char board[3][3], int row, int col)
{
	int x = 0;
	int y = 0;
	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] = '*';
		}
		else
		{
			printf("坐标已被占用,请重新输入!\n");
		}
	}
	else
	{
		printf("坐标非法,请重新输入!\n");
	}
}
void Computer_move(char board[3][3], int row, int col)
{
	int x = 0;
	int y = 0;
	x = rand() % row;
	y = rand() % col;
	if (board[x][y] == ' ')
		board[x][y] = '#';
}
char is_win(char board[3][3], 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];
	//判断平局
	int x = 0;
	for (x = 0; x < row; x++)
	{
		int y = 0;
		for (y = 0; y< col; y++)
		{
			if (board[x][y] != ' ')
				return 'c';
		}
	}
	
}
void game()
{
	char ret = 0;
	char board[ROW][COL] = { 0 };//创建一个数组,存放数据
	InitBoard(board, ROW, COL);//初始化棋盘为全空格
	DisplayBoard(board, ROW, COL);//打印棋盘
	while (1)
	{
		printf("玩家下棋:>");
		Player_move(board, ROW, COL);//玩家下棋
		DisplayBoard(board, ROW, COL);//再次打印棋盘
		ret = is_win(board, ROW, COL);//判断输赢

		printf("电脑下棋\n");
		Computer_move(board, ROW, COL);//电脑下棋
		DisplayBoard(board, ROW, COL);//再次打印棋盘
		ret = is_win(board, ROW, COL);//判断输赢


		if (ret == '*')
		{
			printf("玩家赢了,游戏结束!\n");
			break;
		}
		if (ret == '#')
		{
			printf("电脑赢了,游戏结束!\n");
			break;
		}
		if (ret == 'q')
		{
			printf("平局!\n");
		}
		if (ret == 'c')
		{
			printf("游戏继续!\n");
		}
	}
}
void meau()
{
	printf("*****************************\n");
	printf("******  1.开始游戏  *********\n");
	printf("******  0.退出游戏  *********\n");
	printf("*****************************\n");
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		meau();
		printf("请输入:>");
		scanf_s("%d", &input);
	
		switch (input)
		{
		case 1:
			printf("游戏开始\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入:>");
			break;

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

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

原文地址: https://www.outofmemory.cn/langs/562631.html

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

发表评论

登录后才能评论

评论列表(0条)

保存