1

C语言实现井字棋

 2 years ago
source link: https://blog.51cto.com/u_15610396/5284241
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

C语言实现井字棋

原创

蛙蛙qaq 2022-05-09 17:55:56 博主文章分类:C语言 ©著作权

文章标签 数组 井字棋 三子棋 文章分类 C/C++ 编程语言 阅读数182

制作该游戏需要用到数组的相关知识,包括数组的设定、排列方式等。我们的这个游戏就是要将一个三行三列的数组制作成三子棋的棋盘,玩家下一棋打印一次判断是否达到胜利条件,然后电脑下一棋打印一次判断是否达到胜利条件,了解了具体的步骤之后,我们就可以将整体的框架搭建起来:

#include"game.h"
void menu()
{
printf("**************************\n");
printf("******1.play 0.exit****\n");
printf("**************************\n");
}
//游戏的算法实现
void game()
{
int ret = 0;
//数组存棋盘信息
char board[ROW][COL] = { 0 };
//初始化棋盘
InitBoard(board,ROW,COL);
//打印棋盘
DisplayBoard(board,ROW,COL);
//下棋
/*ComputerMore(board, ROW, COL);*/
//电脑下棋
while (1)
{
//玩家下棋
PlayerMove(board,ROW,COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//判断是否胜利
ret = IsWin(board,ROW,COL);
if (ret != 'C')
{
break;
}
//电脑下棋
ComputerMore(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//判断是否胜利
ret = IsWin(board,ROW,COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家胜利!\n");
}
else if (ret == '#')
{
printf("你输了\n");
}
else
{
printf("平局\n");
}
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,重新选择:>");
break;
}
} while (input);
}
int main()
{

test();
return 0;
}

将整体框架构建完成之后,我们在继续游戏主体的编译,我们在创立一个源文件来存放游戏主体算法的内容,首先先对棋盘进行初始化,并将棋盘打印,玩家需要输入坐标来达到下棋的目的,比如第一行第一列我们输入1 1,第二行第二列我们输入2 2,如果输入的坐标上已经被占用系统会提示”被占用“当电脑或者玩家完成三子连线的情况时,游戏胜利或失败,否则则为平局。具体代码如下:

#include"game.h"
//棋盘初始化
void InitBoard(char board[ROW][COL], 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] = ' ';
}
}
}
//棋盘打印
void DisplayBoard(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");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走");
while (1)
{
printf("请输入坐标");
scanf("%d%d", &x, &y);
//判断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("被占用");
}
}
else
{
printf("坐标不合理,请重新输入");
}
}
}

void ComputerMore(char board[ROW][COL], 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] = '#';
break;
}
}
}
int IsFull(char board[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 (board[i][j] == ' ')
return 0;
}
}
return 1;
}

char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
return board[2][0];
//判断是否平局
if (1 == IsFull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}

至此三子棋的全部内容编译完成,在创立一个头文件game.h来声明函数的应用。

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMore(char board[ROW][COL], int row, int col);

char IsWin(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);
//四种状态:
//玩家赢 --*
//电脑赢 --#
//平局 --Q
//继续 --C

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK