コンテンツ
1.基本的な考え方
Sanbangを実装するためのテンプレート全体の概要を見てみましょう。
コードの記述を開始する前に、まずコード全体を要約する必要があります。コード全体を3つの部分に分割できます。最初に:test.cファイルを使用してゲームのロジックをテストします。2番目:game.cファイルを使用して、ゲームのロジックを実装します。3番目:game.hファイルを使用して、ゲーム実装関数を宣言します。次のテキストでは、これら3つのドキュメントを引き続き使用します
2.テキスト
2.1ディレクトリを生成する
3試合のテンプレートからわかるように、最初の4行はゲーム全体のメニュー項目であり、プレーヤーは1.playまたは2.exitオプションが表示されます。
図に示すように:
2.1.1 test.c
test.cファイルでは、ディレクトリを印刷するためにそのようなコードを完成させる必要があります
#include"game.h"
void menu()
{
printf("***************************************************\n");
printf("*********** 1.play *************\n");
printf("*********** 0.exit *************\n");
printf("***************************************************\n");
}
void test()
{
int input = 0;
srand((unsigned int)time NULL);
do
{
menu();
printf("请选择");
scanf("%d", &input);
//当用户输入相对应的数字时,我们可以使用switch语句来更好的接收信息
switch (input)
{
case 1:
//当用户输入1时,开始游戏
//game();此时此刻就需要调用game()函数来实现整个游戏的过程,此过程下文会讲到
break;
case 0:
//当用户输入0时,则退出游戏
printf("退出游戏\n");
break;
default:
//当输入其他信息时,则返回错误
printf("选择错误\n");
break;
}
}while (input);//为了使游戏循环出现,我们使用 do while循环语句
}
int main()
{
test();
return 0;
}
最初の行にはおなじみの#include<stdio.h>ヘッダーファイルがないことに気付く人もいるかもしれませんが、コードブロックをより明確に見せるために、ここで強調する必要がある#include "game.h"、定義する必要のあるすべてのヘッダーファイル関数をgame.hファイルに入れることができます。後で使用する必要がある場合は、一般的なヘッダーファイルを参照するだけで済みます。
写真が示すように:
2.2ボードを初期化します
この単純な3バンガーのテンプレートから、合計3 * 3のグリッドがあることがわかります。これを実現するには、2次元配列、つまりchar board [ROW][COL]=を作成することでこれを実現できます。 {0};ここで、ROWは行数を表し、COLは列数を表します。各グリッドにはスペースがあり、このステップの主な目的は、プレーヤーがチェスをプレイしやすいように、空白、つまり初期化されたチェス盤の各グリッドが空であることを実現することです。
2.2.1 test.c
test.cファイルでは、次のようなコードを実装する必要があります
#include"game.h"
//引用头文件
void game()
{
//创建二维数组
char board[ROW][COL] = { 0 };
//用InitBoard来初始化二维数组
InitBoard(board,ROW,COL);
}
2.2.2 game.c
game.cファイルに、チェス盤をスペースとして初期化する特定のプロセスを書き出す必要があります
図に示すように:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//通过创建变量i,j以及使用循环语句对每一块格子初始化为空格
2.2.3 game.h
配列を初期化する前に、InitBoard関数を宣言する必要があります。これは、game.hファイルで完了する必要があります。また、3つのピースだけでなく、複数のピースの再生を自由に実装できるようにするには、次のように定義する必要があります。 game.hファイルの行。COLの行と列の数のサイズを数えます。保存後、行と列の数を手動で何度も変更する必要があります。
図に示すように:
2.3チェス盤の印刷
通常のチェス盤の表示を以下に示します。
2.3.1 test.c
ボードを初期化した後、ボードを印刷して、初期化後の外観を確認する必要があります。test.cファイルで、次のコードを完了する必要があります。
#include"game.h"
//引用头文件
void game()
{
//创建二维数组
char board[ROW][COL] = { 0 };
//用InitBoard函数来初始化二维数组
InitBoard(board,ROW,COL);
//用DisplayBoard函数来实现对棋盘的打印
DisplayBoard(board, ROW, COL);
}
2.3.2 game.c
チェス盤の印刷をどのように実現するか?このような問題を考える必要があります。上記のチェス盤の例では、チェス盤が9つのグリッドに分割されており、各グリッドの分割にはルールがあります。 2つのカテゴリに分けることができます。1:|によって実装されるデータ行。ループステートメントを使用して、データクラスのコンテンツを出力できます。2:行を分割します。これは--- |によって実現されます。loopステートメントを使用して、分割された行の内容を印刷することもできます。
このファイルで実行する必要のあるコード:
#include"game.h"
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int 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");
}
}
2.3.3 game.h
game.cからチェス盤の形式を印刷する場合は、game.hでこの関数を宣言する必要があります。
図に示すように:
2.4プレイヤーはチェスをします
プレイヤーは「*」でチェスをします
図に示すように:
2.4.1 test.c
#include"game.h"
void game()
{
//数据存储到一个字符的二维数组中,玩家下棋是‘*’ 电脑下棋是‘#’
char board[ROW][COL] = { 0 };//数组的初始化理想值为空格
InitBoard(board, ROW, COL); //对数组进行初始化函数为空格
DisplayBoard(board, ROW, COL); //打印三子棋模板
while (1) //进行游戏
{
player_move(board, ROW, COL); //玩家先玩
DisplayBoard(board, ROW, COL); //每输入一组数组,相应的三子棋模板也要显示出来
}
2.4.2 game.c
チェスをしているプレーヤーの機能のプロセス全体を実装するには、次のコードを完了する必要があります。
#include"ghame.h"
//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{
printf("玩家下棋:>");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
while (1)
{
if (x > 0 && x <= row && y > 0 & y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位置已被占用,请重新输入\n");
break;
}
}
else
{
printf("非法输入,请重新输入\n");
break;
}
}
}
2.4.3 game.h
関数player_moveを定義する前に、この関数をgame.hで宣言する必要があります。
図に示すように:
2.5コンピュータチェス
プレーヤーがチェスのプレイを終了すると、コンピューターがプレイします。原理はプレーヤーの原理と似ています。
実装後、図に示すように:
2.5.1 test.c
上の図に示すコンテンツを実現するには、test.cに次のコードを記述する必要があります。
void game()
{
//数据存储到一个字符的二维数组中,玩家下棋是‘*’ 电脑下棋是‘#’
char board[ROW][COL] = { 0 };//数组的初始化理想值为空格
InitBoard(board, ROW, COL); //对数组进行初始化函数为空格
DisplayBoard(board, ROW, COL); //打印三子棋模板
while (1) //进行游戏
{
player_move(board, ROW, COL); //玩家先玩
DisplayBoard(board, ROW, COL); //每输入一组数组,相应的三子棋模板也要显示出来
computer_move(board, ROW, COL); //电脑再玩
DisplayBoard(board, ROW, COL);
}
2.5.2 game.c
プレーヤーがチェスをする方法とは異なり、プレーヤーは主観的な仮定に基づいてチェスをし、コンピューターはランダムな次の位置を必要とするため、コンピューターがランダムな値を再生するようにsrand((unsigned int)time NULL);を使用する必要があります。
次に、game.cで次のコードを完成させる必要があります。
//电脑下棋用‘#’
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
このコードはtest.cで実行する必要があります
void test()
{
int input = 0;
srand((unsigned int)time NULL); //确保电脑下的位置是个随机数
}
2.5.3 game.h
対応する定義ヘッダーファイルも不可欠です。
2.6状況を判断する
プレイヤーとコンピューターが一定のレベルまで下がったら、結果を判断するか、描く必要があります
図に示すように:
勝ち負けのキャラクター:
//プレーヤーが勝ちます-'*'
//コンピューターが勝ちます-'#'
//平均---'Q'
//続行---'C'
2.6.1 test.c
char ret = 0; //全局变量定义ret
void game()
{
//数据存储到一个字符的二维数组中,玩家下棋是‘*’ 电脑下棋是‘#’
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");
}
}
2.6.2 game.c
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
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[0][0] != ' ')
{
return board[0][0];
}
if (board[2][0] == board[1][1] & board[1][1] == board[0][2] && board[2][0] != ' ')
{
return board[2][0];
}
//判断平局
if (is_full(board, row, col) == 1)
{
return 'Q';
}
//继续
else
return 'C';
}
2.6.3 game.h
3.ゲームのコード全体
3.1test.cファイル
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("***************************************************\n");
printf("*********** 1.play *************\n");
printf("*********** 0.exit *************\n");
printf("***************************************************\n");
}
int ret = 0;
void game()
{
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("请选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while (input);
}
int main()
{
test();
return 0;
}
3.2game.cファイル
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int 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;
int 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 player_move(char board[ROW][COL], int row, int col)
{
printf("玩家下棋:>");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
while (1)
{
if (x > 0 && x <= row && y > 0 & y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位置已被占用,请重新输入\n");
break;
}
}
else
{
printf("非法输入,请重新输入\n");
break;
}
}
}
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
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[0][0] != ' ')
{
return board[0][0];
}
if (board[2][0] == board[1][1] & board[1][1] == board[0][2] && board[2][0] != ' ')
{
return board[2][0];
}
if (is_full(board, row, col) == 1)
{
return 'Q';
}
else
return 'C';
}
3.3game.hファイル
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
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);