C语言编写的三子棋小游戏

三子棋

描述:将方法函数和main方法分离,并创建game1头文件声明方法

有两点并未整好和搞明白,希望大神指点:
1.电脑连续产生随机数的方法那块,并未清楚
2.输赢结果中,产生平局时,并未结束游戏,printf("平局"),调了很久也没搞好

game1.c文件

//三子棋游戏
#include <stdio.h>
#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) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			//1.打印数据
			printf(" %c ", board[i][j]);
			if (j < col - 1) {
				printf("|");
			}
		}printf("\n");
		//2.打印分割行
		if (i < row - 1) {
			for (int j = 0; j < col; j++) {
				printf("---");
				if (j < col - 1) {
					printf("|");
				}
			}printf("\n");
		}
	}
}

//游戏目录
void menu()
{
	printf("************************\n");
	printf("*****1.play  0.exit*****\n");
	printf("************************\n");
}

//游戏进入
void test() {
	int input;
	//随机生产时间控制器  以至于电脑可以连续产生随机数
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择:");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			printf("进入游戏三子棋\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
}

//玩家落子
void PlayerMove(char board[ROW][COL], int row, int col) {
	int x = 0;
	int y = 0;
	printf("玩家走:\n");
	while (1) {
		printf("请输入要落子的坐标:");
		scanf_s("%d%d", &x, &y);
		//判断x,y坐标的合法性
		if (x >= 1 && x <= row && y >= 1 && y <= col) {
			if (board[x - 1][y - 1] == ' ') {
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该位置已被占用,请重新输入!\n");
			}
		}
		else {
			printf("输入坐标不合法,请重新输入!\n");
		}
	}
}

//电脑落子
void ComputerMove(char board[ROW][COL], int row, int col) {
	int x = 0;
	int y = 0;
	printf("电脑走:\n");
	while (1) {
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ') {
			board[x][y] = '#';
			break;
		}
	}

}
int IsFull(char board[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; i < col; j++) {
			if (board[i][j] == ' ') {
				return 0;
			}
		}
	}
	return 1;//棋盘满了
}
//输赢方法判断
char IsWin(char board[ROW][COL],int row,int col) {
	//判断行
	for (int i = 0; i < row; i++) {
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') {
			return board[i][0];
		}
	}
	//判断列
	for (int i = 0; i < col; i++) {
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {
			return board[0][i];
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') {
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') {
		return board[0][2];
	}
	//判断是否格满
	if (1 == IsFull(board, ROW, COL)) {
		return 'P';
	}
	//游戏继续
	return 'J';
}

//游戏构造
void game() {
	char ret = 0;
	//数组存放棋盘信息
	char board[ROW][COL] = {0};
	//初始化棋盘
	InitBoard(board,ROW,COL);
	//打印棋盘
	DisplayBoard(board,ROW,COL);

	//下棋
	while (1) {
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断玩家是否赢
		ret = IsWin(board,ROW,COL);
		if (ret != 'J') {
			break;
		}
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断电脑是否赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'J') {
			break;
		}
	}
	switch (ret) {
	case '*':
		printf("玩家赢得比赛!\n");
			break;
	case '#':
		printf("电脑赢得比赛!\n");
			break;
	case 'P':
		printf("平局!\n");
			break;
	}
}

main.c

//三子棋游戏
#include "game1.h"

int main() {
	test();
	return 0;
}

game1.h

#define ROW 3
#define COL 3

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

//声明
void game();
void test();
//判断输赢四种情况
//‘*’玩家赢
//‘#’电脑赢
//‘P’平局
//‘J’继续
int IsFull(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
posted @   NeverGGp  阅读(168)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示