趣味C——如何用C语言编写三子棋小游戏

目录

游戏目的:

编写思路:

代码实现:

游戏目的

设计一个游戏菜单选择开始游戏,玩家和电脑依次下棋,如果其中一方在行,列或者对角线上连续连成三个,则为赢,如果棋盘下满还没有分出胜负,则为平局。

编写思路:

首先,编写一个选择开始游戏的菜单menu,选择1开始游戏,选择0则退出游戏;且每次游戏结束后可以继续选择开始或者退出。

要实现游戏目的,我们主要需要考虑一下几个方面:

1、存储棋盘数据的数组;

利用数组可以访问棋盘的各个位置,所以我们用二维字符数组arr来存储棋盘数据,并均令其为空字符

2、打印一个棋盘;

提前进行设计,利用循环依次打印成行和成列的分割线

3、玩家、电脑如何实现交替下棋(电脑随机下棋);

玩家下棋很好实现,用*表示玩家下的棋,让玩家输入一个符合条件的坐标,只要棋盘上的这个坐标处是空字符时,就可以下*;电脑下棋是同样的逻辑,只不过要实现随机下棋,和之前的猜数字小游戏一样,利用rand()产生随机数的方法来实现

4、怎样判断输赢

在下棋过程中,一共有以下4种情况

1、玩家赢

2、电脑赢

3、平局

4、继续

每一种情况下分别输出一个不同的字符,最后利用if语句实现判断输赢

代码实现:

以下用game.h文件来实现游戏编写过程中函数的声明;用game.c文件来实现具体函数的定义;用sanziqi.c文件来测试游戏的逻辑

game.h文件

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

#define ROW 3
#define COL 3


void menu();

void Initarr(char arr[ROW][COL],int row,int col);

void print1(char arr[ROW][COL],int row,int col);

void player_move(char arr[ROW][COL],int row,int col);

void computer_move(char arr[ROW][COL],int row,int col);

char is_win(char arr[ROW][COL],int row,int col);

game.c文件

#include "game.h"

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

void Initarr(char arr[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			arr[i][j]=' ';
		}
		printf("\n");
	}
}

void print1(char arr[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)
		{
			for(j=0;j<col;j++)
			{
				printf(" %c ",arr[i][j]);
				if(j<col)
				printf("|");
			}
			printf("\n");
			for(j=0;j<col;j++)
				{
						if(j<col)
						printf("---|");
				}
			printf("\n");
		}

}
				//printf("   |");


void player_move(char arr[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	printf("玩家:\n");
	while(1)
	{
	printf("请输入坐标:>");
	scanf("%d %d",&x,&y);
		if(x>=1&&x<=ROW && y>=1&&y<=COL)
		{
			if(arr[x-1][y-1]==' ')
			{
				arr[x-1][y-1]='*';
				break;
			}
			else
				printf("坐标被占用,请重新输入:>\n");
		}
		else
			printf("输入错误,请重新输入:>\n");
	}

}


void computer_move(char arr[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	printf("电脑:\n");
	while(1)
	{
	x=rand()%row;//0-2
	y=rand()%col;//0-2
	if(arr[x][y] == ' ')
		{
			arr[x][y]='#';//
			break;
		}
	}

}

static int if_full(char arr[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(arr[i][j]==' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char is_win(char arr[ROW][COL],int row,int col)
{
	//行
	int i=0;
	for(i=0;i<row;i++)
	{
		if(arr[i][0]==arr[i][1] && arr[i][1]==arr[i][2] && arr[i][1] != ' ')
		{
			return arr[i][1];//返回哪方的标志,就是哪方赢
		}
	}
	//列
	for(i=0;i<row;i++)
	{
		if(arr[0][i]==arr[1][i] && arr[1][i]==arr[2][i] && arr[1][i] != ' ')
		{
			return arr[1][i];
		}
	}
	//斜
	if(arr[0][0]==arr[1][1] && arr[1][1]==arr[2][2] && arr[1][1] != ' ')
	{
		return arr[1][1];
	}
	if(arr[2][0]==arr[1][1] && arr[1][1]==arr[0][2] && arr[1][1] != ' ')
	{
		return arr[1][1];
	}
	//如果棋盘下满了,就是平局
	if(if_full(arr,row,col) == 1)
	{
		return 'Q';
	}
	//如果以上条件都不满足,则继续
	return 'C';
}

sanziqi.c

#include<stdio.h>
#include "game.h"


void game()
{
	char ret=0;
					//存放棋盘数据
					char arr[ROW][COL]={0};
					//初始化棋盘
					Initarr(arr,ROW,COL);
					//打印棋盘
					print1(arr,ROW,COL);
					//开始玩儿游戏
	while(1)
	{
					//玩家下棋
					player_move(arr,ROW,COL);
					//打印棋盘
					print1(arr,ROW,COL);
					ret=is_win(arr,ROW,COL);
					if(ret !='C')
					{
						break;
					}
					//电脑下棋
					computer_move(arr,ROW,COL);
					//打印棋盘
					print1(arr,ROW,COL);
					ret=is_win(arr,ROW,COL);
						if(ret !='C')
						{
						break;
						}
	}
	if(ret == '*')
	{
		printf("玩家赢\n");
	}
	else if(ret == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}

}


void test()
{
		//用到的变量
	int input=0;
	int row=0;
	int col=0;
	int sz=0;
	//选择是否玩游戏,1开始,0退出;每次玩完之后都出现这个选择
	do{
			scanf("%d",&input);
				switch(input)
				{
				case 1:
					printf("开始游戏!\n");
					game();
					break;
				case 0:
					printf("退出游戏!\n");
					break;
				default:
					printf("输入错误,请重新输入\n");
					break;
				}

			}while(input);

}

int main()
{	
//开始游戏菜单
	menu();
	srand((unsigned int)time(NULL));
	test();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值