C语言实现三子棋游戏----不聪明的电脑玩家

C语言实现三子棋游戏----不聪明的电脑玩家,第1张

文章目录
  • 前言
  • 一、游戏代码
  • 1.test.c游戏代码测试
  • 2.game.c游戏代码实现
  • 3.game.h游戏代码声明
    • 二、完整代码
  • 总结


前言

今天,我们用C语言来写一个小游戏----三子棋,就是我们常说的井字棋游戏。

整体逻辑
1.打印菜单
2.玩游戏
3.退出游戏

按照工程的逻辑,我们需要有一个test.c的源文件来测试代码,game.c的源文件来实现游戏代码,game.h的头文件来声明游戏代码


一、游戏代码
整体逻辑
1.有一个二维数组,来模拟棋盘。
2.初始化棋盘
3.打印棋盘
4.玩家下棋
5.电脑下棋
6.判断输赢
1.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()
{
	//首先要有一个二维数组表示棋盘
	int arr[ROW][COL] = { 0 };
	//初始化数组
	Init_Arr(arr, ROW, COL);
	//打印棋盘
	DisplayBoard(arr, ROW, COL);
	//开始下棋 
	while (1)
	{
		//玩家下棋
		PlayerMove(arr, ROW, COL);
		DisplayBoard(arr, ROW, COL);
		if (Judge_WinorLose(arr, ROW, COL) != 2)
			break;
		//电脑下棋
		ComputerMove(arr, ROW, COL);
		DisplayBoard(arr, ROW, COL);
		if (Judge_WinorLose(arr, ROW, COL) != 2)
			break;
	}
	//玩家赢 -- 1
	//电脑赢 -- -1
	//平局 -- 0
	if (Judge_WinorLose(arr, ROW, COL) == 1)
		printf("玩家获胜\n");
	else if (Judge_WinorLose(arr, ROW, COL) == -1)
		printf("电脑获胜\n");
	else
		printf("平局\n");
}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}
2.game.c游戏代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘
void Init_Arr(int arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}
//打印棋盘
void DisplayBoard(int arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//打印行
	for (i = 0; i < row; i++)
	{
		//printf(" %c | %c | %c \n", arr[i][0],arr[i][1],arr[i][2]);
		//打印列
		for (j = 0; j < col; j++)
		{
			printf(" %c ", arr[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");
		}
		/*if(i<2)
			printf("---|---|---\n");*/
	}
}
//玩家下棋
void PlayerMove(int arr[ROW][COL], int row, int col)
{
	//首先要有两个坐标
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");
	while (1)
	{
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		//判断坐标是否合法
		if (x>=1 && x <= ROW && y>=1 && y <= COL && arr[x-1][y-1]==' ')
		{
			arr[x - 1][y - 1] = '*';
			break;
		}
		else
		{
			printf("该坐标不合法,请重新输入\n");
		}
	}
}
//电脑下棋  电脑下棋的坐标是随机产生的,并且没有进行其余别的判断,只要这个坐标没有被下过棋,电脑就会下在这里,因此这个电脑很笨
void ComputerMove(int arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}
	}
}
//判断输赢
int Judge_WinorLose(int arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	int count = 0;
	//判断横线
	for (i = 0; i < row; i++)
	{
		if (arr[i][0] == '*' && arr[i][1] == '*' && arr[i][2] == '*')
			return 1;
		if (arr[i][0] == '#' && arr[i][1] == '#' && arr[i][2] == '#')
			return -1;
	}
	//判断竖线
	for (i = 0; i < row; i++)
	{
		if (arr[0][i] == '*' && arr[1][i] == '*' && arr[2][i] == '*')
			return 1;
		if (arr[0][i] == '#' && arr[1][i] == '#' && arr[2][i] == '#')
			return -1;
	}
	//判断斜线
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] == '*')
	{
		return 1;
	}
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] == '#')
	{
		return -1;
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] == '#')
	{
		return -1;
	}
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] == '*')
	{
		return 1;
	}
	//判断是否为平局
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				count++;
		}
	}
	if (count == 0)
		return 0;
	return 2;
}
3.game.h游戏代码声明
#pragma once

