C语言实现三子棋主要用到二维数组的相关知识,所以我们使用多文件编程来实现这个程序,需要建立一个头文件,两个源文件来实现:
1.game.h–>函数的申明与宏定义
2.game.c–>游戏各个功能的实现
3.main.c–>函数的定义
思路:
1.将各个函数的执行放在游戏执行函数game函数中,将game函数放在循环中以便我们游戏结束后还可以玩。
2.选择结构判断继续玩玩游戏还是退出游戏,得有一个main()函数实现,我们把这个框架放在main.c中:
具体代码模块
main.c
#include"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
void Menu()
{
printf("############################\n");
printf("## 欢迎来到三子棋 ##\n");
printf("############################\n");
printf("## 1.Play 2.Exit ##\n");
printf("############################\n");
printf("请选择:> ");
}
int main()
{
int quit = 0;
while (!quit) {//如果不退出
Menu();
int select = 0;
scanf("%d", &select);
switch (select) {
case 1:
Game();
break;
case 2:
quit = 1;
break;
default:
printf("你输错了,请重新输入!\n");
break;
}
}
printf("byebye!\n");
system("pause");
}
game.h
#ifndef __GAEM_H__
#define __GAME_H__
#include<stdio.h>
#include<windows.h>
#include<time.h>//随机数
#pragma warning (disable:4996)
//宏定义放在头文件
#define ROW 3
#define COL 3
#define Player_C 'X'
#define Computer_C 'O'
#define INIT ' '
//在game.c里实现
void InitBoard(char board[][COL], int row, int col);//行可以省略,列不可以
void ShowBoard(char board[][COL], int row, int col);
void ComputerMove(char board[][COL], int row, int col);
char Judge(char board[][COL], int row, int col);
void Game();
#endif
game.c
#include"game.h"
void InitBoard(char board[][COL], int row, int col)//行可以省略,列不可以
{
int i = 0;
for (; i < row; i++) {
int j = 0;
for (; j < col; j++) {
board[i][j] = INIT;
}
}
}
void ShowBoard(char board[][COL], int row, int col)
{
printf(" 1 | 2 | 3 \n");
printf("---------------\n");
int i = 0;
for (; i < row; i++){
printf("%d |",i+1);
int j = 0;
for (; j < col; j++) {
printf("%c |", board[i][j]);
}
printf("\n");
printf("---------------\n");
}
/*printf("3 |");
for (int j = 0; j < col; j++) {
printf("%c |", board[2][j]);
}
printf("\n");
printf("---------------\n");*/
}
void ComputerMove(char board[][COL], int row, int col)
{
while (1) {
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = Computer_C;
break;
}
}
}
char Judge(char board[][COL], int row, int col)
{
int i = 0;
for (; 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[i][0];
}
}
if (board[0][0] == board[1][1] && \
board[1][1] != ' ' && \
board[1][1] == board[2][2]) {
return board[1][1];
}
if (board[0][2] == board[1][1] && \
board[1][1] != ' ' && \
board[1][1] ==board[2][0]) {
return board[1][1];
}
for (i = 0; i < row; i++) {
int j = 0;
for (; j < col; j++) {
if (board[i][j] == INIT) {
return 'N';
}
}
}
return 'F';
}
void Game() {
srand((unsigned long)time(NULL));//种下一个随机数种子
char board[ROW][COL];
InitBoard(board, ROW, COL);
char result = 0;
do {
ShowBoard(board, ROW, COL);
printf("请落子:> ");
int x = 0;
int y = 0;
scanf_s("%d %d", &x, &y);
if (x <= 0 || x > 3 || y <= 0 || y > 3) {
printf("你输入的位置有误,请重新输入!\n");
continue;
}
if (board[x - 1][y - 1] != ' ') {
printf("该位置已经被占用,请重新输入!\n");
}
board[x - 1][y - 1] = Player_C;
result = Judge(board, ROW, COL);
if (result != 'N') {//'N'->next,'F'->FULL,'X','O'
break;
}
ComputerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != 'N') {//'N'->next,'F'->FULL,'X','O'
break;
}
} while(1);
if (result == Player_C) {
printf("恭喜你,你赢了!\n");
}
else if (result == Computer_C) {
printf("不好意思,你输了!\n");
}
else {
printf("还不错,平手!\n");
}
printf("你玩的还不错,要不要再来一把!\n");
}
测试效果