一.大体思路
先设置棋盘,玩家选择要走的坐标,电脑随机选择棋盘上空着的坐标,接着进行判断即可
1.首先我们需要一个棋盘,我们可以用一个二维字符数组来表示
char board[3][3] = { 0 };//定义一个字符数组作为棋盘
2.通过 InitBoard函数将其初始化
void InitBoard(char board[][ROW], int row, int col)
{
memset(board,' ',row*col*sizeof(char));//将数组初始化为空格
}
3.再通过ShowBoard将其打印出来
void ShowBoard(char board[][ROW], int row, int col)
{
printf("\n");
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("___");
printf("|");
}
}
else
{
for (j = 0; j < col; j++)
{
printf(" |");
}
}
printf("\n");
}
printf("\n");
}
4.如何下棋
(1)玩家下棋:玩家输入要走的坐标
void PlayerMove(char board[][ROW], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋!\n");
printf("请输入您下的位置(1-3):\n");
scanf("%d%d", &x, &y);
if (x > 0 && x < 4 && y>0 && y < 4)//判断输入的位置是否合法
{
if (board[x - 1][y - 1] ==' ')//判断该位置是否有棋子
{
board[x - 1][y - 1] = 'X';
break;
}
else
{
printf("该位置已有棋子!\n");
}
}
else
{
printf("输入不合法!");
}
}
}
(2)电脑下棋:调用库函数,产生随机坐标实现电脑玩
void ComputerMove(char board[][ROW], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋!\n");
while (1)
{
x = rand() % row;//产生随机坐标
y = rand() % col;
if (board[x ][y ] == ' ')//判断该位置是否有棋子
{
board[x ][y ] = 'Y';
break;
}
}
}
4.判断规则
1 如果棋盘没满,则一直继续下;
2 如果玩家下完之后,棋盘上横着、竖着、斜着有三个棋子连在一起,则玩家赢;
3 如果电脑下完之后,棋盘上横着、竖着、斜着有三个棋子连在一起,则电脑赢;
4 棋盘满了,但是还没有胜负,则平局。
二.源程序
1.game.h头文件
//game.h
#pragma once
#define GAME_H
#include<stdlib.h>
#include<time.h>
#include<String.h>
#define ROW 3
#define COL 3
//初始化棋盘
void InitBoard(char board[][ROW], int row, int col);
//打印棋盘
void ShowBoard(char board[][ROW], int row, int col);
//玩家移动
void PlayerMove(char board[][ROW], int row, int col);
//是否赢得了胜利
int IsWin(char board[][ROW], int row, int col);
//电脑移动
void ComputerMove(char board[][ROW], int row, int col);
//判断输赢
int IsWin(char board[][ROW], int row, int col);
//判断棋盘是否放满
int IsFull(char board[][ROW], int row, int col);
2.game.c文件
//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化棋盘
void InitBoard(char board[][ROW], int row, int col)
{
//int i = 0;
//int j = 0;
//for (i = 0; i < row; i++)
//{
// for (j = 0; j < col; j++)
// {
// board[i][j] = ' ';
// }
//}
memset(board, ' ', row*col * sizeof(char));//将数组初始化为0
}
//打印棋盘
void ShowBoard(char board[][ROW], int row, int col)
{
printf("\n");
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("___");
printf("|");
}
}
else
{
for (j = 0; j < col; j++)
{
printf(" |");
}
}
printf("\n");
}
printf("\n");
}
//玩家移动
void PlayerMove(char board[][ROW], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋!\n");
printf("请输入您下的位置(1-3):\n");
scanf("%d%d", &x, &y);
if (x > 0 && x < 4 && y>0 && y < 4)//判断输入的位置是否合法
{
if (board[x - 1][y - 1] == ' ')//判断该位置是否有棋子
{
board[x - 1][y - 1] = 'X';
break;
}
else
{
printf("该位置已有棋子!\n");
}
}
else
{
printf("输入不合法!");
}
}
}
//电脑移动
void ComputerMove(char board[][ROW], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋!\n");
while (1)
{
x = rand() % row;//产生随机坐标
y = rand() % col;
if (board[x][y] == ' ')//判断该位置是否有棋子
{
board[x][y] = 'Y';
break;
}
}
}
//判断输赢
int IsWin(char board[][ROW], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//横向判断
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
//纵向判断
else if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
//左对角线判断
else if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[1][1];
}
//右对角线判断
else if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
{
return board[1][1];
}
//判断棋盘是否放满
else if (IsFull(board, row, col == 1))
{
return 0;
}
}
return 1;
}
//判断棋盘是否放满
int IsFull(char board[][ROW], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//遇到空格即表示棋盘没满,返回0
if (board[i][j == ' '])
{
return 1;
}
}
}
return 0;//表示棋盘已放满棋子
}
3.test.c文件
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
//打印菜单
void menu()
{
printf("**********************\n");
printf("********0.exit********\n");
printf("********1.play********\n");
printf("**********************\n");
}
//游戏
void game()
{
int ret = 0;
char board[3][3] = { 0 };//定义数组作为棋盘
InitBoard(board, ROW, COL);//初始化棋盘
ShowBoard(board, ROW, COL);//打印棋盘
while (1)
{
PlayerMove(board, ROW, COL);//玩家下棋
ShowBoard(board, ROW, COL);//打印棋盘
ret = IsWin(board, ROW, COL);//每次都要判断是否赢了比赛
if (ret !=1)//结束游戏
{
break;
}
ComputerMove(board, ROW, COL);//电脑下棋
ShowBoard(board, ROW, COL); //打印棋盘
ret = IsWin(board, ROW, COL);//每次都要判断是否赢了比赛
if (ret != 1)//结束游戏
{
break;
}
}
if (ret == 'X')//玩家获胜,游戏结束
{
printf("玩家获胜\n");
}
if (ret == 'Y')//电脑获胜,游戏结束
{
printf("电脑获胜\n");
}
if (ret == 0)//平局,游戏结束
{
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//产生随机种子
do
{
menu();//打印菜单
printf("\n请选择你的操作:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("\n游戏开始!\n");
game();
break;
case 0:
printf("游戏退出!\n\n");
break;
default:
printf("请输入正确的数字:\n");
break;
}
} while (input);
return 0;
}
三.演示