C语言小游戏第一弹——三子棋(简易版)

 

想要完成简易版三子棋预备知识有:分支与循环,函数,数组,vs等编译器的运用。

以下代码环境是vs2022。

准备好了嘛?好哒,接下来开始学写吧!

第一步:建立一个空项目后,建立一个头文件game.h,再建立两个源文件game.h 和test.h。

 

game.h是为了声明所有函数,test.c是为了测试及实现游戏,game.c是将所有函数存放在这里。分成三个文件易于修改,阅读。

第二步:在game.h中写出所需所有库函数和声明所用的函数。

#pragma once//防止宏名相同出错,具体可查csdn搜其作用
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//电脑下棋生成随机数时使用
#define HANG 3
#define LIE 3
void qipan(char b[HANG][LIE], int hang, int lie);//初始化二维数组(棋盘),使其每一个值都是空格
void xianshiqipan(char b[HANG][LIE], int hang, int lie);//显示落棋后的棋盘
void wanjiaxiaqi(char b[HANG][LIE], int hang, int lie);//玩家下棋
int meiman(char b[HANG][LIE], int hang, int lie);//判断棋盘没有满
void diannaoxiaqi(char b[HANG][LIE], int hang, int lie);//电脑下棋
char shifouying(char b[HANG][LIE], int hang, int lie);//判断是否有一方获胜

第三步:在test.c中写出框架。

#define  _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("**********************\n");
	printf("*********1.play*******\n");
	printf("*********0.exit*******\n");
	printf("******玩家棋子“*”***\n");
	printf("******电脑棋子“#”***\n");
}
void game()
{
    char b[HANG][LIE] = { 0 };
	qipan(b, HANG, LIE);
	xianshiqipan(b, HANG, LIE);
	while (shifouying(b, HANG, LIE)=='k')
	{
		wanjiaxiaqi(b, HANG, LIE);
		printf("电脑下棋\n");
		diannaoxiaqi(b, HANG, LIE);
	}
	if (shifouying(b, HANG, LIE) == '*')
	{
		printf("祝贺玩家胜利!\n");
	}
	else if (shifouying(b, HANG, LIE) == '#')
	{
		printf("电脑胜利!\n");
	}
	else
	{
		printf("平局!\n");
	}
}
int main()
{
	srand((unsigned int)time(NULL));//生产随机数使用
	char b[HANG][LIE] = { 0 };
	int n=0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			game(); break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误,请重新输入\n"); break;
		}
	} while (n);
}

 第四步:在game.c中逐个完成函数。

#define  _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void qipan(char b[HANG][LIE], int hang, int lie)
{
	int i = 0, j = 0;
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
		{
			b[i][j] = ' ';
		}
	}
}
void xianshiqipan(char b[HANG][LIE], int hang, int lie)
{
	int i=0;
	for (i = 0; i < hang; i++)
	{
		int j = 0;
		for (j = 0; j < lie; j++)
		{
			printf(" %c ", b[i][j]);
			if (j < lie-1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < hang-1)
		{
			int j = 0;
			for (j = 0; j < lie; j++)
			{
				printf("---");
				if (j < lie - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
		
	}
}
int meiman(char b[HANG][LIE], int hang, int lie)
{
	int i=0, j=0,flag=0;
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
		{
			if (b[i][j] == ' ')
			{
				flag = 1;
			}
		}
	}
	return flag;
}
void wanjiaxiaqi(char b[HANG][LIE], int hang, int lie)
{
	int x, y;
	printf("请输入落棋位置,例2 2:");
	scanf("%d %d", &x, &y);
	x--;
	y--;
	while (x >= 3 || y >= 3 || x<0||y<0)
	{
		printf("输入错误,请重新输入:");
		scanf("%d %d", &x, &y);
		x--;
		y--;
	}
	if(x < 3 && y < 3)
	{
		while (b[x][y] != ' ')
		{
			printf("该位置已有棋子,请重新输入:\n");
			scanf("%d %d", &x, &y);
			x--;
			y--;
		}
		if (b[x][y] == ' ')
		{
			b[x][y] = '*';
			xianshiqipan(b, HANG, LIE);
		}
	}

}
void diannaoxiaqi(char b[HANG][LIE], int hang, int lie)
{
	int i,j;
	i = rand() % 2;
	j = rand() % 2;
	while(b[i][j] != ' ')
	{
		i = rand() % 2;//生成随机数
		j = rand() % 2;
	}
	b[i][j] = '#';
	xianshiqipan(b, HANG, LIE);
}
char shifouying(char b[HANG][LIE], int hang, int lie)
{
	int i, j;
	for (i = 0; i < hang; i++)//有一行相同
	{
		if (b[0][i] == b[1][i] && b[1][i] == b[2][i] && b[0][i] != ' ')
		{
			if (b[0][i] == '*')
				return '*';
			else
				return '#';
		 }
	}
	for (i = 0; i < lie; i++)//有一列相同
	{
		if (b[i][1] == b[i][2] && b[i][0] == b[i][1] && b[i][0] != ' ')
		{
			if (b[i][0] == '*')
				return '*';
			else
				return '#';
		}
	}
	if (b[0][0] == b[1][1] && b[1][1] == b[2][2] && b[0][0] != ' ')
	{
		if (b[0][0] == '*')
			return '*';
		else
			return '#';
	}
	if (b[0][2] == b[1][1] && b[1][1] == b[2][0] && b[1][1] != ' ')
	{
		if (b[1][1] == '*')
			return '*';
		else
			return '#';
	}
	if (!meiman(b, HANG, LIE))//此时棋盘满了
	{
		return 'p';
	}
	return 'k';
}

第五步:调试,测试是否出现预期结果。

 

 

如果有什么建议或疑问可以私信我哦!也可以直接评论,我会尽量解答哒!一起加油!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值