栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言多子棋实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言多子棋实现

目录

前言

一、基本步骤

二、实现

1.初始化棋盘

2.打印棋盘

3.玩家下棋

4.电脑下棋

5.判断胜负

判断胜利(行)

判断胜利(列)

判断胜利(对角线)

判断平局

总代码

1.游戏头文件(game.h)

2.游戏源代码实现(game.c)

3.功能代码(test.c)


前言

C语言实现多子棋的想法和小细节,本文采用三子棋


一、基本步骤

1.简易菜单选择开始或结束

2.初始化棋盘

3.打印棋盘

4.玩家下棋,*代表玩家棋子

5.判断胜负

6.电脑下棋,#代表电脑棋子

7.判断胜负

8.循环4

二、实现

1.初始化棋盘

代码如下:把棋盘用空格代替

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] = ' ';
		}
	}
}

2.打印棋盘

代码如下:

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{

		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; j++)
			{
				printf("___");
				if(j 

3.玩家下棋
void Playeract(char board[ROW][COL], int row, int col,char tmp)
{
	int m, n;
	while(1)
	{
		printf("输入坐标:>");
		scanf("%d %d", &m, &n);
		if (m >= 1 && m <= row && n >= 1 && n <= col)//防止坐标超出棋盘范围
		{
			if (board[m-1][n-1] == ' ')
			{
				board[m-1][n-1] = tmp;
				break;
			}
			else
				printf("该坐标已被占用n");
		}
		else
			printf("坐标非法n");			
	}
}

4.电脑下棋
void Desktopact(char board[ROW][COL], int row, int col, char tmp)
{
	printf("电脑下棋:>n");
	while (1)
	{
		int m = rand() % row;//这里我们会在主函数用时间戳进行随机操作
                               srand((unsigned int)time(0))
		int n = rand() % col;
		if (board[m][n] == ' ')
		{
			board[m][n] = tmp;
			break;
		}
	}
}

5.判断胜负

玩家胜利返回 *

电脑胜利返回 #

平局返回        d(draw)

继续返回        c(con)

判断胜利(行)
for (i = 0; i < row; i++)
	{
		int sum = 0;
		for (j = 0; j < col - 1; j++)//注意这里j的范围
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] == '*')
			{
				sum++;//如果不想定义sum可以将棋盘扩大一圈,但这在每一个判断过程中涉及到一个初始化的问题,感兴趣可以实现
			}
		}
		if (sum == col - 1)//j+1=2时就可以遍历完一整行,否则会越界访问
			return board[i][j];
	}

判断胜利(列)

和行一行,不过要对行和列进行倒转操作

//列
	for (i = 0; i < col; i++)///想象将棋盘翻转90度,这一行的意义在于遍历每一列
	{
		int sum = 0;
		for (j = 0; j < row - 1; j++)
		{
			if (board[j][i] == board[j+1][i] && board[j][i] == '*')
			{
				sum++;
			}
		}
		if (sum == col - 1)
			return board[j][i];
	}

判断胜利(对角线)
//对角线
	int sum_x = 0;
	int sum_y = 0;
	for (i = 0; i < row - 1; i++)
	{		
		if (board[i][i] == board[i + 1][j + 1] && board[i][j] != ' ')
			sum_x++;
		else if (board[row-i-1][i] == board[row - i - 2][i+1] && board[row - i - 1][i] != ' ')
			sum_y++;
	}
	if (sum_x == row - 1)
		return board[i][j];
	if (sum_y == row - 1)
		return board[row - i - 1][i];
	if (Isfull(board, row, col) == 1)//判断平局
		return 'd';
		return 'c';
}

