沈阳网站设计外包,万户做网站怎么样,wordpress 上传svg,个人网站怎么做视频基本框架
三个文件: 其中.cpp文件用于游戏具体函数设计#xff0c;.h文件为游戏的函数声明#xff0c;test.cpp文件用于测试游戏运行。 需要用到的头文件#xff1a;
#include stdio.h
#include stdlib.h//randsrand
#include time.h//时间相…基本框架
三个文件: 其中.cpp文件用于游戏具体函数设计.h文件为游戏的函数声明test.cpp文件用于测试游戏运行。 需要用到的头文件
#include stdio.h
#include stdlib.h//randsrand
#include time.h//时间相关
框架运行
#includegame.h
void menu()
{printf(*********************************\n);printf(******** 1. play ********\n);printf(******** 0. exit ********\n);printf(*********************************\n);
}
void game()
{}
int main()
{int input;do{menu();printf(请选择:);scanf(%d, input);switch (input){case 1:game();break;case 0:printf(退出游戏\n);break;default:printf(选择错误重新选择!\n);break;}} while (input);return 0;
}
运行结果 棋盘 棋盘是一个3*3的平面可以用二维数组接收编译器不支持变长数组我们可以用define定义数组的下标(行和列)之后有大用。 #define COL 3
#define ROW 3
打印 为什么没有对齐呢这是因为字符数组初始化为0等价于\0而\0是不会显示出来的所以我们再添加一个初始化函数。 初始化函数 因为游戏可以反复游玩我们不妨设置一个初始化函数将棋子置于初始状态( 字符)。 void init_board(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] ;}}} 可以发现这次棋盘很标准了但有点刻意的风味如果想要一个10*10的棋盘又要重新设计吗应对此种情况我们试着改进棋盘。
棋盘改进
void display_board(char board[ROW][COL], int row, int col)
{int i 0;for (i 0; i row; i){//printf( %c | %c | %c \n, board[i][0], board[i][1], board[i][2]);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开始而不是从0开始是因为让玩家觉得合理。 void player_move(char board[ROW][COL], int row, int col)
{int x;int y;while (1){printf(请输入要下棋的坐标:);scanf(%d %d, x, y);if (y col x row){if (board[x-1][y-1] ){board[x-1][y-1] *;break;}else{printf(该坐标被占用请重新输入\n);}}else{printf(坐标非法重新输入\n);}}
}
测试 电脑下棋 需要用随机函数rand生成随机数和srand设置初始点使之电脑能随机在棋盘上下棋。 srand放在主函数里循环体前只需执行一次。
void computer_move(char board[ROW][COL], int row, int col)
{while (1){int x rand() % 3;//0~2int y rand() % 3;if (board[x][y] ){board[x][y] #;break;}}
}胜负评判 接着需要我们评判双方获胜条件即三子连成一条线的情况。 这里我们直接无脑评判就行如果三处相同且不为空格则说明一方胜利 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][1];}}//列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[1][1] ! ){return board[1][1];}if (board[0][2] board[1][1] board[1][1] board[2][0] board[1][1] ! ){return board[1][1];}//判断平局if (is_full(board, row, col) 1){return Q;}//继续return C;
}
这里有个取巧的方法可以直接用我们棋子所代表的字符作为返回值进行判断。
是否平局 平局需要单独判断我们可以封装一个函数遍历看棋盘是否已满就行了。 static int is_full(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){if ( board[i][j]){return 0;}}}return 1;
}
这里的static是只对本文件可见因为它只用于我们的胜负评判。 接下来我们对主函数的game函数再增添胜负评判每次落子之后进行评判根据对应的返回值输出相应的结果。 运行结果 完整代码
//game.c
#include game.h
void display_board(char board[ROW][COL], int row, int col)
{int i 0;for (i 0; i row; i){//printf( %c | %c | %c \n, board[i][0], board[i][1], board[i][2]);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 init_board(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 player_move(char board[ROW][COL], int row, int col)
{int x;int y;while (1){printf(请输入要下棋的坐标:);scanf(%d %d, x, y);if (y col x row){if (board[x-1][y-1] ){board[x-1][y-1] *;break;}else{printf(该坐标被占用请重新输入\n);}}else{printf(坐标非法重新输入\n);}}
}
void computer_move(char board[ROW][COL], int row, int col)
{while (1){int x rand() % 3;int y rand() % 3;if (board[x][y] ){board[x][y] #;break;}}
}static int is_full(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){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][1];}}//列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[1][1] ! ){return board[1][1];}if (board[0][2] board[1][1] board[1][1] board[2][0] board[1][1] ! ){return board[1][1];}//判断平局if (is_full(board, row, col) 1){return Q;}//继续return C;
}//.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once#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 display_board(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);//test.c
#includegame.h
void menu()
{printf(*********************************\n);printf(******** 1. play ********\n);printf(******** 0. exit ********\n);printf(*********************************\n);
}
void game()
{char board[ROW][COL] { 0 };init_board(board, ROW, COL);display_board(board, ROW, COL);char ret;while (1){player_move(board, ROW, COL);display_board(board, ROW, COL);ret is_win(board, ROW, COL);if (ret ! C)break;computer_move(board, ROW, COL);display_board(board, ROW, COL);ret is_win(board, ROW, COL);if (ret ! C)break;}if (ret Q){printf(平局\n);}if (ret *){printf(玩家胜\n);}if (ret #){printf(电脑胜\n);}
}
int main()
{int input;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);return 0;
}