#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<Windows.h>
#define ROW 3 //创建棋盘宽度
#define COL 3 //创建棋盘长度
#define RULE 3 //选择几子相连获胜
void c_excel(char Ex[ROW][COL], int row, int col);
void printExcel(char Ex[ROW][COL], int row, int col);
void myPlay(char Ex[ROW][COL], int row, int col);
void computerPlay(char Ex[ROW][COL], int row, int col);
char is_win(char Ex[ROW][COL], int row, int col, int rule);
geme.c文件
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void c_excel(char Ex[ROW][COL], int row, int col) //棋盘初始化
{
memset(Ex, ' ', row*col*sizeof(Ex[0][0]));
}
void printExcel(char Ex[ROW][COL], int row, int col) //打印棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", Ex[i][j]);
if (j < row - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
void myPlay(char Ex[ROW][COL], int row, int col) //玩家下棋
{
int a = 0;
int b = 0;
while (1)
{
scanf("%d%d", &a, &b);
if (a<1 || a>row || b<1 || b>col)
{
printf("非法坐标\n");
}
else if (Ex[a-1][b-1] != ' ')
{
printf("坐标已落子\n");
}
else if (Ex[a-1][b-1] == ' ')
{
Ex[a-1][b-1] = '*';
break;
}
}
}
void computerPlay(char Ex[ROW][COL], int row, int col) //电脑下棋
{
int a = 0;
int b = 0;
while (1)
{
a = rand() % row + 1;
b = rand() % col + 1;
if (Ex[a - 1][b - 1] == ' ')
{
Ex[a - 1][b - 1] = '#';
break;
}
}
}
static int win_1(char Ex[ROW][COL], int x, int y, int rule, char c) //横着相连获胜
{
int count = 0;
int i = 0;
int j = 0;
i = x;
for (j = 0; j < rule; j++)
{
if (Ex[i][y+j] == c)
count++; //若有目标棋子+1
}
return count; //返回目标棋子个数,是否与规则规定相同
}
static int win_2(char Ex[ROW][COL], int x, int y, int rule, char c) //判读竖着相连
{
int count = 0;
int i = 0;
int j = 0;
j = y;
for (i = 0; i < rule; i++)
{
if (Ex[x+i][j] == c) //若有目标棋子+1
count++;
}
return count; //返回目标棋子个数,是否与规则规定相同
}
static int win_3(char Ex[ROW][COL], int x, int y, int rule, char c) //判断对角线↘
{
int count = 0;
int i = 0;
int j = 0;
while (rule)
{
if (Ex[x + i][y + i] == c)
{
count++; //若有目标棋子+1
}
i++;
j++;
rule--;
}
return count; //返回目标棋子个数,是否与规则规定相同
}
static int win_4(char Ex[ROW][COL], int x, int y, int rule, char c) //判断对角线↙
{
int count = 0;
int i = 0;
int j = 0;
while (rule)
{
if (Ex[x + i][y + i] == c)
{
count++; //若有目标棋子+1
}
i++;
j--;
rule--;
}
return count; //返回目标棋子个数,是否与规则规定相同
}
static char is_full(char Ex[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 (Ex[i][j] == ' ')
return ' ';
}
}
return 'q';
}
char is_win(char Ex[ROW][COL], int row, int col, int rule)
{
int ret_1 = 0;
int ret_2 = 0;
char ret = 0;
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j <= col - rule; j++) //每一横排只需判断到列数减规则数个
{
ret_1 = win_1(Ex, i, j, rule,'*');
ret_2 = win_1(Ex, i, j, rule, '#');
if (ret_1 == rule)
return '*';
if (ret_2 == rule)
return '#';
}
}
for (i = 0; i <= row - rule; i++) //每一数列只需判断到列数减规则数个
{
for (j = 0; j < col; j++)
{
ret_1 = win_2(Ex, i, j, rule, '*');
ret_2 = win_2(Ex, i, j, rule, '#');
if (ret_1 == rule)
return '*';
if (ret_2 == rule)
return '#';
}
}
for (i = 0; i <= row - rule; i++) //判断↘,列从0开始,只需判断到列数减规则数个
{
for (j = 0; j <= col - rule; j++) //每一横排从0开始,只需判断到行数减规则数个
{
ret_1 = win_3(Ex, i, j, rule, '*');
ret_2 = win_3(Ex, i, j, rule, '#');
if (ret_1 == rule)
return '*';
if (ret_2 == rule)
return '#';
}
}
for (i = 0; i <= row - rule; i++) //判断↙,列从0开始,只需判断到列数减规则数个
{
for (j = rule - 1; j < col; j++) //每一列从规则数减一开始,到边界停止
{
ret_1 = win_4(Ex, i, j, rule, '*');
ret_2 = win_4(Ex, i, j, rule, '#');
if (ret_1 == rule)
return '*';
if (ret_2 == rule)
return '#';
}
}
ret = is_full(Ex, row, col); //判满
if (ret == 'q')
return ret;
return ' ';
}
主函数文件
在这里插入#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
printf("***********************\n");
printf("***** 1 . play *****\n");
printf("***** 0 . exit *****\n");
printf("***********************\n");
}
void game()
{
system("cls");
char ret = 0;
char excel[ROW][COL] = { 0 }; //设定存放棋盘内容数组
c_excel(excel, ROW, COL); //初始化棋盘
printExcel(excel, ROW, COL); //打印棋盘
while (1)
{
printf("玩家走:>");
myPlay(excel, ROW, COL); //玩家下棋
ret = is_win(excel, ROW, COL,RULE);
system("cls");
printExcel(excel, ROW, COL); //打印棋盘
if (ret != ' ')
break;
printf("电脑正在思考:\n");
computerPlay(excel, ROW, COL); //电脑下棋
Sleep(2000);
system("cls");
printExcel(excel, ROW, COL); //打印棋盘
ret = is_win(excel, ROW, COL, RULE);
if (ret != ' ')
break;
}
if (ret == '*')
printf("玩家胜\n");
if (ret == '#')
printf("电脑胜\n");
if (ret == 'q')
printf("平局\n");
}
int main()
{
srand((unsigned int)time(NULL));
int me = 0;
do
{
menu();
printf("请输入你的选择:>");
scanf("%d", &me);
switch(me)
{
case 1:
game();
break;
case 0:printf("成功退出\n"); break;
default:printf("输入错误,请重新输入\n");
}
} while (me);
system("pause");
return 0;
}