//------------------------------------------------------5. 数组实现(游戏)-----------------------------------------
//----------------------------------------------------5.1 利用数组实现 三子棋----------------------------------------
// 分块
test.c //测试游戏的逻辑
game.c //游戏代码的实现(函数定义)
game.h //游戏代码的声明(函数声明)
//---------------------------------------------------------test.c------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
//--------------------------------------------三子棋游戏
包含头文件
#include "game.h"
菜单页面
void menu()
{printf("****************************************\n");printf("**************** 1.paly ****************\n");printf("**************** 0.exit ***************\n");printf("****************************************\n");
}
进入游戏
void game()
{char ret = 0;char board[ROW][COL] = { 0 };//初始化 空 棋盘InitBoard(board, ROW, COL);//打印 空 棋盘DisplayBoard(board, ROW, COL);//---------------------开始下棋while (1){//玩家下棋PlayerMove(board, ROW, COL);//判断输赢 (玩家赢*/电脑赢#/满格平局Q/游戏继续C 四种状态)ret = Iswin(board, ROW, COL);if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);// 电脑下棋 (找没有下棋的位置随机下)ComputerMove(board, ROW, COL);//判断输赢if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);}switch (ret){case '*':printf("玩家赢,游戏结束\n");break;case '#':printf("电脑赢,游戏结束\n");break;case 'Q':printf("平局,游戏结束\n");break;}DisplayBoard(board, ROW, COL);}
主程序
int main()
{srand((unsigned int)time(NULL)); //设置随机数的生成起点int input = 0;while(1){menu();// 打印 游戏菜单 (函数)printf("请选择:>");scanf("%d", &input);printf("\n");if (input == 1){printf("三子棋\n");{game(); // 开始游戏 游戏逻辑(函数) ( 定义在game.c 声明在game.h )break;}}else if (input == 0){printf("退出游戏");break;}else{printf("输入错误,请重新选择\n\n");}}return 0;
}
//---------------------------------------------------------game.h------------------------------------------------------
#pragma once
#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);//判断输赢
char Iswin(char board[ROW][COL], int row, int col);
//---------------------------------------------------------game.c------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
包含头文件
#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++){//打印数据printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);//打印分割信息if(i<row-1){printf("---|---|---\n");}}}
//------------------------------------------------------------------打印 空 棋盘:高配版
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){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("请输入坐标:>");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("坐标被占用,请选择其他位置");}}else{printf("坐标无效,请重新输入\n");}}}
//-----------------------------------------------------------------------电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋\n");int x = 0;int y = 0;while(1){x = rand() % row; // x 坐标范围 0-2y = rand() % col;// y 坐标范围 0-2if (board[x][y] == ' '){board[x][y] = '#';break;}}}
//---------------------------------------------------------------------判断输赢
//判断输赢 (玩家赢*/电脑赢#/满格平局Q/游戏继续C 四种状态)//如果棋盘满了,返回1,不满返回0
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 Iswin(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][1] != ' ')//-----------可改造{return board[i][1];}}//再判断列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')//------------可改造{return board[1][j];}}//再判断对角线if(board[0][0]== board[1][1]&& board[1][1] == board[2][2] && board[1][j] != ' ')//-----------可改造{return board[1][1];}if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][j] != ' '){return board[1][1];}//前边没有返回,没有人赢,判断是否平局if (Isfull(board,row,col)){return 'Q';}//游戏继续return 'C';}