如何生成构架图(结构图生成)
601
2022-05-28
游戏介绍:
三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。
那我们如何实现这个游戏呢?
我们首先要捋清楚我们要实现什么:
1、先初始化棋盘,把未打印的数字置为空格。
void InitBoard(char board[ROW][COL], int row, int col);
2、打印棋盘。
void DisplayBoard(char board[ROW][COL], int row, int col)
3、实现玩家下棋过程。
void PlayerMove(char board[ROW][COL], int row, int col);
4、实现电脑下棋过程。
void ComputerMove(char board[ROW][COL], int row, int col);
5、判断输赢
char IsWin(char board[ROW][COL], int row, int col);
在这里用返回值来确定输赢。
判断游戏输赢
要返回四种不同的状态
玩家赢 – ‘*’
电脑赢 – ‘#’
平局 – ‘Q’
继续 – ‘C’
主要过程分析:
打印棋盘:
棋盘拆成每一行:###|###|### 和—|---|— (#代表空格)
只要在最后一列中不打印‘|’就可以。在可以通过if判断语句来实现if(j 在第0列和第一列打印。 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"); } } 打印效果: | | ---|---|--- | | ---|---|--- | | 实现玩家下棋: 1、在这里通过x-1、y-1就可以以常规识别坐标的方式来选择坐标。 2、if (board[x - 1][y - 1] == ' ') 判断在棋盘内可以落子的地方条件。只要选择的位置为空,就说明这个地方没有被占用,可以下在这个地方。 3、if (x >= 1 && x <= row && y >= 1 && y <= col) 判断选择的范围是否在棋盘内。 void PlayerMove(char board[ROW][COL], int row, int col) { printf("玩家走:>\n"); int x = 0; int y = 0; while (1) { printf("请输入坐标:>"); 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("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,超出范围\n"); } } } 实现电脑下棋: x = rand() % row; //随机产生0~2的数字 y = rand() % col; //随机产生0~2的数字 首先让电脑随机产生随机值,由于row和col都是3,那么产生的数字%3就可以得到0~2的随机数。 void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑走:>\n"); while (1) { x = rand() % row; //随机产生0~2的数字 y = rand() % col; //随机产生0~2的数字 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } 下棋过程: 分析这块代码逻辑: 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; } 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"); } else { printf("平局\n"); } } 主函数控制过程: srand( (unsigned int)time(NULL) ); //和之前的rand函数搭配使用,生成时间戳。要在循环外使用,防止时间戳被不停地改变, 之后形成的数字将不在随机。 int main() { int input = 0; srand( (unsigned int)time(NULL) ); do { menu(); //菜单的打印,方便选择 printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏"); break; default: printf("选择错误"); break; } } while (input); return 0; } game.h #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include game.c #include "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]); // } // printf("\n"); //} //int i = 0; //for (i = 0;i < row; i++) //{ // //打印数据 // printf(" %c | %c | %c \n", board[i][0], board[i][1], board[2]); //} 打印分割行 //if (i < row - 1) //{ // printf("---|---|---\n"); //} 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 PlayerMove(char board[ROW][COL], int row, int col) { printf("玩家走:>\n"); int x = 0; int y = 0; while (1) { printf("请输入坐标:>"); 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("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,超出范围\n"); } } } void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑走:>\n"); while (1) { x = rand() % row; //随机产生0~2的数字 y = rand() % col; //随机产生0~2的数字 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } char IsWin(char board[ROW][COL], int row, int col) { int flag = 1; int i = 0; int j = 0; //1、判断输赢 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][0] == '*' && board[i][1] == '*' && board[i][2] == '*' || board[0][j] == '*' && board[1][j] == '*' && board[2][j] == '*' || board[0][0] == '*' && board[1][1] == '*' && board[2][2] == '*' || board[0][2] == '*' && board[1][1] == '*' && board[2][0] == '*') { return '*'; } else if (board[i][0] == '#' && board[i][1] == '#' && board[i][2] == '#' || board[0][j] == '#' && board[1][j] == '#' && board[2][j] == '#' || board[0][0] == '#' && board[1][1] == '#' && board[2][2] == '#' || board[0][2] == '#' && board[1][1] == '#' && board[2][0] == '#') { return '#'; } else if (board[i][j] == ' ') { flag = 0; } } } //2、判断平局 if (flag == 1) { return 'Q'; } //3、游戏继续 else { return 'C'; } } test.c #include "game.h" void menu() { printf("***************************************\n"); printf("*********** 1. play *************\n"); printf("*********** 2. exit *************\n"); printf("***************************************\n"); } void game() { //三子棋的过程 char board[ROW][COL]; //棋盘数组 //初始化棋盘 - board的元素都给成空格 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"); } else { printf("平局\n"); } } int main() { int input = 0; srand( (unsigned int)time(NULL) ); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏"); break; default: printf("选择错误"); break; } } while (input); return 0; } 来看看实现后的结果~ 5G游戏 C 语言
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。