简单的三子棋(棋盘大小可变)

    xiaoxiao2022-07-14  161

    三子棋的逻辑:首先第一步:需要写出游戏菜单,判断是否需要进行游戏;第二步:对棋盘进行初始化 ,将棋盘初始化为空格;第三步:打印棋盘。接下来就开始下棋啦,首先玩家输入坐标进行下棋,进而电脑自动随机生成坐标进行下棋(需要注意防止所输入坐标已经被占用的现象)。最终就是判断输赢的函数咯,不过要注意的是一定不要忘了判断棋盘是否已满,如果棋盘满了就是平局啦。

    具体代码如下:

    函数声明:game.h

    #include<stdio.h> #include<stdlib.h> #include<time.h> //定义棋盘的大小 #define ROW 3 #define COL 3 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); //电脑走 int CheckWin(char board[ROW][COL], int row, int col); //判断输赢

    函数定义:game.c

    #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void InitBoard(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 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"); } } } void PlayerMove(char board[ROW][COL], int row, int col) //玩家走 { int x = 0; int y = 0; printf("玩家走:>\n"); 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) { //rand为生成随机数函数 x = rand() % row; y = rand() % col; if (board[x][y] == ' ') //判断坐标是否被占用 { board[x][y] = '#'; //赋值# break; } } } int IsFull(char board[ROW][COL], int row, int col) //判断棋盘是否已满(仅为支持CheckWin函数) { 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; } int CheckWin(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 (IsFull(board, row, col)) //平局 { return 'W'; } return ' '; }

    函数测试:test.c

    #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void mune() { printf("************************\n"); printf("***** 1. play *****\n"); printf("***** 0. exit *****\n"); printf("************************\n"); } void game() { int ret = 0; char board[ROW][COL] = { 0 }; InitBoard(board, ROW, COL); DisplayBoard(board, ROW, COL); while (1) { //玩家走 PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = CheckWin(board, ROW, COL); if (ret != ' ') { break; } //电脑走 ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = CheckWin(board, ROW, COL); if (ret != ' ') { break; } } if (ret == '*') { printf("玩家赢!\n"); } if (ret == '#') { printf("电脑赢!\n"); } if (ret == 'w') { printf("平局!\n"); } } int main() { int input = 0; srand((unsigned int)time(NULL)); do { mune(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }

    编译运行:

    1.游戏菜单:选择进行游戏还是退出游戏。

    2.选择(1)进行游戏,玩家输入坐标开始下棋。

    3.玩家输入后,电脑随机声称坐标进行游戏,最终玩家赢。

    4.游戏可循环,重新选择是否重新开始游戏。

    最新回复(0)