三子棋游戏(含n子棋可用)

该文章描述了一个简单的棋盘游戏的C语言实现,包括初始化棋盘、玩家和电脑轮流下棋、判断输赢等功能。游戏通过main函数启动,用户可以选择开始或结束游戏。game()函数包含了游戏的主要逻辑,使用while循环进行玩家和电脑的回合,IsWin()函数用于判断游戏状态,包括玩家赢、电脑赢和平局。
摘要由CSDN通过智能技术生成

目录

 test.c部分

1 main函数运行

2  game()函数运行

game.h部分

1 说明 

game.c部分

1 棋盘初始化

2 棋盘打印

3 玩家下棋

4 电脑下棋

5 判读输赢


test.c部分

#define  _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void mean() {     
	printf("1 开始游戏\n");
	printf("0 结束游戏\n");
}
void game() {
	char board[ROW][COL];//定义一个二维数组
	Initboard(board, ROW, COL);//初始化棋盘
	printboard(board, ROW, COL);//打印棋盘
	char ret = 0;
	while (1)
	{
		PlayMove(board, ROW, COL);//玩家
		printboard(board, ROW, COL);

		ret = IsWin(board, ROW, COL);//判读输赢
		if (ret != 'C')
		{
			break;
		}

		ComputerMorve(board, ROW, COL);//电脑
		printboard(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
	{
		mean();//开始棋盘
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("选择错误,重来\n");
			break;
		}

	} while (input);//0为假 退出
}

 1 main函数运行

int  main() {
	int input = 0;
	srand((unsigned int)time(NULL));//随机数种子
	do
	{
		mean();//开始棋盘
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("选择错误,重来\n");
			break;
		}

	} while (input);//0为假 退出
}

用input来判断是否开始游戏        mean()为最开始的游戏选择界面如图所示,可自行更改

void mean() {     
	printf("1 开始游戏\n");
	printf("0 结束游戏\n");
}

        也在这里放置随机数种子,因为只要使用一次就行 

 2  game()函数运行 

void game() {
	char board[ROW][COL];//定义一个二维数组
	Initboard(board, ROW, COL);//初始化棋盘
	printboard(board, ROW, COL);//打印棋盘
	char ret = 0;
	while (1)
	{
		PlayMove(board, ROW, COL);//玩家
		printboard(board, ROW, COL);

		ret = IsWin(board, ROW, COL);//判读输赢
		if (ret != 'C')
		{
			break;
		}

		ComputerMorve(board, ROW, COL);//电脑
		printboard(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部分

1 说明 

#pragma once
#include<stdio.h>
#include<stdlib.h>//srand()
#include<time.h>//time()
#define ROW 3   //行
#define COL 3   //列
void Initboard(char board[ROW][COL], int row, int col);
void printboard(char board[ROW][COL], int row, int col);
void PlayMove(char board[ROW][COL],int row,int col);
void ComputerMorve(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL],int row,int col);

放置所需要的库函数和数字行和列的定义,方便随时修改,还放置game()函数中的所有函数的声明

game.c部分

#define  _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Initboard(char board[ROW][COL], int row, int col) {//初始化空格
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++) {
			board[i][j] = ' ';
		}
	}
}

