用c语言编写三子棋游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:本文章详细讲三子棋游戏程序的建立

目录

前言

一、代码展示

二、编写步骤

三   注意 

总结



一、代码展示

此为game.h的头文件 

#pragma once

//定义全局变量
#define hang 3
#define shu 3

//数组的初始化
void chu_shi(char add[hang][shu], int a, int b);

//棋盘的初始化
void qi_pan(char add[hang][shu], int a, int b);

//玩家走
void wan_jia(char add[hang][shu], int a, int b);

//电脑走
void dian_niao(char add[hang][shu], int a, int b);

//判断输赢
char shu_ying(char add[hang][shu], int a, int b);

 此为main函数

#include<stdio.h>

#include"game.h"

#include<time.h>

#include<stdlib.h>

void cai_dan()
{
	printf("************************\n");
	printf("*******1. 进入游戏*******\n");
	printf("*******0. 退出游戏*******\n");
	printf("************************\n");
}

void game()
{
	char add[hang][shu];

	//初始化数组
	chu_shi(add,hang,shu);

	//初始化棋盘
	qi_pan(add, hang, shu);

	while (1)
	{   
		//定义变量
		char s;

		//玩家走
		wan_jia(add,hang,shu);
		qi_pan(add, hang, shu);

		//判断输赢
		s = shu_ying(add,hang,shu);
		if (s != 'c')
			break;


		//电脑走
		dian_niao(add,hang,shu);
		qi_pan(add, hang, shu);

		//判断输赢
		s = shu_ying(add,hang,shu);
		if (s != 'c')
			break;
	}
}

void main()
{
	int num;
	srand((unsigned int)time(NULL));
	cai_dan();
	do
	{
		scanf_s("%d", &num);
		switch (num)
		{
		case 1:
			printf("开始游戏\n");
			game();
			cai_dan();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("输入错误\n");
			break;
		}
	} while (num);
}

此为game.c

#include<stdio.h>

#include"game.h"

#include<time.h>

#include<stdlib.h>

void chu_shi(char add[hang][shu], int a, int b)
{
	int i = 0;
	int j = 0;
	for (i=0; i < a; i++)
	{
		for (j=0; j < b; j++)
		{
			add[i][j] = ' ';
		}
	}
}

