头文件(chess.h)
#pragma once #include<stdio.h> #define ROW 20 //棋盘行数 #define COLUMN 20//棋盘列数 #define CONNECT 5//多少子棋 //结构体创建棋盘 typedef struct Board { const char* chess_Board[ROW][COLUMN]; int size; }Board,*PBoard; //功能 //初始化棋盘属性 void initchessboard(PBoard pboard); //判断棋子所下的位置 是否满足成功的条件:连成CONNECT 个数。 bool success(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type);// 横向,竖向,两个斜方向 //该棋子横向 是否连成5子 [白] [白] [白] [白] [白]/或者[黑] [黑] [黑] [黑] [黑] bool success_hx_position(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type); //"●" //该棋子竖向 是否连成5子 bool success_sx_position(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type); //该棋子正斜向 是否连成5子 / bool success_zxx_position(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type); //该棋子反斜向 是否连成5子 \ bool success_fxx_position(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type); bool isfull(PBoard pboard); //判断棋盘是否已被占满 void start(PBoard pboard); //开始下棋 void show_board(PBoard pboard); //展示棋盘
函数功能实现模块(chess.cpp)
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> #include"chess.h" #include<Windows.h> //棋盘初始化 void initchessboard(PBoard pboard) { assert(pboard); for (int i = 0; i < ROW; i++) { for (int j = 0; j < COLUMN; j++) { pboard->chess_Board[i][j]="+"; } } pboard->size = 0;//开始的时候没有棋子 } //判断棋子所下的位置 是否满足成功的条件:连成CONNECT 个数。 bool success(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type)// 横向,竖向,两个斜方向 { return success_hx_position(pboard, cur_xpos, cur_ypos, chess_type) || success_sx_position(pboard, cur_xpos, cur_ypos, chess_type) || success_zxx_position(pboard, cur_xpos, cur_ypos, chess_type) || success_fxx_position(pboard, cur_xpos, cur_ypos, chess_type); } //该棋子横向 是否连成5子 [白] [黑] [白] bool success_hx_position(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type) //"●" { int count = 1, x = cur_xpos; int y=cur_ypos-1; for (; y >= 0&& pboard->chess_Board[x][y] == chess_type; y--) { count++; } y = cur_ypos + 1; for (; y <= COLUMN && pboard->chess_Board[x][y] == chess_type; y++) { count++; } if (count >= CONNECT) { return true; } return false; } //该棋子竖向 是否连成5子 bool success_sx_position(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type) { int count = 1, x = cur_xpos-1; int y = cur_ypos ; for (; x >= 0 && pboard->chess_Board[x][y] == chess_type; x--) { count++; } x = cur_xpos + 1; for (; x <= ROW && pboard->chess_Board[x][y] == chess_type; x++) { count++; } if (count >= CONNECT) { return true; } return false; } //该棋子正斜向 是否连成5子 / bool success_zxx_position(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type) { int count = 1, x = cur_xpos - 1; int y = cur_ypos+1; for (; x >= 0&&y<= COLUMN && pboard->chess_Board[x][y] == chess_type; x--,y++) { count++; } x = cur_xpos + 1,y=cur_ypos-1; for (; x <= ROW&&y>=0 && pboard->chess_Board[x][y] == chess_type; x++,y--) { count++; } if (count >= CONNECT) { return true; } return false; } //该棋子反斜向 是否连成5子 \ bool success_fxx_position(PBoard pboard, int cur_xpos, int cur_ypos, const char* chess_type) { int count = 1, x = cur_xpos - 1; int y = cur_ypos - 1; for (; x >= 0&& y >= 0&& pboard->chess_Board[x][y] == chess_type; x--, y--) { count++; } x = cur_xpos + 1, y = cur_ypos + 1; for (; x <= ROW&&y <= COLUMN && pboard->chess_Board[x][y] == chess_type; x++, y++) { count++; } if (count >= CONNECT) { return true; } return false; } bool isfull(PBoard pboard) //判断棋盘是否已被占满 { return pboard->size == ROW * COLUMN; } void start(PBoard pboard)//开始下棋 { const char* chess_type; char chioce; int colour, xpos, ypos; while (true) { initchessboard(pboard); printf("五子棋游戏开始\n 请选择输入的棋子类型\n 1. 黑棋\n 2. 白棋\n 3. 退出\n"); scanf("%d", &colour); if (colour == 3) { printf("您选择了结束游戏!\n"); return; } chess_type = colour == 1 ? "●" : "○"; while (true) { while (true) { show_board(pboard); printf("请输入%s棋子的坐标(下标):", chess_type); scanf("%d%d", &xpos, &ypos); if (pboard->chess_Board[xpos][ypos] == "+") { //前提该位置空闲 pboard->chess_Board[xpos][ypos] = chess_type; //下棋操作 break; } else { printf("该位置已被占用,请重新选择新坐标\n"); } } pboard->size++; //有效棋子个数+1 //判断该棋子所处的位置,是否周围连续连成五个子 bool result = success(pboard, xpos, ypos, chess_type); //若result == true 赢 提示是否需要进行新一轮游戏? if (result) { show_board(pboard); printf("%s棋子获胜\n 是否进行新游戏(y or n)?:", chess_type); scanf("%s", &chioce); getchar(); if (chioce == 'y') { //新游戏开始,新的棋盘 break; //跳出一层循环 } else if (chioce == 'n') { //'n' printf("游戏结束\n"); return; } } else { chess_type = chess_type == "○" ? "●" : "○"; } } } } void show_board(PBoard pboard) //展示棋盘 { system("cls"); for (int i = 0; i < ROW; i++) { for (int j = 0; j < COLUMN; j++) { printf("%s", pboard->chess_Board[i][j]); } printf("\n"); } }
测试文件(text.cpp)
#include<stdio.h> #include"chess.h" int main() { Board board; start(&board); return 0; }
版权声明:本文为weixin_52485836原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。