c语言三子棋坐标输入方式,三子棋C语言实现-博客

本文介绍了一个简单的5*5棋盘四子棋游戏实现,包括游戏规则、玩家与电脑对战模式及核心代码。游戏通过C语言实现,支持双人对战和人机对战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然题目是三子棋,但是其实我实现的是5*5棋盘的4子棋玩法

废话不多说直接上代码

一共三个文件:

1.game.h 存放函数声明等

2.game.c 存放函数的定义(实现)

3.test.c 游戏主函数

game.h

#define _CRT_SECURE_NO_WARNINGS 1

#include

#include

#include

#include

#define ROW 6 //棋盘的行数

#define COL 6 //棋盘的列数

#define CHESS1 'O'//一号玩家的棋子形状

#define CHESS2 'X'//二号玩家的棋子形状

#define CHESSPC_P 'P'//玩家棋子形状

#define CHESSPC_C 'C'//电脑棋子形状

void Chess(char chess[ROW][COL], int row, int col);//初始化棋子数组(可以下棋的位置)

void ChessBroad(char chess[ROW][COL], int row, int col);//打印棋盘

void PlayerMove(char chess[ROW][COL], int row, int col, int n);//玩家下棋

void ComputerMove(char chess[ROW][COL], int row, int col);//电脑走

char Win(char chess[ROW][COL], int row, int col);//判断胜负

int Full(char chess[ROW][COL], int row, int col);//判断棋盘是否为满

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void Chess(char chess[ROW][COL], int row, int col) {

int i = 0;

int j = 0;

for (i = 0; i < row; i++)

for (j = 0; j < col; j++)

chess[i][j] = ' ';

}

