双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了。
游戏的开始过程和结束。
首先是游戏的整个框架,从菜单开始,选择进行游戏和退出游戏,以及其他情况。
而在制作游戏代码中,我们先要从创建文件开始,先创建三个文件,分别是:
在game_sanziqi.c文件中,测试游戏的逻辑,创建出游戏的大框架。
在game.c的文件中,游戏的实现创建的是游戏中的函数。
在game.h(头文件)的文件中,声明使用的库函数和自定义函数。
//game_sanziqi.c
#include "game.h"//引用头文件
void menu()//菜单
{
printf("**********************\n");
printf("****** 1.Play ******\n");
printf("****** 0.Exit ******\n");
printf("**********************\n");
}
int main()
{
int input = 0;
do
{
menu();//菜单
printf("Please select:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();//游戏操作
//printf("Start\n");//可以在此设置,进行第一步程序测试
break;
case 0:
printf("Exit\n");
break;
default:
printf("Error\n");
break;
}
printf("\n");
} while (input);//input的值为1,0,其他值(非0)来判断是否进入循环
return 0;
}
//game.h
#pragma once
#include
现在可以成功进入游戏中了,考虑三子棋棋盘的布局是一个九宫格,为其制作出一个棋盘显示在屏幕上。
创建一个数组存放棋盘的数据:
依照这个模板来编写接下来的代码:
先创建一个全空格的九宫格数组。
将“---””|“ 输入进这个九宫格中空格地方是以后输入“*”“#”的地方,即输入字符的位置,该位置存放了三个" "(空格)的字符,所以在编写代码时,应输入的是(空格%c空格)" %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 < col - 1)
printf("|");
}
printf("\n");
//---
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
printf("\n");//棋盘后多一行空行,更美观
}
棋盘显示出来了,现在可以开始下棋了。
下棋的过程是一个循环的过程,由玩家和电脑轮流进行一步下棋。
//game_sanziqi.c
//玩家下棋,函数
is_player_game(board, ROW, COL);//玩家下棋
DisPlayBoard(board, ROW, COL);//显示玩家下棋位置
//game.c
//玩家下棋,函数
void is_player_game(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("Players play chess");
while (1)
{
printf("Select coordinates:>");
scanf("%d %d", &x, &y);//注意数组的下标和玩家了解的坐标不一定一致
if (x >= 1 && x <= row && y >= 1 && y <= col)//row和col都是设定为3
{
//下棋
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("Input error, re - enter:>\n");
}
}
else
{
printf("Error\n");
}
}
}
//game_sanziqi.c
//电脑下棋,函数
is_it_game(board, ROW, COL);//电脑下棋,随机的下棋,下在空格位
DisPlayBoard(board, ROW, COL);//显示电脑下棋位置
//game.c
//电脑下棋,函数
void is_it_game(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("Playing chess on the computer:\n");//放在循环体内的话,可能存在多出几行的情况
while (1)
{
x = rand() % row;//模3的余数是1,2
y = rand() % col;//使用了rand,要考虑srand
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
在玩家下棋后进行判断,在电脑下棋后进行判断。
判断的结果为:
所以在玩家和电脑每次下过棋后,进行判断的代码:
//game_sanziqi.c
//玩家下棋,函数
is_player_game(board, ROW, COL);//玩家下棋
DisPlayBoard(board, ROW, COL);//显示玩家下棋位置
//判断输赢,在每一次下棋后,玩家下棋后,电脑下棋后判断谁胜谁负
ret = is_win_game(board, ROW, COL);
if (ret != 'c')//不等于c,就是游戏出现结局了
{
break;
}
//电脑下棋,函数
is_it_game(board, ROW, COL);//电脑下棋,随机的下棋,下在空格位
DisPlayBoard(board, ROW, COL);//显示电脑下棋位置
//判断输赢,在每一次下棋后,玩家下棋后,电脑下棋后判断谁胜谁负
is_win_game(board, ROW, COL);
game_sanziqi.c
char ret = 0;
//下棋(循环操作,放在循环中)
while (1)
{
//玩家下棋,函数
is_player_game(board, ROW, COL);//玩家下棋
DisPlayBoard(board, ROW, COL);//显示玩家下棋位置
//判断输赢,在每一次下棋后,玩家下棋后,电脑下棋后判断谁胜谁负
ret = is_win_game(board, ROW, COL);
if (ret != 'c')//不等于c,就是游戏出现结局了
{
break;
}
//电脑下棋,函数
is_it_game(board, ROW, COL);//电脑下棋,随机的下棋,下在空格位
DisPlayBoard(board, ROW, COL);//显示电脑下棋位置
//判断输赢,在每一次下棋后,玩家下棋后,电脑下棋后判断谁胜谁负
is_win_game(board, ROW, COL);
//玩家赢——'*'
// //电脑赢——'#'
// 平局——'q'
// 无结果游戏继续——'c'
if (ret != 'c')//不等于c,就是游戏出现结局了
{
break;
}
}
if (ret == '*')
{
printf("YOU WIN\n");
}
else if (ret == '#')
{
printf("YOU LOST\n");
}
else
{
printf("DRAW\n");
}
//game.c
//判断输赢
char is_win_game(char board[ROW][COL], int row, int col)
//返回值为'*' '#' 'q' 'c'是字符,所以使用char
//判断棋盘中三个相同棋子相连
{
int i = 0;
//判断行
for (i = 0; i < row - 1; 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 - 1; 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[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[0][2];
}
//平局
if (is_full(board, row, col) == 1)
{
return 'q';//return q X ;return 'q' √
}
//继续
return 'c'; //return c X; return 'c' √
}
//game.c
//判断平局的过程
//判断平局 函数,使用static修饰,只在game.c文件中使用
static int is_full(char board[ROW][COL], int row, int col)//int 返回值
{
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;//棋盘已下满
}
将上列的代码整合在一起。
首先是 game.h 头文件,是函数的声明,所使用的函数的声明都放在这里面:
//game.h
#pragma once
//函数的声明
#include
#include
#include
#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 is_player_game(char board[ROW][COL], int row, int col);
//电脑下棋,函数
void is_it_game(char board[ROW][COL], int row, int col);
//判断输赢
char is_win_game(char board[ROW][COL], int row, int col);//注意是char还是void
接下来是 game_sanziqi.c 文件,是游戏的主体和框架:
//game_sanziqi.c
#include "game.h"//引用game.h 的头文件
void menu()
{
printf("**********************\n");
printf("****** 1.Play ******\n");
printf("****** 0.Exit ******\n");
printf("**********************\n");
}
void game()
{
//创建九宫格数组,ROW,COL定义在game.h
char board[ROW][COL] = { 0 };
//初始化棋盘为空格
InitBoard(board, ROW, COL);
//打印棋盘
DisPlayBoard(board, ROW, COL);
char ret = 0;
//下棋(循环操作,放在循环中)
while (1)
{
//玩家下棋,函数
is_player_game(board, ROW, COL);//玩家下棋
DisPlayBoard(board, ROW, COL);//显示玩家下棋位置
//判断输赢,在每一次下棋后,玩家下棋后,电脑下棋后判断谁胜谁负
ret = is_win_game(board, ROW, COL);
if (ret != 'c')//不等于c,就是游戏出现结局了
{
break;
}
//电脑下棋,函数
is_it_game(board, ROW, COL);//电脑下棋,随机的下棋,下在空格位
DisPlayBoard(board, ROW, COL);//显示电脑下棋位置
//判断输赢,在每一次下棋后,玩家下棋后,电脑下棋后判断谁胜谁负
is_win_game(board, ROW, COL);
if (ret != 'c')//不等于c,就是游戏出现结局了
{
break;
}
//玩家赢——'*'
// //电脑赢——'#'
// 平局——'q'
// 无结果游戏继续——'c'
}
if (ret == '*')
{
printf("YOU WIN\n");
}
else if (ret == '#')
{
printf("YOU LOST\n");
}
else
{
printf("DRAW\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("Please select:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
//printf("Start\n");
break;
case 0:
printf("Exit\n");
break;
default:
printf("Error\n");
break;
}
printf("\n");
} while (input);//input的值为1,0,其他值(非0)来判断是否进入循环
return 0;
}
最后是含有函数的定义的 game.c 文件:
//game.c
//函数的定义
#include "game.h"//引用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 < col - 1)
printf("|");
}
printf("\n");
//---
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
printf("\n");//棋盘后多一行空行,更美观
}
//玩家下棋,函数
void is_player_game(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("Players play chess\n");
while (1)
{
printf("Select coordinates:>\n");
scanf("%d %d", &x, &y);//注意数组的下标和玩家了解的坐标不一定一致
if (x >= 1 && x <= row && y >= 1 && y <= col)//row和col都是设定为3
{
//下棋
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("Input error, re - enter:>\n");
}
}
else
{
printf("Error\n");
}
}
}
//电脑下棋,函数
void is_it_game(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("Playing chess on the computer:\n");
while (1)
{
x = rand() % row;//模3的余数是1,2
y = rand() % col;//使用了rand,要考虑srand
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断平局 函数,使用static修饰
static int is_full(char board[ROW][COL], int row, int col)//int 返回值
{
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_game(char board[ROW][COL], int row, int col)
//返回值为'*' '#' 'q' 'c'是字符,所以使用char
//判断棋盘中三个相同棋子相连
{
int i = 0;
//判断行
for (i = 0; i < row - 1; 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 - 1; 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[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[0][2];
}
//平局
if (is_full(board, row, col) == 1)
{
return 'q';//return q X ;return 'q' √
}
//继续
return 'c'; //return c X; return 'c' √
}