三子棋游戏分享

本文分享了作者初学C语言时编写三子棋游戏的过程。从棋盘初始化、打印棋盘、玩家与电脑落子的判断,到头文件的使用原则,详细介绍了编程思路。作者在编写过程中体验到学习的乐趣,并表达了对指导者的感谢。
摘要由CSDN通过智能技术生成

入门

  • 说起来初学c语言了这么长时间,自己也在一点一点的喜欢上这个东西,今天想在这里分享自己学习的三子棋游戏的编写过程,当然这也得感谢万能凯的指教。

编程思路

  1. 首先进行棋盘初始化
  2. 然后打印一个精致的(斜眼笑)棋盘-第一次打印一张空白棋盘
  3. 玩家落子,然后判断游戏是否结束
  4. 电脑落子,判断游戏是否结束

添加一个头文件

  • 为什么一般都在头件中进行函数,变量声明,宏声明,结构体声明呢?而在C文件中去进行变量定义,函数实现呢?
    1.如果在头文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编 译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此头文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会报错 。
    2.如果在C文件中声明宏,结构体,函数等,那么我要在另一个C文件中引用相 应的宏,结构体,就必须再做一次重复的工作,如果我改了一个C文件中的一个声明,那么又忘了改其它C文件中的声明,这就容易造成很多问题,程序的逻辑就变成 了你不可预期的了,如果把这些公共的东西放在一个头文件中,想用它的C文件就只需要引用一个就OK了!!这样就会很方便,要改某个声明的时候,只需要动一 下头文件就行了 。
    目前自己的理解也就这样(新手),所以一开始就要注意怎样能尽量减少程序出错。那么三子棋的建立的头文件如下:
#pragma once
#define ROW 3
#define COL 3

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

int isWin(char board[ROW][COL], int row, int col);
void playMove(char board[ROW][COL], int row, int col);
void init(char board[ROW][COL], int row, int col);
void print(char board[ROW][COL], int row, int col);
void computerMove(char board[ROW][COL], int row, int col);
  • 接下来分别写初始化函数等(写代码时差点气到强迫症的某人哈)注意空格!!
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"

// 棋盘初始化
void init(char board[ROW][COL], int row, int col)
{
	// memset 用来清空一个清空一个结构类型的变量或数组
	memset(board, ' ', row*col);
}
// 打印棋盘(精致凯的启迪)
void print(char board[ROW][COL], int row, int col)
{
	int i = 0;
	printf(" ________ ________ ________\n");
	for (; i < row; ++i)
	{
		printf("|        |        |        |\n");
		printf("|   %c    |   %c    |   %c    |\n", board[i][0], board[i][1], board[i][2]);
		printf("|        |        |        |\n");
		int j = 0;
		for (; j < col; ++j)
		{
			printf("|________");
		}
		printf("|\n");
	}
}
// 玩家落子,判断玩家输入坐标的正确性
// 玩家落子在棋盘用'o'表示
void playMove(char board[ROW][COL], int row, int col)
{
	int m = 0;
	int n = 0;
	do
	{
		printf("请输入坐标:\n");
		scanf("%d %d", &m, &n);
		if (board[m - 1][n - 1] == ' ')
		{
			board[m - 1][n - 1] = 'o';
			break;
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	} while (board[m - 1][n - 1] != ' ');
}
// 电脑落子,保证其落子随机性
void computerMove(char board[ROW][COL], int row, int col)
{
	int a = 0;
	int b = 0;
	do
	{
		//限制电脑落子坐标范围,产生随机数
		a = rand() % row;
		b = rand() % col;
		if (board[a][b] == ' ')
		{
			board[a][b] = '*';
			break;
		}
	} while (board[a][b] != ' ');
}
//判断游戏结果,玩家赢返回1,电脑赢返回-1,平局返回0
int isWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (; i < row; ++i)
	{
		if (board[i][0] == 'o'&& board[i][1] == 'o'&& board[i][2] == 'o')
			return 1;
		else if (board[0][i] == 'o' && board[1][i] == 'o'&& board[2][i] == 'o')
			return 1;
	}
	if (board[0][0] == 'o'&& board[1][1] == 'o'&& board[2][2] == 'o' || (board[0][2] == 'o'&& board[1][1] == 'o'&& board[2][0] == 'o'))
		return 1;
	int  j = 0;
	for (;j < row; ++j)
	{
		if (board[j][0] == '*'&& board[j][1] == '*'&& board[j][2] == '*')
			return -1;
		else if (board[0][j] == '*' && board[1][j] == '*'&& board[2][j] == '*')
			return -1;
	}
	if (board[0][0] == '*'&& board[1][1] == '*'&& board[2][2] == '*' || (board[0][2] == '*'&& board[1][1] == '*'&& board[2][0] == '*'))
		return -1;
	for (i = 0; i < row; ++i)
	{
		for (j = 0; j < col; ++j)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
} 
  • 游戏的主体部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
	//设置菜单函数,游戏进入界面
	printf("*****************************************\n");
	printf("************欢迎来到三子棋游戏***********\n");
	printf("******************请选择*****************\n");
	printf("********* 1.进入游戏  0.退出 ************\n");
	printf("*****************************************\n");
}
// 游戏开始进行,玩家和电脑没走一步都需要判断输赢
void game()
{
	int flag = 2;
	char board[ROW][COL];
	init(board, ROW, COL);
	print(board, ROW, COL);
	while (1)
	{
		playMove(board, ROW, COL);
		system("cls");
		print(board, ROW, COL);
		flag = isWin(board, ROW, COL);
		if (flag == 1)
		{
			printf("\n恭喜你赢了\n\n");
			break;
		}
		if (flag != 0)
		{
			printf("\n平局\n\n");
			break;
		}
		computerMove(board, ROW, COL);
		system("cls");
		print(board, ROW, COL);
		flag = isWin(board, ROW, COL);
		if (flag == -1)
		{
			printf("\n很遗憾,电脑获胜\n\n");
			break;
		}
		if (flag != 0)
		{
			printf("\n平局\n\n");
			break;
		}
	}
}
// 主函数
int main()
{
	int input = 0;
	srand(time(NULL));
	do
	{
		menu();
		scanf("%d", &input);
		system("cls");
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("输入错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}
  • 到这块三子棋游戏的程序编写基本结束了,当自己运行调试代码时内心还是有些小激动,在整个编写过程中自己的思路还是不够清晰,对于某些基础知识掌握不牢靠,等再学一段时间看是否能更优化自己的程序,最后!再次感谢万能凯的超强的耐心(可能优秀的人就是这样吧哈哈?)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值