バックギャモンプログラムは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.メニューの効果
2.チェス盤を初期化する効果
3.ゲームの効果
4.ゲームオーバーの効果
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';
}