三子棋的思路

作为刚学习c语言的萌新,代码可能存在bug

刚开始创建两个源文件,一个头文件,(头文件存放的是函数的声明,一个源文件存放游戏的逻辑运行函数【如三子棋的胜利规则,玩家怎么下棋等等】,另一个存放main函数和主要函数,例如我game函数调用代表游戏开始,然后再game函数里调用游戏的实现逻辑的函数)

接着分析这个代码如何实现

1.首先需要一个棋盘,然后考虑的是玩家走和电脑走,然后判断谁赢了或者平局或者继续走

2.三子棋中显示的数据我们可以用数组存起来,最后打印数组,数组还应改包括分割线

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

#define ROW 3
#define COL 3 //头文件,代码的行列尽量宏定义,这样修改起来方便
#pragma once                                            //存放主要函数的实现
#include"game.h"
int is_full(char board[ROW][COL], int row, int col)    //判断棋盘是否满格,满格还没分出胜负 
                                                       //就平局
{
	int temp = 0;
	for (int i = 0; i < row; i++)
		for (int j = 0;j < col; j++)
			if (board[i][j] == ' ')
			{
				temp = 1;
				break;
			}
	if (temp == 1)
		return 0;
	else
		return 1;
}
void initboard(char board[ROW][COL], int row, int col) //初始化棋盘让数组内部为空格,
{
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			board[i][j] = ' ';
}
void printboard(char board[ROW][COL], int row, int col)//打印棋盘的函数,注意最后一行没有
{                                                      //下划线,最后一列没有竖线
	for (int i = 0; i < row; i++) 
	{
		for (int j = 0; j < col; j++)
		{

			printf(" %c ", board[i][j]);  //先打印数据再打印分割线
			if (j != col - 1)
				printf("|");
		} 
		printf("\n");                     //注意换行
		if (i != row - 1)
		{
			for (int j = 0; j < col; j++)
			{
				printf("---");
				if (j != col - 1)
					printf("|");
			}
		}
		printf("\n");
	}
}

void player_move(char board[ROW][COL], int row, int col)   //玩家下棋的逻辑是让玩家输入行列
{                                                          //然后让对应的数组地方赋值为*,
	printf("玩家下棋");                                    //再打印一次棋盘,(注意玩家的行
	int h = 0, k = 0;                                     //列是从1开始,数组是从0开始
	while (1)
	{
		printf("\n请输入行:\n");
		scanf("%d", &h);
		printf("请输入列:\n");                       //要判断玩家输入的坐标的合法性,那个位
		scanf("%d", &k);                            //置不能有别的数(即要为空格)
                                                    //以及输入的坐标要比定义的棋盘小
		if (h >= 1 && h <= row && k >= 1 && k <= col)
		{
			if (board[h - 1][k - 1] == ' ')
			{
				board[h - 1][k - 1] = '*';  //玩家下棋用*,电脑下棋用#
				break;
			}
			else
				printf("坐标被占用,请重新输入!\n");  
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}

}
void computer_move(char board[ROW][COL], int row, int col)  //电脑下棋,不会算法,只能弄一            
                                            //个随机值
{
	printf("电脑下棋\n");
	while (1)
	{
		int x = rand() % ROW;  //主函数用srand设置时间戳,然后%row是为了让值在0到row-1的范围
		int y = rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

char panduan(char board[ROW][COL], int row, int col)   //判断胜利条件,三个连一起
{
	for (int i = 0; i < row; i++)
	{                                                  //电脑更人一共两个,所以横竖判断4次
		for (int j = 0; j < col - 2; j++)              //现在判断横竖
		{
			for (int k = 0; k < 3; k++)
				if (board[i][j] == '#' && board[i][j + 1] == '#' && board[i][j + 2] == '#')
					return board[i][j];
		}
	}
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col - 2; j++)
		{
			for (int k = 0; k < 3; k++)
				if (board[i][j] == '*' && board[i][j + 1] == '*' && board[i][j + 2] == '*')
					return board[i][j];
		}
	}
	for (int j = 0; j < col; j++)
	{
		for (int i = 0; i < row - 2; i++)
		{
			for (int k = 0; k < 3; k++)
				if (board[i][j] == '*' && board[i + 1][j] == '*' && board[i + 2][j] == '*')
					return board[i][j];
		}
	}
	for (int j = 0; j < col; j++)
	{
		for (int i = 0; i < row - 2; i++)
		{
			for (int k = 0; k < 3; k++)
				if (board[i][j] == '#' && board[i + 1][j] == '#' && board[i + 2][j] == '#')
					return board[i][j];
		}
	}

	                                                    //接下来判断对角线
	for (int i = 0; i < row - 2; i++)
	{
		for (int j = 0; j < col - 2; j++)
		{
			for (int k = 0; k < 3; k++)
				if (board[i][j] == '#' && board[i + 1][j + 1] == '#' && board[i + 2][j + 2] == '#')
					return board[i][j];
		}
	}
	for (int i = 0; i < row - 2; i++)
	{
		for (int j = 0; j < col - 2; j++)
		{
			for (int k = 0; k < 3; k++)
				if (board[i][j] == '*' && board[i + 1][j + 1] == '*' && board[i + 2][j + 2] == '*')
					return board[i][j];
		}
	}
	                                                    //判断斜角线
	for (int i = row - 1; i >= 2; i--)
		for (int j = 0; j < col - 3; j++)
			if (board[i][j] == '*' && board[i - 1][j + 1] == '*' && board[i - 2][j + 2] == '*')
				return board[i][j];
	for (int i = row - 1; i >= 2; i--)
		for (int j = 0; j < col - 3; j++)
			if (board[i][j] == '#' && board[i - 1][j + 1] == '#' && board[i - 2][j + 2] == '#')
				return board[i][j];
	if (is_full(board, row, col) != 1)                //最后考虑棋盘满了没,没满就继续输入
		return 'c';                                   //满了就平局(因为前面都是for循环遍历
	else                                              //一旦符合条件就return走不会执行下面
		return 'q';                                   //的代码,因此一旦执行下面的代码,
}                                                     //证明还没分出胜负)
	 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值