主代码段.c
#define _CRT_SECURE_NO_WARNINGS
#include"三子棋声明.h"
void game()
{
char board[ROWS][COLS];
char ret = 0;
int check = 1;
int findfirst = rand() % 2;
InitBoard(board, ROWS, ROWS);
PrintBoard(board, ROWS, COLS);
if (findfirst)
printf("玩家先手\n");
else
printf("电脑先手\n");
while (!findfirst)
{
ComputerMove(board, ROWS, COLS);
ret = IsWin(board, ROWS, COLS);
if (ret != 'C')
break;
PlayerMove(board, ROWS, COLS);
ret = IsWin(board, ROWS, COLS);
if (ret != 'C')
break;
}
while (findfirst)
{
PlayerMove(board, ROWS, COLS);
ret = IsWin(board, ROWS, COLS);
if (ret != 'C')
break;
ComputerMove(board, ROWS, COLS);
ret = IsWin(board, ROWS, COLS);
if (ret != 'C')
break;
}
switch (ret)
{
case'*':
printf("玩家赢\n");
break;
case'#':
printf("电脑赢\n");
break;
case'Q':
printf("平局\n");
break;
default:
printf("test error!\n");
break;
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请输入:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("三子棋游戏\n");
break;
case 0:
printf("quit\n");
break;
default:
printf("error\n");
break;
}
} while (!input);
game();
return 0;
}
自制函数.c
#define _CRT_SECURE_NO_WARNINGS
#include"三子棋声明.h"
void menu()
{
printf("***********************************\n");
printf("********* 1.play *********\n");
printf("********* 0.exit *********\n");
printf("***********************************\n");
}
void InitBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col;j++)
{
board[i][j] = ' ';
}
}
}
void PrintBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
else
printf("\n");
}
for (j = 0; j < col; j++)
{
if (i < row - 1)
{
printf("---");
if (j < col - 1)
printf("|");
else
printf("\n");
}
}
}
}
void PlayerMove(char board[ROWS][COLS], int row, int col)
{
while (1)
{
int x = 0, y = 0;
printf("玩家回合->:\n");
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("error\n");
}
else
printf("error\n");
}
PrintBoard(board, ROWS, COLS);
}
void ComputerMove(char board[ROWS][COLS], int row, int col)
{
printf("电脑回合->:\n");
int ret = 0;
ret = SmartCom(board, row, col);
while (ret)
{
int x = rand() % row;
int y = rand() % col;
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '#';
break;
}
}
PrintBoard(board, ROWS, COLS);
}
char IsWin(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col - 2; j++)
{
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j] != ' ')
return board[i][j];
}
}
for (j = 0; j < col; j++)
{
for (i = 0; i < row - 2; i++)
{
if (board[i][j] == board[i+1][j] && board[i+1][j] == board[i+2][j] && board[i][j] != ' ')
return board[i][j];
}
}
for (i = 0; i < row - 2; i++)
{
for (j = 0; j < col - 2; j++)
{
if (board[i][j] == board[i+1][j + 1] && board[i+1][j + 1] == board[i+2][j + 2] && board[i][j] != ' ')
return board[i][j];
}
}
for (i = row - 1; i > 1; i--)
{
for (j = col - 1; j > 1; j--)
{
if (board[i][j] == board[i-1][j-1] && board[i-1][j - 1] == board[i - 2][j - 2] && board[i][j] != ' ')
return board[i][j];
}
}
if (IsFull(board, row, col))
return 'Q';
return 'C';
}
int IsFull(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
int SmartCom(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 1; i < row ; i++)//检测左斜向,左上
{
for (j = 1; j < col; j++)
{
if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '#' && board[i - 1][j - 1] == ' ')
{
board[i - 1][j - 1] = '#';
return 0;
}
else if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '*' && board[i - 1][j - 1] == ' ')
{
board[i - 1][j - 1] = '#';
return 0;
}
}
}
for (i = 0; i < row - 1; i++)//检测左斜向,右下
{
for (j = 0; j < col - 1; j++)
{
if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '#' && board[i + 2][j + 2] == ' ') {
board[i + 2][j + 2] = '#';
return 0;
}
else if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '*' && board[i + 2][j + 2] == ' ') {
board[i + 2][j + 2] = '#';
return 0;
}
}
}
for (i = 0; i < row - 1; i++)//检测右斜向,左下
{
for (j = col - 1; j > 0; j--)
{
if (board[i][j] == board[i + 1][j - 1] && board[i][j] == '#' && board[i + 2][j - 2] == ' ') {
board[i + 2][j - 2] = '#';
return 0;
}
else if (board[i][j] == board[i + 1][j - 1] && board[i][j] == '*' && board[i + 2][j - 2] == ' ') {
board[i + 2][j - 2] = '#';
return 0;
}
}
}
for (i = 1; i < row; i++)//检测右斜向,右上
{
for (j = col - 2; j >= 0; j--)
{
if (board[i][j] == board[i + 1][j - 1] && board[i][j] == '#' && board[i - 1][j + 1] == ' ') {
board[i - 1][j + 1] = '#';
return 0;
}
else if (board[i][j] == board[i + 1][j - 1] && board[i][j] == '*' && board[i - 1][j + 1] == ' ') {
board[i - 1][j + 1] = '#';
return 0;
}
}
}
for (i = 1; i < row; i++)//检测竖向,上
{
for (j = 0; j < col; j++)
{
if (board[i][j] == board[i + 1][j] && board[i][j] == '#' && board[i - 1][j] == ' ') {
board[i - 1][j] = '#';
return 0;
}
else if (board[i][j] == board[i + 1][j] && board[i][j] == '*' && board[i - 1][j] == ' ') {
board[i - 1][j] = '#';
return 0;
}
}
}
for (i = 0; i < row - 1; i++)//检测竖向,下
{
for (j = 0; j < col; j++)
{
if (board[i][j] == board[i + 1][j] && board[i][j] == '#' && board[i + 2][j] == ' ') {
board[i + 2][j] = '#';
return 0;
}
else if (board[i][j] == board[i + 1][j] && board[i][j] == '*' && board[i + 2][j] == ' ') {
board[i + 2][j] = '#';
return 0;
}
}
}
for (i = 0; i < row; i++)//检测横向,左
{
for (j = 1; j < col; j++)
{
if (board[i][j] == board[i][j + 1] && board[i][j] == '#' && board[i][j - 1] == ' ') {
board[i][j - 1] = '#';
return 0;
}
else if (board[i][j] == board[i][j + 1] && board[i][j] == '*' && board[i][j - 1] == ' ') {
board[i][j - 1] = '#';
return 0;
}
}
}
for (i = 0; i < row; i++)//检测横向,右
{
for (j = 0; j < col-1; j++)
{
if (board[i][j] == board[i][j + 1] && board[i][j] == '#' && board[i][j + 2] == ' ') {
board[i][j + 2] = '#';
return 0;
}
else if (board[i][j] == board[i][j + 1] && board[i][j] == '*' && board[i][j + 2] == ' ') {
board[i][j + 2] = '#';
return 0;
}
}
}
for (i = 0; i < row; i++)//检测横向,中空
{
for (j = 1; j < col-1; j++)
{
if (board[i][j] == ' ' && board[i][j+1] == board[i][j-1] && board[i][j - 1] == '#') {
board[i][j] = '#';
return 0;
}
else if (board[i][j] == ' ' && board[i][j + 1] == board[i][j - 1] && board[i][j - 1] == '*') {
board[i][j] = '#';
return 0;
}
}
}
for (j = 0; j < col; j++)//检测纵向,中空
{
for (i = 1; i < row-1; i++)
{
if (board[i][j] == ' ' && board[i+1][j] == board[i - 1][j] && board[i - 1][j] == '#') {
board[i][j] = '#';
return 0;
}
else if (board[i][j] == ' ' && board[i + 1][j] == board[i - 1][j] && board[i - 1][j] == '*') {
board[i][j] = '#';
return 0;
}
}
}
for (i = 1; i < row-1; i++)//检测左斜,中空
{
for (j = 1; j < col - 1; j++)
{
if (board[i][j] == ' ' && board[i+1][j + 1] == board[i-1][j - 1] && board[i-1][j - 1] == '#') {
board[i][j] = '#';
return 0;
}
else if (board[i][j] == ' ' && board[i+1][j + 1] == board[i-1][j - 1] && board[i-1][j - 1] == '*') {
board[i][j] = '#';
return 0;
}
}
}
for (i = 1; i < row - 1; i++)//检测右斜,中空
{
for (j = col - 2; j > 0; j--)
{
if (board[i][j] == ' ' && board[i + 1][j - 1] == board[i - 1][j + 1] && board[i + 1][j - 1] == '#') {
board[i][j] = '#';
return 0;
}
else if (board[i][j] == ' ' && board[i + 1][j - 1] == board[i - 1][j + 1] && board[i + 1][j - 1] == '*') {
board[i][j] = '#';
return 0;
}
}
}
return 1;
}
三子棋声明.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 3
#define COLS 3
void menu();
void InitBoard(char board [ROWS][COLS], int row,int col);
void PrintBoard(char board[ROWS][COLS], int row, int col);
void PlayerMove(char board[ROWS][COLS], int row, int col);
void ComputerMove(char board[ROWS][COLS], int row, int col);
char IsWin(char board[ROWS][COLS], int row, int col);
int IsFull(char board[ROWS][COLS], int row, int col);
int SmartCom(char board[ROWS][COLS], int row, int col);
由于是新手,使用的语句比较初级,但至少实现了一个能作为对手的电脑和任意棋盘大小