判断平局
int Isfull(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
if (Isfull(board, row, col) == 1)
		return 'd';
		return 'c';

棋盘满了返回d平局,反之返回c继续。


总代码

1.游戏头文件(game.h)
#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include 
#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 Playeract(char board[ROW][COL], int row, int col,char tmp);//玩家操作
void Desktopact(char board[ROW][COL], int row, int col,char tmp);//玩家操作
char Iswin(char board[ROW][COL], int row, int col);//判断输赢,返回值为    *玩家赢    #电脑赢     d平局      c继续
int Isfull(char board[ROW][COL], int row, int col);//判断棋盘是否空缺

2.游戏源代码实现(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 DisplayBoard(char board[ROW][COL], int row, int col)//打印
{
	int i, j;
	for (i = 0; i < row; i++)
	{

		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; j++)
			{
				printf("___");
				if(j");
		scanf("%d %d", &m, &n);
		if (m >= 1 && m <= row && n >= 1 && n <= col)
		{
			if (board[m-1][n-1] == ' ')
			{
				board[m-1][n-1] = tmp;
				break;
			}
			else
				printf("该坐标已被占用n");
		}
		else
			printf("坐标非法n");			
	}
}
void Desktopact(char board[ROW][COL], int row, int col, char tmp)//电脑下棋
{
	printf("电脑下棋:>n");
	while (1)
	{
		int m = rand() % row;
		int n = rand() % col;
		if (board[m][n] == ' ')
		{
			board[m][n] = tmp;
			break;
		}
	}
}
int Isfull(char board[ROW][COL], int row, int col)//判断棋盘容量
{
	int i, j;
	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, j;
	//行
	for (i = 0; i < row; i++)
	{
		int sum = 0;
		for (j = 0; j < col - 1; j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] == '*')
			{
				sum++;//如果不想定义count可以将棋盘扩大一圈,但这在每一个判断过程中涉及到一个初始化的问题,感兴趣可以实现
			}
		}
		if (sum == col - 1)
			return board[i][j];
	}
	//列
	for (i = 0; i < col; i++)///想象将棋盘翻转90度,这一行的意义在于遍历每一列
	{
		int sum = 0;
		for (j = 0; j < row - 1; j++)
		{
			if (board[j][i] == board[j+1][i] && board[j][i] == '*')
			{
				sum++;
			}
		}
		if (sum == col - 1)
			return board[j][i];
	}
	//对角线
	int sum_x = 0;
	int sum_y = 0;
	for (i = 0; i < row - 1; i++)
	{		
		if (board[i][i] == board[i + 1][j + 1] && board[i][j] != ' ')
			sum_x++;
		else if (board[row-i-1][i] == board[row - i - 2][i+1] && board[row - i - 1][i] != ' ')
			sum_y++;
	}
	if (sum_x == row - 1)
		return board[i][j];
	if (sum_y == row - 1)
		return board[row - i - 1][i];
	if (Isfull(board, row, col) == 1)
		return 'd';
		return 'c';
}


3.功能代码(test.c)
#include "game.h"
void menu()
{
	printf("*************************************n");
	printf("*************  1. play  *************n");
	printf("*************  0. exit  *************n");
	printf("*************************************n");
}
void game()
{
	printf("三子棋n");
	char board[ROW][COL] = { 0 };
	char tmp=0;
	InitBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		Playeract(board, ROW, COL, '*');
		tmp=Iswin(board, ROW, COL);
		if (tmp != 'c')
			break;
		Desktopact(board, ROW, COL, '#');
		tmp=Iswin(board, ROW, COL);
		if (tmp != 'c')
			break;
		DisplayBoard(board, ROW, COL);
	}
	if (tmp == '*')
		printf("玩家赢n");
	else if (tmp == '#')
		printf("电脑赢n");
	else if(tmp=='draw')
		printf("平局n");
}
void main()
{
	srand((unsigned int)time(NULL));
	int input;
	do
	{
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
				break;
		case 0:
			printf("游戏结束n");
			break;
		default:
			printf("输入错误,请重新输入n");
			break;
		}
	}
		while (input);
}

大家要注意return的返回字符,不能是字符串

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030258.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号