C语言简单实现三子棋游戏

本文实例为大家分享了C语言简单实现三子棋游戏的具体代码,供大家参考,具体内容如下

设计思路

1. 二维数组实现棋盘

2. 设计并打印出棋盘

3. 玩家先手

4. 每一次下棋后判断输赢

首先我们写出游戏的主函数,让玩家能自由选择开始游戏或者退出游戏。

int main()

{

int input = 0;

srand((unsigned int)time(NULL));//生成随机数用于电脑下棋

do

{

menu();//打印菜单

printf("请选择 >");

scanf("%d", &input);//玩家进行选择

switch (input)

{

case 1:

game();

break;

case 0:

printf("退出游戏\n");

break;

default:

printf("请正确输入\n");

break;

}

} while (input);

}

接下来我们看看游戏该怎样具体实现

首先确定我们的棋盘长度和宽度

我们希望能够将完整棋盘展示给玩家,所以我们通过以下方式来实现

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-1; j++)

{

printf("---|");

}

printf("---\n");

}

}

}

当我们下棋时,棋盘中最好时没有任何内容的,这样才能方便玩家使用

所以我们可以将棋盘中的内容先放入 “空格”

void InitBoard(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++)

{

board[i][j] = ' ';

}

}

}

为了更好区别玩家与电脑 ,我们采用两种不同符号来代表玩家与电脑(“*” 和“#”)

当我们思考玩家下棋时,我们会考虑到棋盘中原来的位置是否已经下过棋了,如果已经下过,我们又该怎样解决?

void PlayerMove(char board[ROW][COL], int row, int col)

{

printf("请输入坐标>\n");

int x = 0;

int y = 0;

while (1)

{

scanf("%d%d", &x,&y);

if (1<= x && x <=COL && 0 <= y && y <= ROW)

{

if (board[x-1][y-1] == ' ')

{

board[x-1][y-1] = '*';

break;

}

else

{

printf("坐标已被占用,请重新输入>\n");

}

}

else

{

printf("坐标不合法,请重新输入>\n");

}

}

}

电脑下棋我们又该如何实现呢?

void ComputerMove(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;

}

}

}

玩家或电脑下棋之后,如果已经成型,也就是“三子一线”,我们不能再继续游戏了,所以我们要考虑何时游戏结束,这里给出了我的判断函数。

char IsWin(char board[ROW][COL], int row, int col)

{

int x=0, y=0;

int z = 0;

for (x = 0; x < COL; x++)

{

int m = 0;//用于判断某一行

int n = 0;//用于判断某一列

int i = 0;//用于判断升斜线方向

int j = 0;//用于判断降斜线方向

for (y = 0; y < ROW; y++)

{

if (board[x][0] != ' '&&board[x][0] == board[x][y])

{

n++;

}

else if ( board[0][x] != ' '&&board[0][x] == board[y][x] )

{

m++;

}

if (board[x][y]==' ')

{

z++;

}

}

if ( board[0][0] != ' '&&board[0][0] == board[x][x])

{

i++;

}

if (board[ROW - 1][0] == board[ROW - 1 - x][x] && board[ROW-1][0] != ' ')

{

j++;

}

if (n == COL)

{

return board[x][0];

}

else if (m == ROW)

{

return board[0][x];

}

else if (i == COL)

{

return board[0][0];

}

else if (j == ROW)

{

return board[ROW - 1][0];

}

}

if (z == 0)

{

return z;

}

return 'C';

}

将这些函数做成我们的游戏函数

void menu()

{

printf("***************************\n");

printf("******** 1.play *********\n");

printf("******** 0.exit *********\n");

printf("***************************\n");

}

void game()

{

char board[ROW][COL];

InitBoard(board, ROW, COL);//棋盘初始化

DisplayBoard(board, ROW, COL);//展示初始棋盘

char ret = 0;

while (1)

{

PlayerMove(board, ROW, COL);//玩家下棋

DisplayBoard(board, ROW, COL);//棋盘展示

ret = IsWin(board, ROW, COL);//判断是否继续游戏

if (ret != 'C')

{

break;

}

ComputerMove(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");

}

}

到此我们的游戏就做好啦,让我们看看效果吧。

哈哈 我赢啦❗

最后是总体代码

game.h

#pragma once

#include<stdio.h>

#include <stdlib.h>

#include <time.h>

#define ROW 3

#define COL 3

//初始化棋盘

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 ComputerMove(char board[ROW][COL], int row, int col);

//判断输赢

char IsWin(char board[ROW][COL], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS

#include "game.h"

void InitBoard(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++)

{

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-1; j++)

{

printf("---|");

}

printf("---\n");

}

}

}

void PlayerMove(char board[ROW][COL], int row, int col)

{

printf("请输入坐标>\n");

int x = 0;

int y = 0;

while (1)

{

scanf("%d%d", &x,&y);

if (1<= x && x <=COL && 0 <= y && y <= ROW)

{

if (board[x-1][y-1] == ' ')

{

board[x-1][y-1] = '*';

break;

}

else

{

printf("坐标已被占用,请重新输入>\n");

}

}

else

{

printf("坐标不合法,请重新输入>\n");

}

}

}

void ComputerMove(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;

}

}

}

char IsWin(char board[ROW][COL], int row, int col)

{

int x=0, y=0;

int z = 0;

for (x = 0; x < COL; x++)

{

int m = 0;//用于判断某一行

int n = 0;//用于判断某一列

int i = 0;//用于判断升斜线方向

int j = 0;//用于判断降斜线方向

for (y = 0; y < ROW; y++)

{

if (board[x][0] != ' '&&board[x][0] == board[x][y])

{

n++;

}

else if ( board[0][x] != ' '&&board[0][x] == board[y][x] )

{

m++;

}

if (board[x][y]==' ')

{

z++;

}

}

if ( board[0][0] != ' '&&board[0][0] == board[x][x])

{

i++;

}

if (board[ROW - 1][0] == board[ROW - 1 - x][x] && board[ROW-1][0] != ' ')

{

j++;

}

if (n == COL)

{

return board[x][0];

}

else if (m == ROW)

{

return board[0][x];

}

else if (i == COL)

{

return board[0][0];

}

else if (j == ROW)

{

return board[ROW - 1][0];

}

}

if (z == 0)

{

return z;

}

return 'C';

}

三子棋.c

#define _CRT_SECURE_NO_WARNINGS

#include "game.h"

void menu()

{

printf("***************************\n");

printf("******** 1.play *********\n");

printf("******** 0.exit *********\n");

printf("***************************\n");

}

void game()

{

char board[ROW][COL];

InitBoard(board, ROW, COL);//棋盘初始化

DisplayBoard(board, ROW, COL);//展示初始棋盘

char ret = 0;

while (1)

{

PlayerMove(board, ROW, COL);//玩家下棋

DisplayBoard(board, ROW, COL);//棋盘展示

ret = IsWin(board, ROW, COL);//判断是否继续游戏

if (ret != 'C')

{

break;

}

ComputerMove(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");

}

}

int main()

{

int input = 0;

srand((unsigned int)time(NULL));//生成随机数用于电脑下棋

do

{

menu();//打印菜单

printf("请选择 >");

scanf("%d", &input);//玩家进行选择

switch (input)

{

case 1:

game();

break;

case 0:

printf("退出游戏\n");

break;

default:

printf("请正确输入\n");

break;

}

} while (input);

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 C语言简单实现三子棋游戏 的全部内容, 来源链接: utcz.com/p/246728.html

回到顶部