基本思路
- 初始化棋盘:
- 下棋:
- 判断输赢
实现
1、初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
memset(&board[0][0],' ',row*col*sizeof(board[0][0]));
}
2、打印棋盘
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ",board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
3、下棋
第一步:玩家走
void play_move(char board[ROW][COL], int row, int col,int n)
{
int x = 0, y = 0;
while (1)
{
printf("请玩家输入坐标:->");
scanf("%d%d",&x,&y);
if (x >=1 && x <= n&& y>=1 && y <=n && board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'X';
break;
}
else printf("输入错误请重新输入\n");
}
}
第二步:电脑走
void compture_move(char board[ROW][COL], int row, int col,int n)
{
while (1)
{
int x = rand() % n;
int y = rand() % n;
printf("电脑走\n");
if (board[x][y] == ' ')
{
board[x][y] = 'Y';
break;
}
}
}
4、判断输赢
char IF_WIN(char board[ROW][COL], int row, int col,int n )
{
int i = 0;
//判断行是否相等,如果相等返回此行第一个字符
for (i = 0; i < row; i++)
{
int j = 0;
int count = 0;
char ret = board[i][0];
for (j = 1; j < col; j++)
{
if (ret== board[i][j])
{
count++;
}
}if (count == n-1)
{
return board[i][0];
}
}
//判断列是否相等,如果相等返回此列第一个字符
for (i = 0; i < row; i++)
{
int j = 0, count = 0;
char ret = board[0][i];
for (j = 1; j < col; j++)
{
if (ret== board[j][i])
{
count++;
}
}
if (count == n-1)
{
return board[0][i];
}
}
//判断主对角线是否相等,如果相等返回此对角线第一个字符
for (i = 0; i < row; i++)
{
int j = 0, count = 0;
char ret = board[0][0];
for (j = i; j <= i; j++)
{
if (ret== board[i][j])
{
count++;
}
}
if (count == n-1)
{
return board[0][0];
}
}
//判断次对角线是否相等,如果相等返回此对角线第一个字符
for (i = 0; i < row; i++)
{
int j = 0, count = 0;
char ret = board[0][2];
for (j = 1-i; j <=1- i; j++)
{
if (ret==board[j][i])
{
count++;
}
}
if (count == n-1)
{
return board[0][2];
}
}
//判断平局
if (1 == is_full(board, ROW, COL))///调用is_full函数
{
return 'Q';
}
}
//判断棋盘是否已满
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
char ret = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
ret += board[i][j];
}
}
if (ret == (('X '*(row-1)*(col-1))+('Y '*(row-1)*(col-1)))
return 1;
}
主函数
#define _CRT_SECURE_NO_DEPRECATE 1
#include <stdio.h>
#include "game.h"
void game(char board[ROW][COL], int row, int col,int n)
{
char ch = { 0 };
init_board(board, ROW, COL);
print_board(board, ROW, COL);
while (1)
{
play_move(board, ROW, COL,n);
ch=IF_WIN(board, ROW, COL,n);
if ('X' == ch)
{
printf("玩家赢\n");
}
else if ('Y' == ch)
{
printf("电脑赢\n");
}
else if ('Q' == ch)
{
printf("平局\n");
}
print_board(board, ROW, COL);
compture_move(board, ROW, COL,n);
ch = IF_WIN(board, ROW, COL, n);
if ('X' == ch)
{
printf("玩家赢\n");
}
else if ('Y' == ch)
{
printf("电脑赢\n");
}
else if ('Q' == ch)
{
printf("平局\n");
}
print_board(board, ROW, COL);
}
}
int main()
{
char board[ROW][COL] = {0};
int input = 0;
int n = 0;
printf("请选择要玩的几子琪\n");
scanf("%d", &n);
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入选择:>\n");
scanf("%d", &input);
switch (input)
{
case 1:game(board,ROW,COL,n); break;
case 0:break;
default:printf("输入错误请,请重新输入:>"); break;
}
} while (input);
return 0;
}