c语言小游戏--三子棋

目录

一.问题描述

二.步骤

1.菜单界面

2.初始化棋盘

3.打印棋盘

4.玩家走

5.电脑走

6.判断输赢

三.结果演示

1.玩家赢

2.电脑赢

3.平局

四.完整代码 

一.问题描述

二.步骤

1.菜单界面

 2.初始化棋盘

3.打印棋盘

 4.玩家走

 5.电脑走

6.判断输赢

三.结果演示

1.玩家赢

2.电脑赢

3.平局

 四.完整代码



一.问题描述

用c语言实现三子棋


二.步骤

在写步骤之前,我们先看看游戏实现的逻辑

1.菜单开始界面选择开始游戏或退出游戏

2.创建一个二维数组的棋盘并初始化成空格

3.玩家选择坐标落子

4.判断输赢

5.电脑走

6.返回到步骤3

1.菜单界面

 输入1表示开始游戏

输入0退出

代码实现

void menu()
{
	printf("**********************\n");
	printf("********1. play*******\n");
	printf("********0. exit*******\n");
	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);
}

 2.初始化棋盘

将二维数组的棋盘全部初始化成空格

代码实现

void Init_Board(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++)
		{
			board[i][j] = ' ';
		}
	}
}

3.打印棋盘

void Display_Board(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++)
		{
			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 < col - 1)
					printf("|");					
			}			
		}
		printf("\n");
	}
}

打印效果展示:

 4.玩家走

玩家输入要走的坐标在打印到棋盘上

代码实现

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入要走的坐标:>");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标被占用!\n");
			}
		}
		else
		{
			printf("坐标非法请重新输入!\n");
		}
	}
}

 5.电脑走

电脑输入要走的坐标在打印到棋盘上

代码实现

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

6.判断输赢

ret用来存放每次下棋后的情况
什么情况,游戏结束
'*'  --玩家赢
'#'  --电脑赢
'Q'  --平局
'C'  --继续

代码实现

char is_win(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[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	int ret = is_full(board, ROW, COL);
	if ( ret== 0)
		return 'C';
	else
		return 'Q';
}

判断棋盘是否满用is_full函数

is_full 代码

int is_full(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;//满了
}

三.结果演示

1.玩家赢

2.电脑赢

3.平局


 四.完整代码

三子棋游戏一共分为三个文件,分别是test.c和game.c以及game.h

test.c文件存放的代码

#include "game.h"

void menu()
{
	printf("**********************\n");
	printf("********1. play*******\n");
	printf("********0. exit*******\n");
	printf("**********************\n");
}

void game()
{	
	char ret = 0;
	//ret用来存放每次下棋后的情况
	什么情况,游戏结束
	//'*'  --玩家赢
	//'#'  --电脑赢
	//'Q'  --平局
	//'C'  --继续
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	Init_Board(board, ROW, COL);
	//打印棋盘
	Display_Board(board, ROW, COL);
	//玩家走
	while (1)
	{
		//玩家走
		PlayerMove(board, ROW, COL);
		Display_Board(board, ROW, COL);		
		ret = is_win(board, ROW, COL);
		//判断输赢
		if (ret != 'C')
		{
			break;
		}
		//电脑走
		ComputerMove(board, ROW, COL);
		Display_Board(board, ROW, COL);
		ret = is_win(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.c存放的代码

#include "game.h"



void Init_Board(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++)
		{
			board[i][j] = ' ';
		}
	}
}



void Display_Board(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++)
		{
			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 < col - 1)
					printf("|");					
			}			
		}
		printf("\n");
	}
}


void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入要走的坐标:>");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= row && y > 0 && 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)
{
	printf("电脑走\n");
	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

int is_full(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 is_win(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[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	int ret = is_full(board, ROW, COL);
	if ( ret== 0)
		return 'C';
	else
		return 'Q';
}

game.h用于函数的声明

#define ROW 3
#define COL 3

#include<stdio.h>

//初始化棋盘
void Init_Board(char board[ROW][COL],int row, int col);
//打印棋盘
void Display_Board(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 is_win(char board[ROW][COL], int row, int col);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值