辽宁网站建设,it运维需要学什么,门户网站开发申请,可以进行网站外链建设的有五子棋的历史背景#xff1a; 五子棋起源于中国#xff0c;是全国智力运动会竞技项目之一#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子#xff0c;下在棋盘直线与横线的交叉点上#xff0c;先形成五子连珠者获胜。五子棋容易上手#xff0c…五子棋的历史背景 五子棋起源于中国是全国智力运动会竞技项目之一是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子下在棋盘直线与横线的交叉点上先形成五子连珠者获胜。五子棋容易上手老少皆宜而且趣味横生引人入胜。它不仅能增强思维能力提高智力而且富含哲理有助于修身养性。不难看出五子棋是我们中华民族发明的我们必须了解他作为程序员我们更加要懂得如何把五子棋的代码给敲出来我研究了一天了调试了无数次修改了无数错误到最后运行成功的那一刹那我就很开心就想以博客的形式分享给大家一.设计过程步骤ps:整个五子棋一共有三个文件200多行代码不复杂多琢磨很好懂分为text.cgame.hgame.c文件在最后会给出完整代码。1.初始化二维数组为了数组里面存放的每个数是我们想初始化的我们初始化一个二维数组(方阵的格式即 n*n)用来存放棋子里面的元素可以按照我们的意愿来初始化在此代码中将数组中每个元素初始化为一个空格。#define ROW 5
#define COL 5
void InitBoard(char board[ROW][COL], int row, int col)
{int i 0; int j 0;for (i 0; i ROW; i){for (int j 0; j COL; j){board[i][j] ;}}
}
2.构造一个棋盘在初始化一个数组后的基础上我们来构造一个棋盘使得整个代码的结构更加清晰可读性高。#define ROW 5
#define COL 5
void DisplayBoard(char board[ROW][COL], int row, int col)
{int i 0;int j 0;for (i 0; i row; i){for(j0;jcol;j){printf( %c , board[i][j]);//注意%c的左右是有两个空格的if (j col -1)//最后一列不打印|也就是打印4个|只是为了美观不加也行见下图printf(|);}printf(\n);if (i row - 1)//最后一行不进行打印---和|见下图{int j 0;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 x 0;int y 0;printf(玩家走:);while (1){printf(请输入下棋的坐标\n);scanf_s(%d %d, x, y);//判断坐标的合法性if (x 1 x row y 1 y col){//下棋//坐标是否被占用if ( board[x - 1][y - 1]) //等号量变也可以调换我这样写要是出错那编译器会提示错误如果换过来的话那就不会提示错误了这样找bug可能会很难受
//如果是空格的话这个位置就是空的可以下棋{board[x - 1][y - 1] *;break;}else{printf(坐标被占用请重新输入\n);}}else{printf(坐标非法请重新选择\n);}}
}4.电脑随机下棋//电脑
void ComputerMove(char board[ROW][COL], int row, int col)
{ printf(电脑走:\n);while (1){int x rand() % ROW;//rand是根据系统的情况来自动生成一个随机数int y rand() % COL;//判断占用if (board[x][y] ){board[x][y] #;break;}}
}5.判断是否能分出胜负//判断游戏是否有输赢
char IsWin(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][2] board[i][3] board[i][3] board[i][4] 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[2][i] board[3][i] board[3][i] board[4][i] board[1][i] ! ){return board[i][1];}}//判断\对角线元素是否相等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[1][1]! ){return board[1][1];}//判断/对角线元素是否相等if ( board[4][0] board[3][1] board[3][1] board[2][2]
board[2][2] board[1][3] board[1][3] board[0][4] board[1][1]! ){return board[1][1];}6.判断是否平局int IsFull(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;
}//判断平局//如果棋盘满了则返回1不满返回0int ret IsFull(board, row, col);if (ret 1){return Q;}return C;以下是game.h文件的代码#pragma once
//头文件的包含
#includestdio.h
#includetime.h
#includestdlib.h
//符号定义
#define ROW 5
#define COL 5//函数声明
//初始化棋盘的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);char IsWin(char board[ROW][COL], int row, int col);
以下是text.c文件的代码#includegame.h
void menu()
{printf(*******************************\n);printf(********* 1.play ************\n);printf(********* 0.exit ************\n);printf(*******************************\n);}
void game()
{//储存数据--二维数组char board[ROW][COL];//初始化棋盘为空格InitBoard(board, ROW, COL);//打印棋盘--本质打印数组的内容DisplayBoard(board,ROW,COL);char ret 0;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);elseprintf(平局\n);DisplayBoard(board, ROW, COL);}
int main()
{srand((unsigned int) time(NULL));int input 0;do{menu();printf(请选择:);scanf_s(%d, input);switch (input){case 1:game();break;case 0:printf(退出游戏\n);break;default:printf(选择错误重新选择\n);break;}} while (input);return 0;
}二.完整代码game.h文件#pragma once
//头文件的包含
#includestdio.h
#includetime.h
#includestdlib.h
//符号定义
#define ROW 5
#define COL 5//函数声明
//初始化棋盘的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);char IsWin(char board[ROW][COL], int row, int col);game.c文件#includegame.h
void InitBoard(char board[ROW][COL], int row, int col)
{int i 0; int j 0;for (i 0; i ROW; i){for (int 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(j0;jcol;j){printf( %c , board[i][j]);if (j col -1)printf(|);}printf(\n);if (i row - 1){int j 0;for (j 0; j col; j){printf(---);if (j col - 1)printf(|);}printf(\n);}//printf(---|---|---\n);}
}
//玩家
void PlayerMove(char board[ROW][COL], int row, int col)
{int x 0;int y 0;printf(玩家走:);while (1){printf(请输入下棋的坐标\n);scanf_s(%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(坐标被占用请重新输入\n);}}else{printf(坐标非法请重新选择\n);}}
}
//电脑
void ComputerMove(char board[ROW][COL], int row, int col)
{ printf(电脑走:\n);while (1){int x rand() % ROW;int y rand() % COL;//判断占用if (board[x][y] ){board[x][y] #;break;}}
}
int IsFull(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 IsWin(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][2] board[i][3] board[i][3] board[i][4] 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[2][i] board[3][i] board[3][i] board[4][i] board[1][i] ! ){return board[i][1];}}//判断\对角线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[1][1]! ){return board[1][1];}//判断/对角线if ( board[4][0] board[3][1] board[3][1] board[2][2] board[2][2] board[1][3] board[1][3] board[0][4] board[1][1]! ){return board[1][1];}//判断平局//如果棋盘满了则返回1不满返回0int ret IsFull(board, row, col);if (ret 1){return Q;}return C;}
以下是text.c文件#includegame.h
void menu()
{printf(*******************************\n);printf(********* 1.play ************\n);printf(********* 0.exit ************\n);printf(*******************************\n);}
void game()
{//储存数据--二维数组char board[ROW][COL];//初始化棋盘为空格InitBoard(board, ROW, COL);//打印棋盘--本质打印数组的内容DisplayBoard(board,ROW,COL);char ret 0;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);elseprintf(平局\n);DisplayBoard(board, ROW, COL);}
int main()
{srand((unsigned int) time(NULL));int input 0;do{menu();printf(请选择:);scanf_s(%d, input);switch (input){case 1:game();break;case 0:printf(退出游戏\n);break;default:printf(选择错误重新选择\n);break;}} while (input);return 0;
}最后大家有问题可以指出来关个注点个赞评个论我们一起进步 2023.02.09 From努力进大厂的新青年