【C语言项目】用C语言实现三子棋小游戏

 目录

框架

实现思路

实现菜单

实现棋盘

实现下棋行为

实现判断游戏状态

代码仓库


框架

首先我们先思考大概框架和功能。


实现思路

0.写一个菜单并实现玩完可以在玩一把。

1.从棋盘布局可以看出这里需要一个3*3的二维数组。

2.没下棋前数组存放空格,可以写一个函数负责将数组初始化为空格。

3.打印棋盘,只有空格的话我们什么也看不到,所以我们需要打印一些边界

4.玩家下棋,输入坐标要在范围内,并且只有空格时才能填入

5.电脑随机下棋,在范围内随机生成坐标并且空格才能下。

6.判断游戏状态(谁赢,平局,继续下),下一次棋就要判断一下。


实现菜单


实现棋盘

将棋盘初始化为空格,并做好边框打印出来。


实现下棋行为

  • 玩家下棋

  • 电脑下棋


实现判断游戏状态

每次下完棋要判断此时是什么状态,比如玩家赢,电脑赢,平局,继续下。

  • 赢的状态

赢需要判断列相同或行相同或对角线相同。然后返回对应字符判断谁赢。

判断行相同

写到后面我发现这里的判断条件写死了,也就是当我扩大棋盘的时候它还是连接三个就赢了,所以我重新改了代码。

判断列相同

同理,之前写死了,接下来是修改

判断对角线

同理,这里也需要改灵活一点

  • 平局

都没有相同就判断是否还有空位,有空位则继续下,没有则平局。


test.c

#include "Backgammon.h"

char board[ROW][COL] = { 0 };
void menu()
{
	printf("$$$$$$$$$$$$$$$\n");
	printf("$$$ 0.quit  $$$\n");
	printf("$$$ 1.start $$$\n");
	printf("$$$$$$$$$$$$$$$\n");
}
void game()
{
	InitBoard(board);
	Backgammon(board);
	char ret;
	while (1)
	{
		PlayerTurn(board);
		Backgammon(board);
		if ((ret=GameState(board)) != 'C') break;
		
		ComputerTurn(board);
		Backgammon(board);
		if ((ret=GameState(board)) != 'C') break;
	}
	if (ret == '*') printf("player win\n");
	else if (ret == '@') printf("computer win\n");
	else if (ret == 'D') printf("game draw\n");
}
int main()
{
	int select;
	srand((unsigned int)time(NULL));

	do
	{
		menu();
		printf("select:>");
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			game();
			break;
		case 0: 
			printf("game exit\n");
			break;
		default:
			printf("input invalid\n");
			break;
		}
	} while (select);
	return 0;
}

//bug记录:1.又忘记输入换行了。

backgammon.c

#include "Backgammon.h"

//初始化棋盘
void InitBoard(char _board[ROW][COL]) { for (int i = 0; i < ROW; i++) for (int j = 0; j < COL; j++) _board[i][j] = ' '; }
//打印棋盘
void Backgammon(char _board[ROW][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");
		for (int k = 0; k < COL; k++)
		{
			printf("---");
			if (k < COL - 1) printf("|");
		}
		printf("\n");
	}
}
//玩家下棋
void PlayerTurn(char _board[ROW][COL])
{
	while (1)
	{
		printf("player turn\nplease enter coordinates:>");
		int cod1, cod2;
		scanf("%d %d", &cod1, &cod2);
		if (cod1 >= 1 && cod1 <= ROW && cod2 >= 1 && cod2 <= COL && _board[cod1-1][cod2-1] == ' ')
		{
			_board[cod1-1][cod2-1] = '*';
			break;
		}
		else printf("coordinate err, please re-enter\n");
	}
}
//电脑下棋
void ComputerTurn(char _board[ROW][COL])
{
	while (1)
	{
		printf("<computer turn>\n");
		int cod1 = rand() % ROW;
		int cod2 = rand() % COL;
		if (_board[cod1][cod2] == ' ')
		{
			_board[cod1][cod2] = '@';
			break;
		}
	}
}
//判断棋盘是否还有位置, 有返回0,没有返回1
int isFull(char _board[ROW][COL])
{
	for (int i = 0; i < ROW; i++) for (int j = 0; j < COL; j++) if (_board[i][j] == ' ') return 0;
	return 1;
}
//判断游戏状态 通过返回字符判断谁赢
char GameState(char _board[ROW][COL])
{
	//判断行相同
	//一行一行开始
	for (int i = 0; i < ROW; i++)
	{
		//一行的相邻元素比较
		for (int j = 0; j < COL; j++)
		{
			//遍历完都没有结束证明这一行都相同
			if (j+1 == COL) return _board[i][0];
			//遇到不相同直接结束
			if (_board[i][0] == ' ' || _board[i][j] != _board[i][j + 1]) break;
		}
	}
	//判断列相同
	for (int j = 0; j < COL; j++)
	{
		for (int i = 0; i < ROW; i++)
		{
			if (i+1 == ROW) return _board[0][j];
			if (_board[0][j] == ' ' || _board[i][j] != _board[i + 1][j]) break;
		}
	}
	//两条对角线
	for (int i = 0; i < ROW; i++)
	{
		if (i+1 == ROW) return _board[0][0];
		if (_board[0][0] == ' ' || _board[i][i] != _board[i + 1][i + 1]) break;
	}
	for (int i = 0; i < ROW; i++)
	{
		if (i+1 == ROW || ROW-2-i < 0) return _board[0][ROW-1];
		if (_board[0][ROW - 1] == ' ' || _board[i][ROW - 1 - i] != _board[i + 1][ROW - 2 - i]) break;
	}
	//走到这里,行,列,对角线都不相同
	//判断棋盘是否还有空位,没空位就平局,有就继续下。
	if (isFull(_board)) return 'D';
	else return 'C';
}

//bug记录:1. _board[cod1][cod2],cod1和cod2需要减1。
//2.比较相等又少写了一个=。

backgammon.h

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define ROW 5
#define COL 5

//打印棋盘
void Backgammon(char _board[ROW][COL]);
//初始化棋盘
void InitBoard(char _board[ROW][COL]);
//玩家下棋
void PlayerTurn(char _board[ROW][COL]);
//电脑下棋
void ComputerTurn(char _board[ROW][COL]);
//判断游戏状态
char GameState(char _board[ROW][COL]);
//判断棋盘是否还有位置
int isFull(char _board[ROW][COL]);

//bug记录:1.char board[ROW][COL] = { 0 }不能放在头文件,有可能造成多重定义。

代码仓库

本棋盘比较灵活可实现三子棋,四子棋,多子棋等等。详细代码如下。

Backgammon/Backgammon · 林宇恒/code_c - 码云 - 开源中国 (gitee.com)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值