目录
一、准备与规划
二、各类步骤
1、制作简易的界面(在test.c文件中)编辑
2、游戏开始选择(在test.c文件中)
3、设置行,列(建议使用预处理指令#define定义)(在game.h中)创建数组存储数据(在test.c中)
编辑
(game.h)
4、初始化棋盘
5、打印棋盘
6、玩家下棋
7、电脑下棋
8、判断游戏状态
三、代码段
一、准备与规划
(上图来自比特鹏哥直播视频截图)
二、各类步骤
1、制作简易的界面(在test.c文件中)
2、游戏开始选择(在test.c文件中)
(可以在do while循环语句里面放一个switch分支语句)
3、设置行,列(建议使用预处理指令#define定义)(在game.h中)创建数组存储数据(在test.c中)
(game.h)
(test.c)
4、初始化棋盘
(test.c)
(game.h)
(game.c)
5、打印棋盘
(test.c)
(game.h)
(game.c)
6、玩家下棋
(test.c)(game.h)(game.c)
7、电脑下棋
(test.c)(game.h)(game.c)
8、判断游戏状态
(test.c)
(game.h)
(game.c)
三、代码段
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){printf("**************************\n");printf("******* 三子棋游戏 *******\n");printf("******* 1.play *******\n");printf("******* 0.exit *******\n");printf("**************************\n");}void game(){//存储数据char board[ROW][COL];//初始化棋盘IsitBoard(board, ROW, COL);//打印棋盘——本质是打印数组内容DisplayBoard(board, ROW, COL);//*代表玩家赢//#代表电脑赢//'Q'代表平局//'C'代表游戏继续char ret = 0;while (1){//玩家下棋PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//判断玩家是否赢得游戏ret = InWin(board, ROW, COL);if (ret != 'C')break;//电脑下棋ComputerMove(board, ROW, COL);DisplayBoard(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:printf("游戏开始\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入");break;}} while (input);return 0;}
game.c
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void IsitBoard(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;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < row - 1){int j = 0;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("请输入坐标:>\n");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){printf("电脑走:>\n");while (1){int x = rand() % row;int y = rand() % col;//判断坐标是否被占用if (board[x][y] == ' '){board[x][y] = '#';break;}}}int IsFull(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++){if (board[i][j] == ' ')return 0;//棋盘没满}}return 1;//棋盘满了}char InWin(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];break;}}//判断三列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' '){return board[0][j];break;}}//判断对角线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];}//如果棋盘满了返回1,没满返回0int ret = IsFull(board, row, col);if (ret == 1){return 'Q';}//继续return 'C';}
game.h
#pragma once#include<stdio.h>#include<stdlib.h>#include<time.h>#define ROW 3//竖#define COL 3//横//函数声明//初始化棋盘的函数void IsitBoard(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);//判断游戏状态的函数char InWin(char board[ROW][COL], int row, int col);