#include
#include
#include

#define ROW 3
#define COL 3

//初始化数组
void Init_Arr(int arr[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(int arr[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(int arr[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(int arr[ROW][COL], int row, int col);
//判断输赢
int Judge_WinorLose(int arr[ROW][COL], int row, int col);

二、完整代码
#pragma once

#include
#include
#include

#define ROW 3
#define COL 3

//初始化数组
void Init_Arr(int arr[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(int arr[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(int arr[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(int arr[ROW][COL], int row, int col);
//判断输赢
int Judge_WinorLose(int arr[ROW][COL], int row, int col);

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void Init_Arr(int arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void DisplayBoard(int arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//打印行
	for (i = 0; i < row; i++)
	{
		//printf(" %c | %c | %c \n", arr[i][0],arr[i][1],arr[i][2]);
		//打印列
		for (j = 0; j < col; j++)
		{
			printf(" %c ", arr[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");
		}
		/*if(i<2)
			printf("---|---|---\n");*/
	}
}

void PlayerMove(int arr[ROW][COL], int row, int col)
{
	//首先要有两个坐标
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");
	while (1)
	{
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		//判断坐标是否合法
		if (x>=1 && x <= ROW && y>=1 && y <= COL && arr[x-1][y-1]==' ')
		{
			arr[x - 1][y - 1] = '*';
			break;
		}
		else
		{
			printf("该坐标不合法,请重新输入\n");
		}
	}
}

void ComputerMove(int arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}
	}
}

int Judge_WinorLose(int arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	int count = 0;
	//判断横线
	for (i = 0; i < row; i++)
	{
		if (arr[i][0] == '*' && arr[i][1] == '*' && arr[i][2] == '*')
			return 1;
		if (arr[i][0] == '#' && arr[i][1] == '#' && arr[i][2] == '#')
			return -1;
	}
	//判断竖线
	for (i = 0; i < row; i++)
	{
		if (arr[0][i] == '*' && arr[1][i] == '*' && arr[2][i] == '*')
			return 1;
		if (arr[0][i] == '#' && arr[1][i] == '#' && arr[2][i] == '#')
			return -1;
	}
	//判断斜线
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] == '*')
	{
		return 1;
	}
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] == '#')
	{
		return -1;
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] == '#')
	{
		return -1;
	}
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] == '*')
	{
		return 1;
	}

	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				count++;
		}
	}
	if (count == 0)
		return 0;
	return 2;
}

void menu()
{
	printf("**************************\n");
	printf("**** 1.play    0.exit ****\n");
	printf("**************************\n");
}
//实现游戏
void game()
{
	//首先要有一个二维数组表示棋盘
	int arr[ROW][COL] = { 0 };
	//初始化数组
	Init_Arr(arr, ROW, COL);
	//打印棋盘
	DisplayBoard(arr, ROW, COL);
	//开始下棋 
	while (1)
	{
		//玩家下棋
		PlayerMove(arr, ROW, COL);
		DisplayBoard(arr, ROW, COL);
		if (Judge_WinorLose(arr, ROW, COL) != 2)
			break;
		//电脑下棋
		ComputerMove(arr, ROW, COL);
		DisplayBoard(arr, ROW, COL);
		if (Judge_WinorLose(arr, ROW, COL) != 2)
			break;
	}
	//玩家赢 -- 1
	//电脑赢 -- -1
	//平局 -- 0
	if (Judge_WinorLose(arr, ROW, COL) == 1)
		printf("玩家获胜\n");
	else if (Judge_WinorLose(arr, ROW, COL) == -1)
		printf("电脑获胜\n");
	else
		printf("平局\n");
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}


总结

以上就是我们用C语言实现的三子棋小游戏,这个游戏还有很多可以优化的地方,比如可以让电脑变的聪明一点。如果大家有兴趣,可以自行下去尝试一下。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/893201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存