[C言語]C言語シリーズ-Gobangの実装

バックギャモンプログラムは4つの部分に分けることができます。最初の部分はヘッダーファイルの作成です。これにより、関数を適切にカプセル化できます。注意すべき2つの詳細があります。1つはヘッダーファイルでdefineを使用して定義することです。行と列。将来、行と列を変更する場合は、この定義の場所を変更するだけで済みます。2つ目は、stdio.h time.hおよびその他のヘッダーファイルをgame.hヘッダーファイルにインクルードして、繰り返しインクルードされないようにすることです。

2番目の部分は、test.c関数ロジックの実装です。これには、メニューの印刷、チェス盤の初期化、チェス盤の印刷、プレーヤー、コンピューターのプレイなど、ゲームを実現するために必要な基本ロジックが含まれています。チェス、そしてゲームの状態の判断。

3番目の部分は、ゲーム関連の機能の実装です。表はゲームの各特定の機能の説明であり、裏は一般的なコードです。

4番目の部分はゲーム効果の表示です。 

パートV:ゲームの全体的な実装コード 

最初の部分:

ヘッダーファイルの内容-ゲーム関連関数の宣言、シンボルの宣言、ヘッダーファイルのインクルード

#pragma once

//game.h  游戏相关函数的声明、符号的声明、头文件的包含

//符号的声明
#define ROW 5
#define COL 5

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

//函数的声明
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row,int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);

//判断输赢
//游戏状态:*:玩家赢
//          #:电脑赢
//          Q:平局
//          C:游戏继续
char IsWin(char board[ROW][COL], int row, int col);

パート2-マッピングゲームtest.cのロジック  

#define _CRT_SECURE_NO_WARNINGS 1

//test.c  测绘游戏的逻辑
//game.c  游戏相关函数的实现
//game.h  游戏相关函数的声明、符号的声明、头文件的包含
#define _CRT_SECURE_NO_WARNINGS 1    //解决VS中scanf不安全问题
#include"game.h"                     //自己创建的头文件用双引号
void menu()                          //菜单的实现
{
	printf("1.play\n");
	printf("0.exit\n");
}
void game()                          //游戏实现部分
{
	//定义数组--存储数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	char ret;      //判断游戏状态
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);   //判断游戏输赢
		if (ret != 'C')
			break;   
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢\n");
	else if (ret == '#')
		printf("电脑赢\n");
	else
		printf("平局\n");
}
int main()
{
	int n = 0;
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择:->");
		scanf("%d", &n);
		switch (n)
		{
		case 1:game(); break;
		case 0:printf("退出游戏"); break;
		default:printf("选择错误,重新选择\n");
		}
	} while (n);
	return 0;
}

3番目の部分-ゲーム関連関数game.cの実装

1.チェッカーボードの初期化(基本的にアレイの初期化)

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

2.チェス盤を印刷します

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)           //打印每一行的的空格和竖线
	{
		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.プレーヤーがチェスをする-プレーヤーが入力した座標が合法であるかどうか、および座標が占有されているかどうかを判断する必要があります

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("玩家走\n");

	while (1)              //如果坐标违法就重新输入
	{
		printf("请输入坐标->:");
		scanf("%d%d", &m, &n);
		//判断坐标合法性
		if (m <= ROW && m >= 1 && n <= COL && n >= 1)
		{
			//判断坐标是否被占用
			if (board[m - 1][n - 1] == ' ')     //玩家不知道数组下标从零开始,输入是从(1 1)开始的,所以要减一
			{
				board[m - 1][n - 1] = '*';
				break;
			}
			else
				printf("坐标被占用,请重新输入\n");
		}
		else
			printf("坐标非法,请重新输入\n");
	}
}

4.コンピューターがチェスをする-配列の範囲内でランダムな座標をコンピューターに生成させるために、ランダム関数値生成関数rand()が使用されます。同時に、値のランダム性を確保するために、シードを設定する必要があります。座標が占有されているかどうかを確認します。

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("电脑走\n");
	while (1)
	{
		m = rand() % row;
		n = rand() % col;
		//判断坐标是否被占用
		if (board[m][n] == ' ')
		{
			board[m][n] = '#';
			break;
		}
	}
}

5.ゲームの状態を判断します-:*:プレーヤーが勝ちます              

                                     #:コンピューターが勝つ
                                     Q:抽選
                                     C:ゲームは続く

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1]
			&& board[i][1] == board[i][2]
			&& board[i][2] == board[i][3]
			&& board[i][3] == board[i][4]
			&& board[i][4] != ' ')
			return board[i][1];
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i]
			&& board[0][i] == board[1][i]
			&& board[1][i] == board[2][i]
			&& board[2][i] == board[3][i]
			&& board[3][i] == board[4][i]
			&& board[4][i] != ' ')
			return board[1][i];
	}
	if (board[0][0] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	if (board[0][4] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	int ret = IsFull(board, row, col);
	if (ret)
		return 'Q';
	return 'C';
}

6.ゲームの状態を判断する-ボードがいっぱいかどうかを判断する

in//判断棋盘是否满了
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0, flag = 1;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			if (board[i][j] == ' ')

				flag = 0;
	}
	return flag;
}

7.game.cの全体的な実装

#define _CRT_SECURE_NO_WARNINGS 1

