事先准备:
三子棋的玩法如下:
我们在写一些重要的代码时,最好把自定义函数的声明、定义以及整个程序的实现,分别放在不同的文件里面。这样写不仅会让你的逻辑更清晰、更容易调试代码还便于后续对整个代码的保密操作。
游戏的实现逻辑:
test.c —— 测试游戏
game.h —— 游戏函数的声明
game.c —— 游戏函数的实现
头文件的作用:
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
使用宏定义:
#define ROW 3 #define COL 3
使用宏定义的原因:
1.推高代码可读性,后续代码中直接用变量代替,参数修改量大大减少。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
基本思路:
1.菜单界面选择/退出游戏
2.创建棋盘并初始化(棋盘为全空格)
char board[ROW][COL];//存放玩家或者电脑的落子情况
char ret = 0;
3.打印棋盘
循环{
玩家下棋
打印棋盘
判断玩家输赢:*
电脑下棋
打印棋盘
判断电脑输赢:#
}
【平局:Q(特殊情况)游戏继续:C】
以此循环第1条功能
菜单界面
void menu() { printf("********************\n"); printf("***** 1.play *******\n"); printf("***** 0.exit *******\n"); printf("********************\n"); }
测试的逻辑部分:
void game() { //存放玩家或者电脑的落子情况 char board[ROW][COL]; char ret = 0; // 初始化一下棋盘为全空格 init_board(board, ROW, COL); //打印棋盘 print_board(board, ROW, COL); while (1) { //玩家下棋 player_move(board, ROW, COL); print_board(board, ROW, COL); //判断输赢 ret = is_win(board, ROW, COL); if (ret != 'C') { break; } computer_move(board,ROW,COL); print_board(board, ROW, COL); //判断输赢 ret = is_win(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '#') printf("电脑赢了\n"); else if (ret == '*') printf("玩家赢了\n"); else if (ret == 'Q') printf("平局\n"); print_board(board, ROW, COL); } void test() { srand((unsigned int)time(NULL)); int input=0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } while (input); } int main() { test(); return 0; }
这部分代码之所以放外面是为了避免代码冗余
注意:
srand((unsigned int)time());srand()函数需要一个time函数的返回值作为参数,但time()函数的返回值是time_t,srand又需要unsigned int类型。
1.初始化棋盘为全空格
游戏开始之前要进行初始化,先建立一个空的棋盘雏形,这里用二维数组来替代棋盘上的位置,空格符号来代表此时棋盘上没有棋子落子。此时就是一个空棋盘,每次开始之前都要置空。
使用“InitBoard()”函数来进行棋盘的初始化操作。
char board[ROW][COL]; init_board(board, ROW, COL); void init_board(char board[ROW][COL], int row, int col);
函数的实现如下:
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.打印棋盘
打印效果:
可以看出上面打印的棋盘是有归律的
_ _ _ | _ _ _ | _ _ _
这是它的规律,而第3列是没有|,所以当j<col-1时才打印|
可看到最后一行没有_ _ _可说明当i<row-1时才打印_ _ _
测试和头文件部分:
print_board(board, ROW, COL); void print_board(char board[ROW][COL],int row, int col);
代码实现:
void print_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"); } } }