三子棋游戏实现条件
1.test.c - 测试的逻辑
2.game.h - 用来声明函数等
3.game.c - 游戏的实现
游戏条件:
1.我们需要创建一个二维数组棋盘
2.初始化棋盘
3.打印棋盘(3*3棋盘或者更多)
4.玩家下棋
5.电脑下棋
6.判断输赢
目录
打印游戏菜单
1.调用test函数来进行打印和选择玩不玩游戏,最少执行一次,我们使用do while循环语句 代码如下(看注释):
void test()
{
int input = 0;
do
{
menu();//打印菜单
scanf("%d", &input);//输入一个数
switch(input)//把输入的数作为witch语句的判断条件
{
case 1://如果input是1,直接进入游戏
printf("Game of three chess\n");
game();//game函数
break;
case 0://如果是输入的是0直接退出游戏
printf("Byebye!\n");
break;//跳出语句
default://如果不是1也不是0,提示输入错误,重新输入
printf("Input worong,try again!\n");
break;
}
} while (input);//只有是0的时候才跳出循环
}
//主函数
int main()
{
test();
return 0;
}
紧接着进入game()函数内部 我们可以看到 创建棋盘 初始化棋盘 打印棋盘 玩家下棋 电脑下棋
然后每次玩家下完棋都要打印棋盘和判断输赢
void game()
{
char board[ROW][COL] = { 0 };//创建二维数组棋盘
char ret = 0;
srand((unsigned)time(NULL));//rand函数生成随时会变的随机值,在使用rand函数之前需要使用srand
init_board(board, ROW, COL);//初始化棋盘
print_board(board, ROW, COL);//打印棋盘
while (1)
{
player_board(board, ROW, COL);//玩家下棋
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);//判断输赢
if (ret != 'C')//如果is_win函数返回的是'C'条件不成立,继续下棋
{
break;//如果返回的不是'C'跳出循环
}
computer_board(board, ROW, COL);//电脑下棋
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);//判断输赢
if (ret != 'C')
{
break;
}
}
if (ret == '*')//返回'*'则玩家赢
{
printf("Player win!\n");
}
if (ret == '#')//返回'#'电脑赢
{
printf("Computer win!\n");
}
if (ret == 'N')//返回'N'棋盘满,没人赢
{
printf("Nobody win:)\n");
}
}
顺便讲一下在game.c文件中写函数的实现,我们需要在game.h中来进行声明 game.h内部的函数声明:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//声明初始化函数
void init_board(char board[ROW][COL], int row, int col);
//声明打印函数
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋
void player_board(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col);
//判断输赢
char is_win(char board[ROW][COL], int row, int col);
1.初始化棋盘
//初始化棋盘
void init_board(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.打印棋盘
先打印" %c | %c | %c " 再打印 “—|—|—”**
void print_board(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++)//如果col是3,我们从0开始到2会打印三次
{
printf(" %c ", board[i][j]);//%c两边各有一个空格
if (j < col - 1)//如果col是3,我们从0开始到2会打印三次
{ //但是我们需要打印最后一个,以便于好看
printf("|");
}
}
printf("\n");//每列打印完换行
//打印每一列的元素
if (i < row - 1)//和上面一个道理不需要打印最后一个
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)//同上
{
printf("|");
}
}
}
printf("\n");//打印完每列的元素换行
}
}
3.玩家下棋
//玩家下棋
void player_board(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("Player:");
scanf("%d %d", &x, &y);//把输入的值放到x,y里
//玩家不像程序员,他们认为1就是1,比如数字arr[0][0]的位置代表第一个元素,但玩家认为是[1][1],例如三行三列,就是每行1-3每列1-3而不是0-2
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
if (board[x - 1][y - 1] == ' ')//我们需要-1来和我们棋盘数组的元素对应,然后如果是空格的话我们就把输入的坐标放'*'进去
{
board[x - 1][y - 1] = '*';
break;//'*'成功放进后跳出循环
}
else
{
printf("Coordinates are already occupied\n");
}//如果条件不满足对应的if语句,那就是坐标已经被占用
}
else
{
printf("illegal coordinates\n");//不满足对应的if语句,打印非法坐标
}
}
}
4.电脑下棋
void computer_board(char board[ROW][COL], int row, int col)
{
printf("Computer\n");//打印电脑
while (1)
{
int x = rand() % row;//rand函数来生成随机值,%取模来控制每行随机值范围
int y = rand() % col;//使用rand函数之前需要使用srand函数,在前面game()函数内部我可以看到srand((unsigned)time(NULL));
if (board[x][y] == ' ')//如果棋盘上有空格,把'#'放进对应的坐标
{
board[x][y] = '#';
break;//成功放进'#'后,跳出循环
}
}
}
5.判断输赢
假设3*3棋盘,三行元素一样或者三列元素一样,或者对角元素一样(空格除外)视为获胜
'*'代表玩家赢
'#'代表电脑赢
'C’游戏继续
'N’游戏平局
//判断输赢
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][0] != ' ')
{
return board[i][0];//如果条件成立,随便返回一个值就能判断谁赢
}
}
//判断三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//判断对角
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (is_full(board, ROW, COL) == 1)//判断棋盘是否满了,只在这个函数内部使用,看下面代码
{
return 'N';//条件满足的话返回'N',棋盘满了。
}
return 'C';//条件不满足返回'C',游戏继续
}
5.1判断棋盘是否满了:
//判断棋盘是否满了
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;//如果有空格返回0,游戏继续
}
}
}
return 1;//没空格返回1
}
完整的代码:
test.c
#include "game.h"
//打印菜单
void menu()
{
printf("************************************\n");
printf("********* 1.play *********\n");
printf("********* 0.exit *********\n");
printf("************************************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
char ret = 0;
srand((unsigned)time(NULL));
init_board(board, ROW, COL);//初始化棋盘
print_board(board, ROW, COL);//打印棋盘
while (1)
{
player_board(board, ROW, COL);//玩家下棋
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);//判断输赢
if (ret != 'C')
{
break;
}
computer_board(board, ROW, COL);//电脑下棋
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);//判断输赢
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("Player win!\n");
}
if (ret == '#')
{
printf("Computer win!\n");
}
if (ret == 'N')
{
printf("Nobody win:)\n");
}
}
void test()
{
int input = 0;
do
{
menu();//打印菜单
scanf("%d", &input);
switch(input)
{
case 1:
printf("Game of three chess\n");
game();
break;
case 0:
printf("Byebye!\n");
break;
default:
printf("Input worong,try again!\n");
break;
}
} while (input);
}
//主函数
int main()
{
test();
return 0;
}
geme.c
#include "game.h"
//初始化棋盘
void init_board(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 print_board(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");
}
}
//玩家下棋
void player_board(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("Player:");
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] = '*';
break;
}
else
{
printf("Coordinates are already occupied\n");
}
}
else
{
printf("illegal coordinates\n");
}
}
}
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col)
{
printf("Computer\n");
while (1)
{
int x = rand() % row;
int 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][0] != ' ')
{
return board[i][0];
}
}
//判断三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//判断对角
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (is_full(board, ROW, COL) == 1)
{
return 'N';
}
return 'C';
}
game.h
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//声明初始化函数
void init_board(char board[ROW][COL], int row, int col);
//声明打印函数
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋
void player_board(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col);
//判断输赢
char is_win(char board[ROW][COL], int row, int col);