void ChessBroad(char chess[ROW][COL], int row, int col) {

int i = 0;

int j = 0;

for (i = 0; i < row; i++) {

for (j = 0; j < col; j++) {

printf(" %c ", chess[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");

}

}

}

int r = 0;//玩家要下的行数

int c = 0;//玩家要下的列数

//我想用记录每次玩家落字的坐标这样每次判断只用判断该子所在的行列斜线是否达到获胜条件,但是我不会

void PlayerMove(char chess[ROW][COL], int row, int col, int n) {

while (1) {

switch (n) {

//1 2为玩家对战模式 0为玩家电脑对战模式

case 1:

case 2:

printf("请玩家 %d 下棋\n请输入您要下的位置(y,x)\n", n);

break;

case 0:

printf("请玩家下棋\n请输入您要下的位置(y,x)\n");

break;

}

scanf("%d %d", &r, &c);

if (r > 0 && r <= row && c > 0 && c <= col) {

if (chess[r - 1][c - 1] == ' ') {

if (n == 1)

chess[r - 1][c - 1] = CHESS1;

else if (n == 2)

chess[r - 1][c - 1] = CHESS2;

else if (n == 0)

chess[r - 1][c - 1] = CHESSPC_P;

system("cls");

break;

}

else {

system("cls");

printf("该位置已经有棋子了!请重新选择位置!\n");

ChessBroad(chess, ROW, COL);

}

}

else {

system("cls");

printf("请输入正确的棋盘位置!\n");

ChessBroad(chess, ROW, COL);

}

}

}

char Win(char chess[ROW][COL], int row, int col) {

int i = 0;

int j = 0;

//判断行

for (i = 0; i < row - 1; i++) {

for (j = 0; j < col + 1 - 4; j++) {

if (chess[i][j] == chess[i][j + 1] && chess[i][j + 1] == chess[i][j + 2] && chess[i][j + 2] == chess[i][j + 3] && chess[i][j] != ' ')

return 'W';

}

}

//判断列

for (i = 0; i < col - 1; i++) {

for (j = 0; j < row + 1 - 4; j++) {

if (chess[j][i] == chess[j + 1][i] && chess[j + 1][i] == chess[j + 2][i] && chess[j + 2][i] == chess[j + 3][i] && chess[j][i] != ' ')

return 'W';

}

}

//判断斜线 5*5 棋盘的 四子棋玩法判断

//!!不会写普遍的规律

if (chess[0][0] == chess[1][1] && chess[1][1] == chess[2][2] && chess[2][2] == chess[3][3] && chess[0][0] != ' ')

return 'W';

if (chess[1][1] == chess[2][2] && chess[2][2] == chess[3][3] && chess[3][3] == chess[4][4] && chess[1][1] != ' ')

return 'W';

if (chess[1][0] == chess[2][1] && chess[2][1] == chess[3][2] && chess[3][2] == chess[4][3] && chess[1][0] != ' ')

return 'W';

if (chess[0][1] == chess[1][2] && chess[1][2] == chess[2][3] && chess[2][3] == chess[3][4] && chess[0][1] != ' ')

return 'W';

if (Full(chess, row, col))//Full函数判断棋盘是否为满

return 'E';

}

int Full(char chess[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 (chess[i][j] == ' ')

return 0;

return 1;

}

void ComputerMove(char chess[ROW][COL], int row, int col) {

while (1) {

int x = rand() % col;

int y = rand() % row;

if (chess[y][x] == ' ') {

chess[y][x] = CHESSPC_C;

system("cls");

break;

}

}

}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void Menu1() {

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

printf("************** 三子棋**************\n");

printf("************请输入: 1 0************\n");

printf("**************1:start**************\n");

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

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

}

void Menu2() {

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

printf("****1. 自由 玩家对战 *******\n");

printf("*** 2. 自由 人机 *******\n");

printf("****0. 返回主菜单 *******\n");

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

}

void game() {

char Judge = 0;

char chess[ROW][COL] = { 0 };//这个数组存放可以下棋的位置,我们叫它棋子

Chess(chess, ROW, COL);//初始化棋子数组

ChessBroad(chess, ROW, COL);//打印棋盘

while (1) {

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

ChessBroad(chess, ROW, COL);

Judge = Win(chess, ROW, COL);//调用Win游戏输赢判断数

if (Judge == 'W') {//一号下完棋退出游戏的可能只能是一号获胜或者平局

printf("一号玩家取胜!\n");//两者都不是游戏继续

break;

}

else if (Judge == 'E') {

printf("平局\n");

break;

}

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

ChessBroad(chess, ROW, COL);

Judge = Win(chess, ROW, COL);

if (Judge == 'W') {//同理 二号玩家下完棋退出游戏的可能只能时 二号玩家取胜或者平局

printf("二号玩家取胜!\n");//否则 游戏继续

break;

}

else if (Judge == 'E') {

printf("平局\n");

break;

}

}

}

void game2() {

srand((unsigned)time(NULL));

char Judge = 0;

char chess[ROW][COL] = { 0 };

Chess(chess, ROW, COL);

ChessBroad(chess, ROW, COL);

while (1) {

PlayerMove(chess, ROW, COL, 0);

ChessBroad(chess, ROW, COL);

Judge = Win(chess, ROW, COL);

if (Judge == 'W') {

printf("玩家获胜!\n");

break;

}

else if (Judge == 'E') {

printf("平局!\n");

break;

}

ComputerMove(chess, ROW, COL);

ChessBroad(chess, ROW, COL);

Judge = Win(chess, ROW, COL);

if (Judge == 'W') {

printf("电脑获胜!\n");

break;

}

else if (Judge == 'E') {

printf("平局!\n");

break;

}

}

}

void test2() {

int InPut = 0;

do {

Menu2();

scanf("%d", &InPut);

switch (InPut) {

case 0:

break;

case 1:

game();//玩家

break;

case 2:

game2();//人机

break;

default:

printf("选择错误!请重新选择\n");

break;

}

} while (InPut);

}

void test1() {

int Input = 0;//菜单选项

do {

system("cls");

Menu1();//游戏菜单

scanf("%d", &Input);

switch (Input) {

case 1:

test2();//调用游戏程序

break;

case 0:

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

break;

default:

printf("选择错误,请重新选择!\n");

}

} while (Input);//0退出循环 其他输入继续循环

}

int main() {

test1();//菜单界面程序

return 0;

}

有什么指教问题可以在下面留言哦~

对您有帮助不妨点一个赞~

本帖子中包含资源

您需要 登录 才可以下载,没有帐号?立即注册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值