C语言之三子棋游戏

发布时间:2024年01月18日

test.c

#define _CRT_SECURE_NO_WARNINGS 1
//测试三子棋

#include"game.h"
void menu()
{
?? ?
?? ?printf("**********************************\n");
?? ?printf("***** ?1.play ? ?0.exit ? ? ? ****\n");
?? ?printf("**********************************\n");
}
void game()//游戏算法实现
{
?? ?char ret = 0;
?? ?//数组-存放走出的棋盘信息
?? ?char board[ROW][COL] = { 0 };//全部是空格
?? ?//初始化棋盘
?? ?InitBoard(board, ROW, COL);
?? ?//打印棋盘
?? ?DisplayBoard(board, ROW, COL);
?? ?//下棋
?? ?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");
?? ?}
}

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("退出游戏\n");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("选择错误,请重新选择!\n");
?? ??? ??? ?break;
?? ??? ?}
?? ?} while (input);
}
int main()
{
?? ?test();
?? ?return 0;
}


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

//告诉我们四种游戏的状态
//玩家赢 - '*'
//电脑赢 - '#'
//平局 ? - 'Q'
//继续下 - 'C'

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


game.c

#define _CRT_SECURE_NO_WARNINGS 1
#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++)
?? ?{
?? ??? ?//1.打印一行的数据
?? ??? ?//printf(" %c ?| %c ?| %c \n");
?? ??? ?//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
?? ??? ?int j = 0;
?? ??? ?for (j = 0; j < col; j++)
?? ??? ?{
?? ??? ??? ?printf(" %c ", board[i][j]);
?? ??? ??? ?if (j < col - 1)
?? ??? ??? ??? ?printf("|");
?? ??? ?}
?? ??? ?printf("\n");
?? ??? ?//2.打印分割行
?? ??? ?//if (i < row - 1)
?? ??? ?//{
?? ??? ?//?? ?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("玩家走:>\n");
?? ?//判断x,y坐标的合法性
?? ?while (1)
?? ?{
?? ??? ?printf("请输入要下的坐标:>\n");
?? ??? ?scanf("%d%d", &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("该坐标被占用\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;//产生了0到2之间的值
?? ??? ?y = rand() % COL;
?? ??? ?if (board[x][y] == ' ')
?? ??? ?{
?? ??? ??? ?board[x][y] = '#';
?? ??? ??? ?break;
?? ??? ?}
? ? }
}
//返回1表示棋盘满了
//返回0表示棋盘没满

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][0] != ' ')
?? ??? ?{
?? ??? ??? ?return board[i][0];
?? ??? ?}
?? ?}
?? ?//判断竖三列
?? ?for (i = 0; i < col; i++)
?? ?{
?? ??? ?if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
?? ??? ?{
?? ??? ??? ?return board[0][i];
?? ??? ?}
?? ?}
?? ?//两个对角线
?? ?if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
?? ??? ?return board[0][0];
?? ?if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
?? ??? ?return board[0][0];
?? ?//判断是否平局
?? ?if(IsFull(board, ROW, COL))
?? ? {
?? ??? ?return 'Q';
?? ? }
?? ?return 'C';

}

文章来源:https://blog.csdn.net/2301_80300263/article/details/135670378
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。