void qi_pan(char add[hang][shu], int a, int b)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < a; i++)
	{
		for (j = 0; j < b; j++)
		{
			printf("%c", add[i][j]);
			if(j<b-1)
			printf(" |");
		}
		printf("\n");
		if (i < a - 1)
		{
			for (j = 0; j < b; j++)
			{
				printf("--");
				if (j < b - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

void wan_jia(char add[hang][shu], int a, int b)
{
	printf("玩家走");
	int x;
	int y;
	while (1)
	{
		printf("\n请输入坐标");
		scanf_s("%d%d", &x, &y);
		if (x >= 1 && x <= a && y >= 1 && y <= b)
		{
			if (add[y - 1][x - 1] == ' ')
			{
				add[y - 1][x - 1] = '*';
				break;
			}
			else
			{
				printf("坐标已落子:");
			}
		}
		else
		{
			printf("坐标不合法:");
		}
	}}

void dian_niao(char add[hang][shu], int a, int b)
{
	printf("电脑走\n");
	while(1)
	{
		int x = rand() % hang;
		int y = rand() % shu;
		if (add[x][y] == ' ')
		{
			add[x][y] = '#';
			break;
		}
	}	
}

char shu_ying(char add[hang][shu], int a, int b)
{
	int i;
	for (i = 0; i < a; i++)
	{
		if (add[i][0] == '*' && add[i][1] == '*' && add[i][2] == '*')
		{
			printf("玩家赢:\n");
			return '*';
		}
	}

	for (i = 0; i < a; i++)
	{
		if (add[0][i] == '*' && add[1][i] == '*' && add[2][i] == '*')
		{
			printf("玩家赢:\n");
			return '*';
		}
	}

	if (add[0][0] == '*' && add[1][1] == '*' && add[2][2] == '*')
	{
		printf("玩家赢:\n");
		return '*';
	}

	if (add[0][2] == '*' && add[1][1] == '*' && add[2][0] == '*')
	{
		printf("玩家赢:\n");
		return '*';
	}
	for (i = 0; i < a; i++)
	{
		if (add[i][0] == '#' && add[i][1] == '#' && add[i][2] == '#')
		{
			printf("电脑赢:\n");
			return '#';
		}
	}

	for (i = 0; i < a; i++)
	{
		if (add[0][i] == '#' && add[1][i] == '#' && add[2][i] == '#')
		{
			printf("电脑赢:\n");
			return '#';
		}
	}

	if (add[0][0] == '#' && add[1][1] == '#' && add[2][2] == '#')
	{
		printf("电脑赢:\n");
		return '#';
	}

	if (add[0][2] == '#' && add[1][1] == '#' && add[2][0] == '#')
	{
		printf("电脑赢:\n");
		return '#';
	}
	int j;
	for (i = 0; i < a; i++)
	{
		for (j = 0; j < b; j++)
		{
			if (add[i][j] == ' ')
				return 'c';
		}
	}

	printf("平局");
	return 'k';
}

 

二、编写步骤

第一步.先进行main函数的编写。引入建立基础框架

void main()
{
	int num;
	cai_dan();
	do
	{
		scanf_s("%d", &num);
		switch (num)
		{
		case 1:
			printf("开始游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("输入错误\n");
			break;
		}
	} while (num);
}
void cai_dan()
{
	printf("************************\n");
	printf("*******1. 进入游戏*******\n");
	printf("*******0. 退出游戏*******\n");
	printf("************************\n");
}

 在此完成游戏基础界面的设计,同时对玩家操作进行限制,形成闭环,完成基础框架。

第二步  在编写代码之前要建立游戏运行的基础逻辑。再根据基础逻辑编写游戏的代码。

             在这里,我的基础逻辑是先建立游戏主函数game(),再在game()中建立

             游戏运行的逻辑。将game()添加到main(),完成循环,,再在game()                                 游戏运行的逻辑。

             

void main()
{
	int num;
	srand((unsigned int)time(NULL));
	cai_dan();
	do
	{
		scanf_s("%d", &num);
		switch (num)
		{
		case 1:
			printf("开始游戏\n");
			game();
			cai_dan();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("输入错误\n");
			break;
		}
	} while (num);
}

 

void game()
{
	char add[hang][shu];

	//初始化数组
	chu_shi(add,hang,shu);

	//初始化棋盘
	qi_pan(add, hang, shu);

	while (1)
	{   
		//定义变量
		char s;

		//玩家走
		wan_jia(add,hang,shu);
		qi_pan(add, hang, shu);

		//判断输赢
		s = shu_ying(add,hang,shu);
		if (s != 'c')
			break;


		//电脑走
		dian_niao(add,hang,shu);
		qi_pan(add, hang, shu);

		//判断输赢
		s = shu_ying(add,hang,shu);
		if (s != 'c')
			break;
	}
}

最后   在另一个.c文件中编写游戏的主体。

#include<stdio.h>

#include"game.h"

#include<time.h>

#include<stdlib.h>

void chu_shi(char add[hang][shu], int a, int b)
{
	int i = 0;
	int j = 0;
	for (i=0; i < a; i++)
	{
		for (j=0; j < b; j++)
		{
			add[i][j] = ' ';
		}
	}
}

void qi_pan(char add[hang][shu], int a, int b)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < a; i++)
	{
		for (j = 0; j < b; j++)
		{
			printf("%c", add[i][j]);
			if(j<b-1)
			printf(" |");
		}
		printf("\n");
		if (i < a - 1)
		{
			for (j = 0; j < b; j++)
			{
				printf("--");
				if (j < b - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

void wan_jia(char add[hang][shu], int a, int b)
{
	printf("玩家走");
	int x;
	int y;
	while (1)
	{
		printf("\n请输入坐标");
		scanf_s("%d%d", &x, &y);
		if (x >= 1 && x <= a && y >= 1 && y <= b)
		{
			if (add[y - 1][x - 1] == ' ')
			{
				add[y - 1][x - 1] = '*';
				break;
			}
			else
			{
				printf("坐标已落子:");
			}
		}
		else
		{
			printf("坐标不合法:");
		}
	}}

void dian_niao(char add[hang][shu], int a, int b)
{
	printf("电脑走\n");
	while(1)
	{
		int x = rand() % hang;
		int y = rand() % shu;
		if (add[x][y] == ' ')
		{
			add[x][y] = '#';
			break;
		}
	}	
}

char shu_ying(char add[hang][shu], int a, int b)
{
	int i;
	for (i = 0; i < a; i++)
	{
		if (add[i][0] == '*' && add[i][1] == '*' && add[i][2] == '*')
		{
			printf("玩家赢:\n");
			return '*';
		}
	}

	for (i = 0; i < a; i++)
	{
		if (add[0][i] == '*' && add[1][i] == '*' && add[2][i] == '*')
		{
			printf("玩家赢:\n");
			return '*';
		}
	}

	if (add[0][0] == '*' && add[1][1] == '*' && add[2][2] == '*')
	{
		printf("玩家赢:\n");
		return '*';
	}

	if (add[0][2] == '*' && add[1][1] == '*' && add[2][0] == '*')
	{
		printf("玩家赢:\n");
		return '*';
	}
	for (i = 0; i < a; i++)
	{
		if (add[i][0] == '#' && add[i][1] == '#' && add[i][2] == '#')
		{
			printf("电脑赢:\n");
			return '#';
		}
	}

	for (i = 0; i < a; i++)
	{
		if (add[0][i] == '#' && add[1][i] == '#' && add[2][i] == '#')
		{
			printf("电脑赢:\n");
			return '#';
		}
	}

	if (add[0][0] == '#' && add[1][1] == '#' && add[2][2] == '#')
	{
		printf("电脑赢:\n");
		return '#';
	}

	if (add[0][2] == '#' && add[1][1] == '#' && add[2][0] == '#')
	{
		printf("电脑赢:\n");
		return '#';
	}
	int j;
	for (i = 0; i < a; i++)
	{
		for (j = 0; j < b; j++)
		{
			if (add[i][j] == ' ')
				return 'c';
		}
	}

	printf("平局");
	return 'k';
}

三   注意 

在引用rand时,要注意其产生的随机值是伪随机值,所以引用了time,作为其的种子,从而达到其产生一个近似于随机值的效果。


总结

在编写程序时,一定要有模块化的思想,比如在上面的代码中,我将游戏主体分开来写,编写多个函数来实现其功能。模块化可以使代码更加清晰,可以更快的找到代码中的错误,同时避免了一处出错,整个程序都不能运行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值