//game.c  游戏相关函数的实现
#include"game.h"

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

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)           //打印每一行的的空格和竖线
	{
		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 PlayerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("玩家走\n");

	while (1)              //如果坐标违法就重新输入
	{
		printf("请输入坐标->:");
		scanf("%d%d", &m, &n);
		//判断坐标合法性
		if (m <= ROW && m >= 1 && n <= COL && n >= 1)
		{
			//判断坐标是否被占用
			if (board[m - 1][n - 1] == ' ')     //玩家不知道数组下标从零开始,输入是从(1 1)开始的,所以要减一
			{
				board[m - 1][n - 1] = '*';
				break;
			}
			else
				printf("坐标被占用,请重新输入\n");
		}
		else
			printf("坐标非法,请重新输入\n");
	}
}

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("电脑走\n");
	while (1)
	{
		m = rand() % row;
		n = rand() % col;
		//判断坐标是否被占用
		if (board[m][n] == ' ')
		{
			board[m][n] = '#';
			break;
		}
	}
}

//判断棋盘是否满了
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0, flag = 1;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			if (board[i][j] == ' ')

				flag = 0;
	}
	return flag;
}

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1]
			&& board[i][1] == board[i][2]
			&& board[i][2] == board[i][3]
			&& board[i][3] == board[i][4]
			&& board[i][4] != ' ')
			return board[i][1];
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i]
			&& board[0][i] == board[1][i]
			&& board[1][i] == board[2][i]
			&& board[2][i] == board[3][i]
			&& board[3][i] == board[4][i]
			&& board[4][i] != ' ')
			return board[1][i];
	}
	if (board[0][0] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	if (board[0][4] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	int ret = IsFull(board, row, col);
	if (ret)
		return 'Q';
	return 'C';
}

パート4-ゲーム効果

1.メニューの効果

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5pWy5Luj56CB55qE6aKc、size_20、color_FFFFFF、t_70、g_se、x_16

2.チェス盤を初期化する効果

911012b94d6546b59148f178781961a1.png

 3.ゲームの効果

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5pWy5Luj56CB55qE6aKc、size_8、color_FFFFFF、t_70、g_se、x_16

4.ゲームオーバーの効果

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5pWy5Luj56CB55qE6aKc、size_8、color_FFFFFF、t_70、g_se、x_16

5番目の部分:ゲームの全体的な実装コード。

game.h

#pragma once

//game.h  游戏相关函数的声明、符号的声明、头文件的包含

//符号的声明
#define ROW 5
#define COL 5

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

//函数的声明
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row,int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);

//判断输赢
//游戏状态:*:玩家赢
//          #:电脑赢
//          Q:平局
//          C:游戏继续
char IsWin(char board[ROW][COL], int row, int col);

 test.c

#define _CRT_SECURE_NO_WARNINGS 1

//test.c  测绘游戏的逻辑
//game.c  游戏相关函数的实现
//game.h  游戏相关函数的声明、符号的声明、头文件的包含
#define _CRT_SECURE_NO_WARNINGS 1    //解决VS中scanf不安全问题
#include"game.h"                     //自己创建的头文件用双引号
void menu()                          //菜单的实现
{
	printf("1.play\n");
	printf("0.exit\n");
}
void game()                          //游戏实现部分
{
	//定义数组--存储数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	char ret;      //判断游戏状态
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);   //判断游戏输赢
		if (ret != 'C')
			break;   
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢\n");
	else if (ret == '#')
		printf("电脑赢\n");
	else
		printf("平局\n");
}
int main()
{
	int n = 0;
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择:->");
		scanf("%d", &n);
		switch (n)
		{
		case 1:game(); break;
		case 0:printf("退出游戏"); break;
		default:printf("选择错误,重新选择\n");
		}
	} while (n);
	return 0;
}

 game.c

#define _CRT_SECURE_NO_WARNINGS 1

//game.c  游戏相关函数的实现
#include"game.h"

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

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)           //打印每一行的的空格和竖线
	{
		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 PlayerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("玩家走\n");

	while (1)              //如果坐标违法就重新输入
	{
		printf("请输入坐标->:");
		scanf("%d%d", &m, &n);
		//判断坐标合法性
		if (m <= ROW && m >= 1 && n <= COL && n >= 1)
		{
			//判断坐标是否被占用
			if (board[m - 1][n - 1] == ' ')     //玩家不知道数组下标从零开始,输入是从(1 1)开始的,所以要减一
			{
				board[m - 1][n - 1] = '*';
				break;
			}
			else
				printf("坐标被占用,请重新输入\n");
		}
		else
			printf("坐标非法,请重新输入\n");
	}
}

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("电脑走\n");
	while (1)
	{
		m = rand() % row;
		n = rand() % col;
		//判断坐标是否被占用
		if (board[m][n] == ' ')
		{
			board[m][n] = '#';
			break;
		}
	}
}

//判断棋盘是否满了
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0, flag = 1;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			if (board[i][j] == ' ')

				flag = 0;
	}
	return flag;
}

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1]
			&& board[i][1] == board[i][2]
			&& board[i][2] == board[i][3]
			&& board[i][3] == board[i][4]
			&& board[i][4] != ' ')
			return board[i][1];
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i]
			&& board[0][i] == board[1][i]
			&& board[1][i] == board[2][i]
			&& board[2][i] == board[3][i]
			&& board[3][i] == board[4][i]
			&& board[4][i] != ' ')
			return board[1][i];
	}
	if (board[0][0] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	if (board[0][4] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	int ret = IsFull(board, row, col);
	if (ret)
		return 'Q';
	return 'C';
}

おすすめ

転載: blog.csdn.net/m0_62391199/article/details/122540210