void printboard(char board[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++)//   |   |   |
	{
		for (int j = 0; j < col; j++) {
			printf(" %c ", board[i][j]);
			if (j<col-1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1) //---|---|---|---
		{
			for (int j = 0; j < col; j++) {
				printf("---");
				if (j<col-1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
	
}

void PlayMove(char board[ROW][COL], int row, int col) {
	int x;
	int y;
	printf("玩家下棋:\n");
	while (1)
	{
		scanf("%d %d", &x, &y);
		//玩家下棋从1 1开始
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法
		{
			if (board[x - 1][y - 1] == ' ') { //判断坐标是否被占有
				board[x - 1][y - 1] = '*';
				break;  //结束的是while循环
			}
			else
			{
				printf("已落子,下别的\n");
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
}

void ComputerMorve(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;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

// # 电脑赢
// * 玩家赢
// Q 平局
// C 继续
char IsWin(char board[ROW][COL], int row, int col)
{
	//行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		int count = 0;
		for (j = 0; j < col - 1; j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
			{
				count++;
			}
			if (count == col - 1)
				return board[i][j];
		}

	}

	//列
	for (i = 0; i < col; i++)
	{
		int j = 0;
		int count = 0;
		for (j = 0; j < row - 1; j++)
		{
			if (board[j][i] == board[j + 1][i] && board[j][i] != ' ')
			{
				count++;
			}
			if (count == row - 1)
				return board[j][i];
		}
	}


	// '\' 
	for (i = 0; i < row - 1; i++)
	{
		if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ')
		{
			if (i == row - 2)
				return board[i][i];
		}
	}

	// '/'
	for (i = 0; i < row - 1; i++)
	{
		if (board[i][row - 1 - i] == board[i + 1][row - 2 - i] && board[i][row - 1 - i] != ' ')
		{
			if (row - 2 - i == 0)
				return board[i][row - 1 - i];
		}

	}

	//平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';
}

1 棋盘初始化

void Initboard(char board[ROW][COL], int row, int col) {//初始化空格
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++) {
            board[i][j] = ' ';
        }
    }
}

遍历数组,初始化为空格

2 棋盘打印

棋盘图像如下

 

void printboard(char board[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++)//   |   |   |
	{
		for (int j = 0; j < col; j++) {
			printf(" %c ", board[i][j]);
			if (j<col-1)//|比空格少一个
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1) //---|---|---|---  行之间的分割线比=行-1
		{
			for (int j = 0; j < col; j++) {
				printf("---");
				if (j<col-1)//|比---少一个
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
	
}

首先打印   |   |   |   每隔三个空格打印一个分割线,每行结束换行,打印两行之间的分割线---|---|---|---组合起来,然后换行

3 玩家下棋

void PlayMove(char board[ROW][COL], int row, int col) {
	int x;
	int y;
	printf("玩家下棋:\n");
	while (1)
	{
		scanf("%d %d", &x, &y);
		//玩家下棋从1 1开始
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法
		{
			if (board[x - 1][y - 1] == ' ') { //判断坐标是否被占有
				board[x - 1][y - 1] = '*';
				break;  //结束的是while循环
			}
			else
			{
				printf("已落子,下别的\n");
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
}

 因为玩家不是程序员,他们的坐标从 1 1 开始,我们的x和y在数组中就必须-1 ,还要判断坐标的合法和是否被占用,只用正确落子才会结束循环

4 电脑下棋

void ComputerMorve(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;
		}
	}

}

电脑下棋与玩家下棋相似,但是我们用随机数来表示坐标

5 判读输赢

这里算得上游戏的核心

int IsFull(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++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

// # 电脑赢
// * 玩家赢
// Q 平局
// C 继续
char IsWin(char board[ROW][COL], int row, int col)
{
	//行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		int count = 0;
		for (j = 0; j < col - 1; j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
			{
				count++;
			}
			if (count == col - 1)
				return board[i][j];
		}

	}

	//列
	for (i = 0; i < col; i++)
	{
		int j = 0;
		int count = 0;
		for (j = 0; j < row - 1; j++)
		{
			if (board[j][i] == board[j + 1][i] && board[j][i] != ' ')
			{
				count++;
			}
			if (count == row - 1)
				return board[j][i];
		}
	}


	// '\' 
	for (i = 0; i < row - 1; i++)
	{
		if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ')
		{
			if (i == row - 2)
				return board[i][i];
		}
	}

	// '/'
	for (i = 0; i < row - 1; i++)
	{
		if (board[i][row - 1 - i] == board[i + 1][row - 2 - i] && board[i][row - 1 - i] != ' ')
		{
			if (row - 2 - i == 0)
				return board[i][row - 1 - i];
		}

	}

	//平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值