将三子棋的代码分为三部分:头文件存放game.h (主要用来声明各种函数,以便调用) ;源文件分别存放game.c(主要用来存放各种函数实现的代码)以及test.c(主要用来实现整个游戏代码框架)。
game.h代码:
#ifndef __GAME_H__
#define __GAME_H__
#define ROWS 3
#define COLS 3
void Init_chessboard(int board[ROWS][COLS], int rows, int cols); //初始化棋盘
void Play_move_chess(int board[ROWS][COLS], int rows, int cols); //玩家走棋
void Computer_move_chess(int board[ROWS][COLS], int rows, int cols); //电脑自动走棋
int Computer_think_move_chess(int board[ROWS][COLS], int rows, int cols);
//电脑在有两个连线时候能赢走棋
void Computer_more_think_move_chess(int board[ROWS][COLS], int rows, int cols);
//电脑能够堵玩家棋子
void Display_chessboard(int board[ROWS][COLS], int rows, int cols); //更新棋盘
int Check_win(int board[ROWS][COLS], int rows, int cols); //判断输赢
#endif //__GAME_H__
game.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
void Init_chessboard(int board[ROWS][COLS], int rows, int cols)//初始化棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ' ';
}
}
/*memset(board, ' ', sizeof(char)*rows*cols);*/
for (i = 0; i < rows; i++)
{
if (0 == i)
{
printf("_____________\n");
}
printf("|");
for (j = 0; j < cols; j++)
{
printf(" %c |", board[i][j]);
}
printf("\n");
printf("|___|___|___|\n");
}
}
void Play_move_chess(int board[ROWS][COLS], int rows, int cols) //玩家走棋
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
x--; //因为数组的下标从零开始,所以让它输入的下标减去1
y--;
if ((x >= 0) && (x <= rows - 1) && (y >= 0) && (y <= cols - 1) && (board[x][y] == ' ')) //保证输入的坐标不越界且没被占用
{
board[x][y] = 0;
break;
}
else
{
printf("您的输入有误,请重新输入.\n");
}
}
}
void Computer_move_chess(int board[ROWS][COLS], int rows, int cols) //电脑走棋
{
int x = 0;
int y = 0;
srand((unsigned int)time(NULL));
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = 1;
break;
}
}
}
void Display_chessboard(int board[ROWS][COLS], int rows, int cols) //更新棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
if (0 == i)
{
printf("_____________\n");
}
printf("|");
for (j = 0; j < cols; j++)
{
if (board[i][j] == ' ')
{
printf(" %c |", board[i][j]);
}
else
{
printf(" %d |", board[i][j]);
}
}
printf("\n");
printf("|___|___|___|\n");
}
}
int Check_win(int board[ROWS][COLS], int rows, int cols) //判断输赢
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2])) //每一行相等
{
if (0 == board[i][0])
{
return 0;
}
if (1 == board[i][0])
{
return 1;
}
}
}
for (j = 0; j < cols; j++)
{
if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j])) //每一列相等
{
if (0 == board[0][j])
{
return 0;
}
if (1 == board[0][j])
{
return 1;
}
}
}
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2])) //主对角线一样
{
if (0 == board[1][1])
{
return 0;
}
if (1 == board[1][1])
{
return 1;
}
}
if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]))
{
if (0 == board[1][1])
{
return 0;
}
if (1 == board[1][1])
{
return 1;
}
}
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
if (board[i][j] == ' ')
{
return -1;
}
}
}
return 3;
}
int Computer_think_move_chess(int board[ROWS][COLS], int rows, int cols)
//电脑在有两个连线时候走棋能赢
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
if ((board[i][0] + board[i][1] + board[i][2]) == (2+' ')) //每一行有两个元素相等
{
for (j = 0; j < cols; j++)
{
if (board[i][j] == ' ')
{
board[i][j] = 1;
return 1;
}
}
}
}
for (j = 0; j < cols; j++)
{
if (board[0][j] + board[1][j] + board[2][j] == (2 + ' ')) //每一列相等
{
for (i = 0; i < cols; i++)
{
if (board[i][j] == ' ')
{
board[i][j] = 1;
return 1;
}
}
}
}
if (board[0][0] + board[1][1] + board[2][2]==(2+' ')) //主对角线一样
{
for (i = 0; i < rows; i++)
{
if (board[i][i] == ' ')
{
{
board[i][i] = 1;
return 1;
}
}
}
}
else if (board[0][2] + board[1][1] + board[2][0]==(2+' '))
{
if (board[0][2] == ' ')
{
board[0][2] = 1;
return 1;
}
if (board[1][1] == ' ')
{
board[1][1] = 1;
return 1;
}
if (board[2][0]==' ')
{
board[2][0] = 1;
return 1;
}
}
else
{
return 0;
}
}
void Computer_more_think_move_chess(int board[ROWS][COLS], int rows, int cols) //电脑能够堵玩家棋子
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
if ((board[i][0] + board[i][1] + board[i][2]) == (0 + ' ')) //每一行有两个元素相等
{
for (j = 0; j < cols; j++)
{
if (board[i][j] == ' ')
{
board[i][j] = 1;
return;
}
}
}
}
for (j = 0; j < cols; j++)
{
if (board[0][j] + board[1][j] + board[2][j] == (0 + ' ')) //每一列相等
{
for (i = 0; i < cols; i++)
{
if (board[i][j] == ' ')
{
board[i][j] = 1;
return;
}
}
}
}
if (board[0][0] + board[1][1] + board[2][2] == (0 + ' ')) //主对角线一样
{
for (i = 0; i < rows; i++)
{
if (board[i][i] == ' ')
{
{
board[i][i] = 1;
return;
}
}
}
}
else if (board[0][2] + board[1][1] + board[2][0] == (0 + ' '))
{
if (board[0][2] == ' ')
{
{
board[0][2] = 1;
return;
}
}
if (board[1][1] == ' ')
{
{
board[1][1] = 1;
return;
}
}
if (board[2][0] == ' ')
{
{
board[2][0] = 1;
return;
}
}
}
else
{
srand((unsigned int)time(NULL));
while (1)
{
i = rand() % 3;
j = rand() % 3;
if (board[i][j] == ' ')
{
board[i][j] = 1;
return;
}
}
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void menu() //打印菜单
{
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("☆☆☆ 1.PLAY ☆☆☆\n");
printf("☆☆☆ 0.EXIT ☆☆☆\n");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
}
enum Option
{
EXIT,
PLAY
};
void game()
{
int k = 0;
int execut = 0;
int board[ROWS][COLS];
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("☆☆☆ 0.简单 ☆☆☆\n");
printf("☆☆☆ 1.中等 ☆☆☆\n");
printf("☆☆☆ 2.困难 ☆☆☆\n");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("请选择游戏模式:\n");
while (1)
{
scanf("%d", &k);
if ((k != 0) && (k != 1)&&(k != 2))
{
printf("输入错误,请重新输入.");
}
else
{
break;
}
}
int ret = 0;
Init_chessboard(board, ROWS, COLS); //初始化棋盘
while (1)
{
Play_move_chess(board, ROWS, COLS); //玩家走棋
Display_chessboard(board, ROWS, COLS); //更新棋盘
ret = Check_win(board, ROWS, COLS); //判断输赢
if (0 == ret)
{
printf("恭喜您赢了.\n");
break;
}
ret = Check_win(board, ROWS, COLS); //判断棋盘是否走满
if (3 == ret)
{
printf("棋逢对手.\n");
break;
}
switch(k)
{
case 0:
Computer_move_chess(board, ROWS, COLS); //电脑自动走棋
break;
case 1:
Computer_more_think_move_chess(board, ROWS, COLS);
break;
case 2:
execut=Computer_think_move_chess(board, ROWS, COLS);
if (0 == execut)
Computer_more_think_move_chess(board, ROWS, COLS);
break;
}
printf("电脑走之后的棋盘:\n");
Display_chessboard(board, ROWS, COLS); //更新棋盘
Check_win(board, ROWS, COLS); //判断输赢
ret = Check_win(board, ROWS, COLS);
if (1 == ret)
{
printf("很遗憾,您输了.\n");
break;
}
}
}
int main()
{
int input;
do //do...whlie循环保证至少打印菜单一次
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case PLAY:
game();
break;
case EXIT:
break;
default:
printf("您的输入有误,请重新输入.\n");
break;
}
} while (input);
return 0;
}
游戏运行情况: