C语言实现简单的三子棋

三子棋游戏主要是利用二维数组进行操作,不断修改数组的值来进行游戏,主要由以下几个内容组成:

1.初始化数组,将数组都初始化为空格;

2.打印游戏界面,游戏界面不但要打印数组,还需要用横线竖线将每个元素隔开显示,即显示成表格状;

3.玩家走棋,先让玩家输入要走的坐标,判断玩家输入的坐标可以走后修改数组指定坐标的内容为X;

4.电脑走棋,电脑要随机走,先产生随机一个坐标,坐标不可走继续随机产生,直到产生一个可以走的坐标后,修改数组指定坐标的内容为0;

5.判断输赢,要判断输赢就要遍历整个数组,是否存在横向三颗棋相同、纵向三颗棋相同或斜向三颗棋相同,如果有则返回数组该坐标上的内容,若都没有再遍历数组查看是否存在空格可以走,有则返回'C'继续游戏,没有则返回'P'表示平局(改变判断输赢函数即可将该游戏改成任意子棋游戏,下面附上了五子棋的函数);

6.跑游戏,让游戏有序进行,玩家和电脑轮流走,每走一步判断一次游戏输赢。

头文件 game.h 用来声明各个功能函数,内容如下:

#ifndef __GAME_H__
#define __GAME_H__

#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>

#define ROW 3
#define COL 3

enum OPTION
{
	EXIT,
	PLAY
};

void InitBoard(char board[ROW][COL], int row, int col);      //初始化游戏面板,即给数组赋值
void DispalyBoard(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 CheckWin(char board[ROW][COL], int row, int col);       //判断玩家赢,电脑赢,平局还是继续游戏
void RunGame(char board[ROW][COL], char win);                //用来跑游戏,进行判断控制游戏进程,并能及时给出游戏结果

#endif // !__GAME_H__
源文件game.c用来存放各个函数的实现,内容如下:

#include "game.h"
//初始化游戏面板,即给数组赋值
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0;i < row;i++)
		for (j = 0;j < col;j++)
			board[i][j] = ' ';
}
//显示游戏界面
void DispalyBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0;i < row-1;i++)
	{
		for (j = 0;j < col-1;j++)
		{
			printf(" %c ", board[i][j]);
			printf("|");
		}
		printf(" %c ", board[i][j]);
		printf("\n");
		for (j = 0;j < col-1;j++)
		{
			printf("---|");
		}
		printf("---");
		printf("\n");
	}
	for (j = 0;j < col - 1;j++)
	{
		printf(" %c ", board[i][j]);
		printf("|");
	}
	printf(" %c ", board[i][j]);
	printf("\n");
}
//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x, y;
	printf("请输入坐标:>");
	scanf_s("%d %d", &x, &y);
	if (x >= 1 && x <= row&&y >= 1 && y <= col&&board[x - 1][y - 1] == ' ')
			board[x-1][y-1] = 'X';
	else
	{
		printf("输入坐标错误!\n");
		PlayerMove(board, ROW, COL);
	}
}
//电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x, y;
	srand(time(0));
	x = rand() % row;
	y = rand() % col;
	while (board[x][y] != ' ')
	{
		x = rand() % row;
		y = rand() % col;
	}
	board[x][y] = '0';
}
//判断玩家赢,电脑赢,平局还是继续游戏
char CheckWin(char board[ROW][COL], int row, int col)      //返回值为X表示赢的是玩家,返回值为0表示赢的是电脑
{
	int i, j;
	for (i = 0;i < row;i++)
		for (j = 0;j < col - 2;j++)
			if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j] != ' ')
				return board[i][j];
	for (i = 0;i < row - 2;i++)
		for (j = 0;j < col;j++)
			if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j] && board[i][j] != ' ')
				return board[i][j];
	for (i = 0;i < row - 2;i++)
		for (j = 0;j < col - 2;j++)
		{
			if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] && board[i][j] != ' ')
				return board[i][j];
			else if (board[i + 2][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i][j + 2] && board[i + 2][j] != ' ')
				return board[i + 2][j];
		}
	for (i = 0;i < row;i++)
		for (j = 0;j <= col;j++)
			if (board[i][j] == ' ')
				return 'C';              //这里的C是continue,返回C是还存在空格可以下,游戏继续
	return 'P';                          //这里的P是peace,返回P表示平局
}

//五子棋判输赢函数
//char CheckWin(char board[ROW][COL], int row, int col)      //返回值为X表示赢的是玩家,返回值为0表示赢的是电脑
//{
//	int i, j;
//	for (i = 0;i < row ;i++)
//		for (j = 0;j < col - 4;j++)
//			if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j + 2] == board[i][j + 3] && board[i][j + 3] == board[i][j + 4] && board[i][j] != ' ')
//				return board[i][j];
//	for (i = 0;i < row - 4;i++)
//		for (j = 0;j < col;j++)
//			if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j] && board[i + 2][j] == board[i + 3][j] && board[i + 3][j] == board[i + 4][j] && board[i][j] != ' ')
//				return board[i][j];
//	for (i = 0;i < row - 4;i++)
//		for (j = 0;j < col - 4;j++)
//		{
//			if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2]&& board[i + 2][j + 2] == board[i + 3][j + 3] && board[i + 3][j + 3] == board[i + 4][j + 4] && board[i][j]!=' ')
//				return board[i][j];
//			else if (board[i + 4][j] == board[i + 3][j + 1] && board[i + 3][j + 1] == board[i + 2][j + 2] && board[i + 2][j + 2] == board[i + 1][j + 3] && board[i + 1][j + 3] == board[i][j + 4] && board[i + 4][j]!=' ')
//			    return board[i + 4][j];
//		}
//	for (i = 0;i < row;i++)
//		for (j = 0;j <= col;j++)
//			if (board[i][j] == ' ')
//				return 'C';              //这里的C是continue,返回C是还存在空格可以下,游戏继续
//	return 'P';                          //这里的P是peace,返回P表示平局
//}

//用来跑游戏,进行判断控制游戏进程,并能及时给出游戏结果
void RunGame(char board[ROW][COL], char win)
{
	while (win == 'C')
	{
		PlayerMove(board, ROW, COL);
		win = CheckWin(board, ROW, COL);
		if (win == 'X')
		{
			DispalyBoard(board, ROW, COL);
			printf("玩家赢!\n");
			break;
		}
		else if (win == 'P')
		{
			DispalyBoard(board, ROW, COL);
			printf("平局!\n");
			break;
		}
		else if (win == 'C')
			ComputerMove(board, ROW, COL);
		win = CheckWin(board, ROW, COL);
		if (win == '0')
		{
			DispalyBoard(board, ROW, COL);
			printf("电脑赢!\n");
			break;
		}
		else if (win == 'P')
		{
			DispalyBoard(board, ROW, COL);
			printf("平局!\n");
			break;
		}
		DispalyBoard(board, ROW, COL);
	}
}
源文件test.c来存放主函数进行游戏测试,内容如下:

#include "game.h"
//显示游戏菜单
void menu()
{
	printf("*********************************\n");
	printf("*****  1.PLAY      0.EXIT   *****\n");
	printf("*********************************\n");

}
//游戏函数
void game()
{
	char win='C';
	char board[ROW][COL];
	InitBoard(board, ROW, COL);
	DispalyBoard(board, ROW, COL);
	RunGame(board, win);
}
//测试函数
void test()
{
	int input = 1;
	do
	{
		menu();
		printf("请输入选择:>");
		scanf_s("%d", &input);
		switch (input)
		{
		case PLAY:
			game();
		case EXIT:
			break;
		default:
			printf("选择错误!\n");
		}
	} while (input);
}
//主函数
int main()
{
	test();
	return 0;
}
游戏结果如下:




改变判输赢函数,并改变棋盘行ROW和列COL,将游戏改成简单五子棋游戏,效果如下:


注:该程序是在VS2015上完成的,将scanf写成了scanf_s,正常情况下写scanf即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值