小项目——三子棋

三子棋小项目

实现一个三子棋的项目
先来走走流程,看有些什么流程:
1、首先打印一个开始游戏的菜单,如下
开始游戏的界面
这个很好实现,不同的选项用switch case语句实现
2、然后进入游戏,需要打印一个棋盘
棋盘的界面
此处棋盘打印是用二维数组的方式实现,先需要一个3*3的二维数组,将所有元素都先置为空格然后在特定的位置上打印横线和竖线就可以,第一行打印出来 | | ,然后第二行打印—|---|—,第三行打印 | | ,第四行打印—|---|—,第五行打印 | | ,有相同打印的部分,所以可以用for循环实现

//打印棋盘
void ShowBoard(char board[][ROW], int row, int col)
{
	int i = 0;
	int j = 0;
	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 <  col - 1)
				{
					printf("|");//打印出来---|---|---
				}
			}
			printf("\n");
		}
	}
}

3、棋盘打印出来,玩家就可以开始移动了,首先玩家需要输入坐标,在自己想要的位置上放置棋子,然后玩家输入之后,需要判断当前位置是否被占用,如果占用,需要重新输入,没有占用的话,就放置棋子

//玩家移动
void PlayerMove(char board[][ROW], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家移动\n");
		printf("请输入1-3的坐标:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
		{
			if (board[x - 1][y - 1] == ' ')//判断当前玩家输入的坐标是否没有被占用
			{
				board[x - 1][y - 1] = 'x';
				break;
			}
			else
			{
				printf("位置被占用,请重新输入:\n");
			}
		}
		else
		{
			printf("坐标不合法\n");
		}
	}
}

4、玩家放置棋子之后,需要判断当前棋盘是否有人获胜,如果有人获胜,则返回获胜者;没有人获胜的话,则继续下面的游戏,且在判断获胜时,需要判断平局的问题,如果棋盘放满棋子,则是平局,如果没有平局,也没有人获胜,即只是正常下了一步棋,则继续进行游戏

//棋盘是否放满
static int IsFull(char board[][ROW], 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] == ' ')//遍历棋盘,如果有一个空格,则没有满,返回0
			{
				return 0;//没有满
			}
		}
	}
	return 1;//棋盘满了则返回1
}

//判断是否有人赢
char IsWin(char board[][ROW], 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];
		}
		//列满足
		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[0][0] != ' ')
		{
			return board[0][0];
		}
		if (board[0][2] == board[1][1] && board[1][1] == board[2][0]
			&& board[0][2] != ' ')
		{
			return board[0][2];
		}

		if (IsFull(board, ROW, ROW))//每下一步棋判断一次棋盘是否满了,满了则是平局
		{
			return 'Q';//平局
		}
	}
	return ' ';//谁也没有赢,继续执行
}

5、判断完成后,玩家正常下了一步棋之后,电脑开始下棋,电脑随机产生[0-3)的数字,即产生坐标,也同样需要判断当前产生的坐标是否是空格;然后放置棋子后,判断放满和获胜

//电脑移动
void ComputerMove(char board[][ROW], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑移动\n");
	while (1)
	{
		x = rand() % ROW;//随机生成[0-3)的数
		y = rand() % ROW;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'O';
			break;
		}
	}
}

6、正常下棋,只到有一方胜出或者是平局出现
具体代码:
需要三个文件,一个头文件,两个源文件
头文件中声名函数和一些宏定义
game.h

#ifndef   __GAME__H_
#define  __GAME__H_

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define COL 3
#define ROW 3

//初始化棋盘
void InitBoard(char board[][ROW], int row, int col, char set);
//打印棋盘
void ShowBoard(char board[][ROW], int row, int col);
//玩家移动
void PlayerMove(char board[][ROW], int row, int col);
//是否赢得了胜利
char IsWin(char board[][ROW], int row, int col);
//电脑移动
void ComputerMove(char board[][ROW], int row, int col);

#endif

一个源文件中是函数的具体代码
game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//初始化棋盘
void InitBoard(char board[][ROW], int row, int col, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < row; j++)
		{
			board[i][j] = set;//将每一个位置都置为' '
		}
	}
}

//打印棋盘
void ShowBoard(char board[][ROW], int row, int col)
{
	int i = 0;
	int j = 0;
	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 <  col - 1)
				{
					printf("|");//打印出来---|---|---
				}
			}
			printf("\n");
		}
	}
}

//玩家移动
void PlayerMove(char board[][ROW], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家移动\n");
		printf("请输入1-3的坐标:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
		{
			if (board[x - 1][y - 1] == ' ')//判断当前玩家输入的坐标是否没有被占用
			{
				board[x - 1][y - 1] = 'x';
				break;
			}
			else
			{
				printf("位置被占用,请重新输入:\n");
			}
		}
		else
		{
			printf("坐标不合法\n");
		}
	}
}

//棋盘是否放满
static int IsFull(char board[][ROW], 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] == ' ')//遍历棋盘,如果有一个空格,则没有满,返回0
			{
				return 0;//没有满
			}
		}
	}
	return 1;//棋盘满了则返回1
}

//判断是否有人赢
char IsWin(char board[][ROW], 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];
		}
		//列满足
		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[0][0] != ' ')
		{
			return board[0][0];
		}
		if (board[0][2] == board[1][1] && board[1][1] == board[2][0]
			&& board[0][2] != ' ')
		{
			return board[0][2];
		}

		if (IsFull(board, ROW, ROW))//每下一步棋判断一次棋盘是否满了,满了则是平局
		{
			return 'Q';//平局
		}
	}
	return ' ';//谁也没有赢,继续执行
}

//电脑移动
void ComputerMove(char board[][ROW], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑移动\n");
	while (1)
	{
		x = rand() % ROW;//随机生成[0-3)的数
		y = rand() % ROW;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'O';
			break;
		}
	}
}

另一个源文件中是游戏流程
Three_game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include "game.h"

void menu()
{
	printf("*******************\n");
	printf("******0.exit*******\n");
	printf("******1.play*******\n");
	printf("*******************\n");
}
void game()
{
	int ret = 0;
	char board[ROW][ROW] = { 0 };	//定义二维棋盘数组为0
	InitBoard(board, ROW, ROW,' ');//初始化棋盘函数,将棋盘全部设置为空格' '
	ShowBoard(board, ROW, ROW);//打印棋盘

	while (1)
	{
		PlayerMove(board, ROW, ROW);//玩家移动函数
		ret = IsWin(board, ROW, ROW);//玩家移动一步后判断是否胜利
		if (ret != ' ')//空格说明没有人胜出,只是正常走了一步而已
		{
			break;
		}
		ShowBoard(board, ROW, COL);
		ComputerMove(board, ROW, ROW);
		ret = IsWin(board, ROW, ROW);
		if (ret != ' ')
		{
			//可能平局,可能一方胜出
			break;
		}
		ShowBoard(board, ROW, ROW);
	}
	//判断ret
	if (ret == 'x')
	{
		printf("玩家胜出\n");
	}
	if (ret == ' O')
	{
		printf("电脑胜出\n");
	}
	if (ret == 'Q')
	{
		printf("平局\n");
	}
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入您的选择:—>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("游戏开始\n");
			game();
			break;
		case 0:
			printf("游戏退出\n");
			break;
		default:
			printf("请输入正确的操作\n");
			break;
		}
	} while (input);
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值