C 语言 —— 三子棋

编写三子棋游戏。

游戏规则:“三子棋”顾名思义,在九宫格棋盘上当(横、竖、对角线)上三个棋子连成一条线,则为赢。

构思框架: 游戏菜单 、棋盘 、对弈过程(电脑、用户)、判断输赢。

三子棋代码

game.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _GAME_H_
#define _GAME_H_

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3
#define COL 3

void Initboard(char board[ROW][COL], int row, int col);
void Dispalyboard(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 Checkwin(char board[ROW][COL], int row, int col);

#endif

游戏应该有菜单页面供用户选择游戏或退出。

用户选择游戏时,必然能反复玩游戏,则使用循环来实现。

在循环体中,使用一个 switch 语句来接收用户的选择,选择“1”用户启动游戏程序,选择“0”用户退出游戏程序,而如果用户输入“0”“1”以外的值,则 default 则会报错请用户重新选择。

test.c

void menu()
{
	printf("**************************\n");
	printf("********* 1. paly ********\n");
	printf("********* 0. exit ********\n");
}
int main()
{
	int input = 0;
		do
		{
			menu();
			scanf("%d", &input);
			switch(input)
			{
			case 1:
				game();
				break;
			case 0:
				break;
			default:
				printf("选择错误!!");
				break;
			}
		}while (input);
		return 0;
}

接下来就是定义游戏中的数字棋盘,并输出棋盘。

game.c

//初始化函数
void main_board(char board[ROW][COL], int row, int col)
{
	memset(board, ' ', row*col);
	//用来设置内存中函数(指定内存地址,初始化内存大小)
}
//打印棋盘的函数
void Displayboard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i=0; i<row; i++)
	{
		printf("%c|%c|%c\n", board[i][0], board[i][1], board[i][2]);
		if(i != 2)
			printf("---|---|---\n");
	}
}

之后便是考虑电脑与用户该如何下棋了。

1.设置用户输入棋盘坐标即可。(同时要考虑到用户并不知道数组下标表示,则应将棋盘坐标设置在用户的认知范围内)

2.让电脑随机生成坐标(3*3以内的坐标值),并且不会与用户下棋的位置重复。

生成随机数则需要Srand函数,并且生成一次足够,引用time.h头文件。

//玩家
void Playermove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:");
		scanf("%d%d", &x, &y);
		x--;
		y--;
		if(((x>=0) && (x<=2)) && ((y>=0) && (y<=2)))
		{
			if(board[x][y] = ' ')
			{
				board[x][y] = 'x';
				break;
			}
			else
			{
				printf("输入有误!");
			}
		}
	}
}
//电脑
void Computermove(char board[ROW][COL], int row, int col)
{
	printf("电脑下:\n");
	while(1)
	{
		int x = rand()%3;
		int y = rand()%3;
		if (board[x][y] = ' ')
		{
			board[x][y] = '0';
				break;
		}
	}
}

在双方下完后,我们需要判断获胜的结果,则需Checkwin函数来检测并返回一个值来表示谁获胜,存在三种情况。
char Checkwin(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][1] != ' '))
			return board[i][1];
	}
	for (i=0; i<col; i++)
	{
		if((board[0][i] == board[0][i]) && (board[1][i] == board[2][i]) && (board[1][i] != ' '))
			return board[1][i];
	}
	if((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' '))
			return board[1][1];
	if((board[0][0] == board[1][1]) && (board[1][1] == board[2][0]) && (board[1][1] != ' '))
			return board[1][1];
	if(is_full(board, row, col))
	{
		return 'Q';
	}
	return ' ';
}
void game()
{
	int ret = 0;
	char board[ROW][COL] = {0};
	Initboard (board, ROW, COL);
	Dispalyboard(board, ROW, COL);
	Srand((unsigned int)time(NULL));
	while(1)
	{
		ret = Checkwin(board, ROW, COL);
		Playermove(board, ROW, COL);
		if(ret != ' ')
			break;
		Dispalyboard(board, ROW, COL);
		Computermove(board, ROW, COL);
		if(ret != ' ')
			break;
		Dispalyboard(board, ROW, COL);
	    if(ret = 'X')
		{
			printf("恭喜你!你赢了!\n");
	    }
	    else if (ret == '0')
		{
			printf("电脑赢!\n");
		}
		else if (ret == 'Q')
		{
			printf("平局\n");
		}
		Dispalyboard(board, ROW, COL);
	}

其中平局需要is_full函数判断棋盘是否下满,加上static仅在此源文件的函数中被使用。

static 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值