大家好!学习了那么久的c语言,我们都希望自己能做出一些成果来,而实现一些小游戏无疑是最先想到的选择。
今天我给大家介绍一个充满趣味和挑战的井字棋小游戏——三子棋。它是一款简单而又深思熟虑的游戏,通过在棋盘上放置符号,让先连成相同符号的三个一线,战胜对手。让我们一起来看看三子棋的规则、策略和实现吧!
在此处贴出各个函数对应位置,方便各位去进行查找
三子棋,又称井字棋,是一个两人对弈的棋盘游戏。游戏棋盘是一个3x3的方格矩阵,每个玩家轮流在空白的方格中放置自己的符号(通常是"X"和"O")。先连成三个相同符号的一线(横、竖或斜线),即可获胜。
下面是一个示意图,帮助我们更好地理解三子棋的规则:
1.我们首先打印游戏菜单
void menu()//打印菜单的函数
{
printf("*********************\n");
printf("******* 1. play *****\n");
printf("******* 0. exit *****\n");
printf("*********************\n");
}
效果如下:
2.初始化棋盘 我们可以使用一个3x3的二维数组来表示棋盘,初始值都设置为空格。可以定义一个函数来创建并初始化棋盘
void initBoard(char arr[ROW][COL], int a, int b)//初始化棋盘的函数
{
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
arr[i][j] = ' ';
}
}
}
3.打印棋盘 定义一个函数来打印当前的棋盘状态(该代码可随意改变棋盘大小)
void printBoard(char arr[ROW][COL], int row,int col)//打印棋盘的函数
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
for (int k = 0; k < col; k++)
{
printf("---");
if (k < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
4.提示玩家输入位置 定义一个函数来提示玩家输入要下棋的位置 ,同时检查输入的位置是否合法 定义一个函数来检查玩家输入的位置是否合法,即行和列的值都在0到2之间,并且该位置还没有被其他玩家占据
void Player(char arr[ROW][COL], int row, int col)
{
while (1)
{
printf("玩家进行下棋,请输入棋子所处坐标 \n");
int x, y;
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = 'o';
break;
}
printf("该位置已被占用,请输入其他坐标\n");
}
else
{
printf("输入错误,请重新输入");
}
}
}
5.电脑进行下棋(因为是初学者,没怎么学过算法,暂时使用随机数,日后会去学习使用miniMax算法进行改善),同理也要进行是否已被占用的判断
void Computer(char arr[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
while (1)
{
int x, y;
x = rand() % row;
y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = 'x';
break;
}
}
}
6.判断是否有玩家获胜 定义一个函数来判断是否有玩家连成一条线。我们需要检查每一行、每一列以及对角线上的棋子是否相同,如果有相同的棋子,则判定该玩家获胜,o表示玩家赢,x是电脑赢,c是平局,k是继续 。返回相应的字符更为方便
char Iswin(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
for (int i = 0; i < row; i++)//判断行
{
if (arr[i][0] == arr[i][1]&&arr[i][1]==arr[i][2] && arr[i][2] != ' ')
{
return arr[i][0];
}
}
for (int j = 0; j < col; j++)//判断列
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
{
return arr[0][j];
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[0][0];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
{
return arr[0][2];
}
if (isFull(arr,row,col))
{
return 'c';
}
return 'k';
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3//定义行和列均为3
void menu()//打印菜单的函数
{
printf("*********************\n");
printf("******* 1. play *****\n");
printf("******* 0. exit *****\n");
printf("*********************\n");
}
void initBoard(char arr[ROW][COL], int a, int b)//初始化棋盘的函数
{
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
arr[i][j] = ' ';
}
}
}
void printBoard(char arr[ROW][COL], int row,int col)//打印棋盘的函数
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
for (int k = 0; k < col; k++)
{
printf("---");
if (k < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
void Player(char arr[ROW][COL], int row, int col)
{
while (1)
{
printf("玩家进行下棋,请输入棋子所处坐标 \n");
int x, y;
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = 'o';
break;
}
printf("该位置已被占用,请输入其他坐标\n");
}
else
{
printf("输入错误,请重新输入");
}
}
}
void Computer(char arr[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
while (1)
{
int x, y;
x = rand() % row;
y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = 'x';
break;
}
}
}
int isFull(char arr[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
char Iswin(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
for (int i = 0; i < row; i++)//判断行
{
if (arr[i][0] == arr[i][1]&&arr[i][1]==arr[i][2] && arr[i][2] != ' ')
{
return arr[i][0];
}
}
for (int j = 0; j < col; j++)//判断列
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
{
return arr[0][j];
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[0][0];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
{
return arr[0][2];
}
if (isFull(arr,row,col))
{
return 'c';
}
return 'k';
}
void game()
{
char win ;
char board[ROW][COL]; //我们使用一个二维数组board来表示棋盘,每个格子可以存放一个字符,初始值为空格
initBoard(board, ROW, COL);//initBoard函数用来初始化棋盘
printBoard(board, ROW, COL);//printBoard函数用来打印棋盘
//开始下棋
while (1)
{
Player(board, ROW, COL);//玩家下棋
printBoard(board, ROW, COL);
win=Iswin(board, ROW, COL);//o表示玩家赢,x是电脑赢,c是平局,k是继续
if (win != 'k')
{
break;
}
Computer(board, ROW, COL); //电脑下棋
printBoard(board, ROW, COL);
if (win != 'k')
{
break;
}
}
if (win == 'o')
{
printf("玩家获胜\n");
}
else if (win == 'x')
{
printf("电脑获胜\n");
}
else
{
printf("平局\n");
}
}
int main()
{
int a = 1;
srand((unsigned int)time(NULL));
while (a)
{
printf("请选择:\n");
menu();
scanf("%d", &a);
switch (a)
{
case 1:
game();//开始游戏
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}
return 0;
}
三子棋小游戏是一款简单而又富有挑战性的游戏,它不仅能够帮助我们放松心情,还能够锻炼我们的思维能力。通过这篇文章的介绍,我们了解了三子棋小游戏的规则和实现方法。希望大家能够尝试玩一玩这款游戏,享受其中的乐趣和挑战!
今天的分享先到这里,感谢大家!!!