一个用C语言写的很简单的三子棋小程序
头文件 game.h
#ifndef GAME_H
#define GAME_H
/*定义行列数*/
#define ROW 3
#define COL 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*函数声明*/
void InitBoard(char board[ROW][COL], int row, int col); //初始化棋盘
void PrintBoard(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 CheckWin(char board[ROW][COL], int row, int col); //判断输赢
#endif
主函数所在的源文件 game.c ,内部还包括一个简单的菜单界面和输赢或平局的结果显示
#include "game.h"
void menu()
{
printf("\n\n");
printf("┌─────┐\n");
printf("丨 丨\n");
printf("丨 1.Play 丨\n");
printf("丨 丨\n");
printf("丨 0.Exit 丨\n");
printf("丨 丨\n");
printf("└─────┘\n");
}
void Win(char ret)
{
if (ret == 'X')
{
printf("\n\n");
printf("*************\n");
printf("**玩家胜利!**\n");
printf("*************\n");
}
else if (ret == '0')
{
printf("\n\n");
printf("*************\n");
printf("**电脑胜利!**\n");
printf("*************\n");
}
else
{
printf("\n\n");
printf("*************\n");
printf("** 平局! **\n");
printf("*************\n");
}
}
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);
PrintBoard(board, ROW, COL);
while (1)
{
PlayerMove(board, ROW, COL);
PrintBoard(board, ROW, COL);
ret = CheckWin(board, ROW, COL); //每次走完判断是否结束游戏
if (ret != ' ')
{
break;
}
ComputerMove(board, ROW, COL);
PrintBoard(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if (ret != ' ')
{
break;
}
}
Win(ret);
getchar();
getchar();
system("cls"); //游戏结束后清理屏幕
}
int main()
{
int choice = 0;
srand((unsigned int) time(NULL)); //电脑随机下棋
do
{
menu();
printf("\n请输入选择:> ");
scanf("%d", &choice);
switch (choice)
{
case 1:
game();
break;
case 0:
break;
default:
printf("\n输入错误!\n");
break;
}
} while (choice);
return 0;
}
test.c 函数定义的源文件
#include"game.h"
int IsFull(char board[ROW][COL], int row, int col) //平局
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
void InitBoard(char board[ROW][COL], int row, int col)
{
memset(board, ' ', row * col * sizeof(board[0][0]));
}
void PrintBoard(char board[ROW][COL], int row, int col)
{
printf("\n\n┌─┬─┬─┐\n");
for (int 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");
}
}
printf("└─┴─┴─┘\n");
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = 0;
int y = 0;
printf("\n玩家选择位置:> ");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
printf("\nPlayer Move:>\n");
board[x - 1][y - 1] = 'X';
break;
}
else
{
printf("坐标被占用!\n");
}
}
else
{
printf("坐标不合法!\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("\nComputer Move:>\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '0';
break;
}
}
}
char CheckWin(char board[ROW][COL], int row, int col)
{
if (IsFull(board, row ,col) == 1)
{
return 'Q';
}
for (int i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] == 'X')
{
return 'X';
}
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] == '0')
{
return '0';
}
}
for (int i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] == 'X')
{
return 'X';
}
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] == '0')
{
return '0';
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == 'X')
{
return 'X';
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '0')
{
return '0';
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == 'X')
{
return 'X';
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '0')
{
return '0';
}
return ' ';
}
总结一下,说是一个简单的三子棋程序真的是一个非常简单的。电脑毫无智商(其实用穷举写了一个聪明点的电脑但是想找一个更聪明的办法就没加进来),平局判断必须下完才能判断,其实有时候可以很早结束了。。。
接下来有时间会八这些 问题一一解决了,再扩展成五子棋吧,OVER。