想输都难的三子棋小游戏

github
学了一段时间C语言编程了,一直在做些枯燥的数学题,是时候给自己打个气了。
今天一起编写一个三子棋的小游戏~(This sounds great)
首先放张图来让你的记忆翻滚起来吧

有没有感觉到特别的亲切! 好了回忆到此结束。
现在来实现这个游戏吧。
首先时头文件

//想输都难的三子棋小游戏

#ifndef __GAME_H__
#define __GAME_H__
//包含头文件
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//定义棋盘大小
#define ROW 3
#define COL 3
//声明初始化棋盘和展示棋盘函数
void Initboard(char board[ROW][COL], int row, int col);
void Displayboard(char board[ROW][COL], int row, int col);
//声明玩家和电脑落子函数
void computermove(char board[ROW][ROW],int row,int col);
void playermove(char board[ROW][ROW],int row,int col);
//声明判断胜负平的函数
int Isfull(char board[ROW][COL],int row,int col);
char Iswin(char board[ROW][COL],int row,int col);

#endif __GAME_H__

接下来就是测试部分了

#include "game1.h"

//菜单
void menu()
{
	printf("╔--------------╗\n");
	printf("║  1.开始游戏  ║\n");
	printf("╠--------------╣\n");
	printf("║  0.退出      ║\n");
	printf("╚--------------╝\n");
	printf("请选择:>\n");
}
//游戏实现
void game()
{	
	//定义一个3*3的二维数组作为棋盘
	char board[ROW][COL] = {0};
	char ret = 0;
	Initboard(board,ROW,COL);
	Displayboard(board,ROW,COL);
	//当没分出胜负或者棋盘没有落满时一直循环
	do
	{
	printf("电脑落子\n");
	computermove(board,ROW,COL);
	Displayboard(board,ROW,COL);
	//接受判断胜负的函数返回值并判断
	ret = Iswin(board,ROW,COL);
	if(ret != ' ')
	{
		break;
	}
	printf("玩家落子:>\n");
	playermove(board,ROW,COL);
	Displayboard(board,ROW,COL);
	ret = Iswin(board,ROW,COL);
	}
	//只要棋盘未满且没分出胜负就一直循环
	while(ret == ' ');
	//输出游戏结果
	if(ret == 'M')
	{
		printf("平局\n");
	}
	else if(ret == 'C')
	{
		printf("电脑赢\n");
	}
	else if(ret == 'P')
	{
		printf("玩家赢\n");
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		scanf("%d",&input);
		//将接收到的数字进行判断实现不同操作
		switch(input)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏!\n");
				break;
			default:
				printf("请重新输入!!!\n");
				break;
		}
	}
	//只要输入的值非0就一直循环
	while(input);
	return 0;
}

接下来就是游戏内部的每一步操作的实现了


#include "game1.h"
//初始化棋盘
void Initboard(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++)
		{
			board[i][j] = ' ';
		}
	}
}
//展示棋盘
void Displayboard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for(i=0; i<row; i++)
	{
		//打印棋盘每一行
		printf(" %c | %c | %c\n",board[i][0],board[i][1],board[i][2]); 
		if(i != row-1) //最后一行下面不输出(无边界)
		{
			printf("------------\n");
		}
	}
}
//电脑落子
void computermove(char board[ROW][ROW],int row,int col)
{
	int x = 0;
	int y = 0;
	//死循环直到合理落子
	while(1)
	{
		//在0,1,2三个数中随即生成
		x = rand(time)%ROW;
		y = rand(time)%COL;
		//判断若是棋盘位置无字则落子否则重新生成坐标
		if(board[x][y] == ' ')
		{
			board[x][y] = '*';
			break;
		}
	}
}
//玩家落子
void playermove(char board[ROW][ROW],int row,int col)
{
	int x = 0;
	int y = 0;
	//输入坐标
	scanf("%d%d",&x,&y);
	//判断坐标合理性
	if(x<4&&x>0&&y<4&&y>0)
	{   
		if(board[x-1][y-1] == ' ')
		{
			board[x-1][y-1] = 'o';
		}
		else if(board[x-1][y-1]!=' ')
		{
			printf("输入有误,请重新输入:\n");
			//若此坐标已有子调用自身重新输入坐标
			playermove(board,row,col);
		}
	}
	else
	{
		printf("输入有误,请重新输入:\n");
		//若输入错误调用自身重新输入坐标
		playermove(board,row,col);
	}
}

//棋盘下满
//逐行判断棋盘若有空位返回1,若已下满返回0
int Isfull(char board[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	for(x=0; x<row; x++)
	{
		for(y=0; y<col; y++)
		{
			if(board[x][y] == ' ')
				return 1;
		}
	}
	return 0;
}
//判断胜利
char Iswin(char board[ROW][COL],int row,int col)
{
	int tmp = 0;
	char ret = '0';
	int i = 0;
	//tmp接收Isfull函数返回值
	tmp = Isfull(board,row,col);
	//若棋盘下满返回'M',没下满返回' '
	if(tmp == 1)
	{
		ret = ' ';
	}
	else if(tmp == 0)
	{
		ret = 'M';
	}
	//判断是否满足获胜条件
	//电脑获胜返回'C' 玩家获胜返回'p'
	for(i=0; i<row; i++)
	{
		if(board[i][0]==board[i][1]&&board[i][1]==board[i][2])
		{
			if(board[i][0]=='*')
			{
				ret = 'C';
			}
			else if(board[i][0]=='o')
			{
				ret = 'P';
			}
			break;
		}
		
		if(board[0][i]==board[1][i]&&board[1][i]==board[2][i])
		{
			if(board[0][i]=='*')
			{
				ret = 'C';
			}
			else if(board[0][i]=='o')
			{
				ret = 'P';
			}
			break;
		}
	}
	if(board[0][0]==board[1][1]&&board[1][1]==board[2][2])
	{
		if(board[0][0]=='*')
			{
				ret = 'C';
			}
			else if(board[0][0]=='o')
			{
				ret = 'P';
			}
	}
	if(board[0][2]==board[1][1]&&board[1][1]==board[2][0])
	{
		if(board[0][2]=='*')
			{
				ret = 'C';
			}
			else if(board[0][2]=='o')
			{
				ret = 'P';
			}
	}
	return ret;
}

终于把所有的编写任务完成了,但是不能着急,现在还需要测试一遍才能保证自己的游戏可以开心愉快的玩。
在这里插入图片描述
哈哈哈,一切就绪,我已经忍不住开始玩了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值