震惊!!!三子棋最新推出地狱模式 来感受一下被人机支配的恐惧吧

嘿嘿!三子棋可以说是一个非常简单的游戏
我今天写的是一个无敌人机三子棋
哈哈,听起来巨jier霸气
想完成一个三子棋程序,需要打印棋盘,初始化棋盘,再完成玩家落子与电脑落子的函数
再就是调用上述函数,完成具体功能的一个游戏函数和主函数了。
其他的我就不讲了,我主要说说电脑落子的函数吧!其他等下看代码吧.
第一,我们的目的是电脑赢得游戏,那我们就
以电脑赢得游戏为主导思想;
第二,赢;怎么赢?三子连一线就算获胜,所以就要考虑八种情况电脑赢的方式
第三,在电脑赢不了的情况下,我们一个优先考虑,下一步对手是否能够三子连一线,是 的 话,我们就要堵住他的棋路
第四,在双方选手都无法在下一步赢的游戏胜利,我们就先占领有利位置,优先是中间位置,其次是四个角
第五,在上述都未能执行的情况下且游戏未结束,我只能说我们的目的快达到了,嘿嘿!
我们就抬对方一手,随机落子!哈哈,是不是很膨胀(其实我是不知道这么写了)
好了,接下来看代码吧

#ifndef __GAME_H__
#define __GAME_H__

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

#define ROW 3
#define COL 3

void game();
void menu();
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayMove(char board[ROW][COL], int row, int col);
int ComputerMove(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);





#endif

这是头文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

//打印棋盘
void DisplayBoard(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++)
		{
			printf(" %c ",board[i][j]);
			if (j < col)
			{
				printf("|");
			}
		}
		printf("\n");
		for (j = 1; j < col; j++)
		{
			printf("------");
		}
		printf("\n");		
	}
}

game.c源文件

//game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

//打印棋盘
void DisplayBoard(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++)
		{
			printf(" %c ",board[i][j]);
			if (j < col)
			{
				printf("|");
			}
		}
		printf("\n");
		for (j = 1; j < col; j++)
		{
			printf("------");
		}
		printf("\n");		
	}
}

打印棋盘,我的棋盘有点挫。

//初始化棋盘
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 PlayMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请输入坐标:");
	while (1)
	{
		scanf("%d%d", &x, &y);
		if (x > 0 && y > 0 && x <= row&&y <= col)
		{
			if (' ' == board[x-1][y-1])
			{
				board[x-1][y-1] = 'X';
				break;
			}
			else
			{
				printf("坐标输入错误,请重新输入:");
			}
		}
		printf("坐标输入错误,请重新输入:");
	}
}

玩家落子,就几行,怎么赢我们人机,哼

//电脑落子
int ComputerMove(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//首先判断电脑下一步能否赢
	//判断行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == 'O'&& ' ' == board[i][2])
		{
			board[i][2] = 'O';
			return 1;
		}
		if (board[i][1] == board[i][2] && board[i][1] == 'O'&& ' ' == board[i][0])
		{
			board[i][0] = 'O';
			return 1;
		}
		if (board[i][0] == board[i][2] && board[i][0] == 'O'&& ' ' == board[i][1])
		{
			board[i][1] = 'O';
			return 1;
		}

	}
	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == 'O'&& ' ' == board[2][i])
		{
			board[2][i] = 'O';
			return 1;
		}
		if (board[1][i] == board[2][i] && board[1][i] == 'O'&& ' ' == board[0][i])
		{
			board[0][i] = 'O';
			return 0;
		}
		if (board[0][i] == board[2][i] && board[0][i] == 'O'&& ' ' == board[1][i])
		{
			board[1][i] = 'O';
			return 1;
		}
		//判断对角线
	}
	if (board[0][0] == board[1][1] && board[1][1] == 'O'&&' ' == board[2][2])
	{
		board[2][2] = 'O';
		return 1;
	}
	if (board[0][0] == board[2][2] && board[2][2] == 'O'&&' ' == board[1][1])
	{
		board[1][1] = 'O';
		return 1;
	}
	if (board[2][2] == board[1][1] && board[1][1] == 'O'&&' ' == board[0][0])
	{
		board[0][0] = 'O';
		return 1;
	}
	if (board[0][2] == board[2][0] && board[2][0] == 'O'&&' ' == board[1][1])
	{
		board[1][1] = 'O';
		return 1;
	}
	if (board[0][2] == board[1][1] && board[1][1] == 'O'&&' ' == board[2][0])
	{
		board[2][0] = 'O';
		return 1;
	}
	if (board[1][1] == board[2][0] && board[2][0] == 'O'&&' ' == board[0][2])
	{
		board[0][2] = 'O';
		return 1;
	}
//判断玩家下一步是否赢,是的话,则堵玩家下一步棋路
	//判断行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == 'X'&& ' ' == board[i][2])
		{
			board[i][2] = 'O';
			return 1;
		}
		if (board[i][1] == board[i][2] && board[i][1] == 'X'&& ' ' == board[i][0])
		{
			board[i][0] = 'O';
			return 1;
		}
		if (board[i][0] == board[i][2] && board[i][0] == 'X'&& ' ' == board[i][1])
		{
			board[i][1] = 'O';
			return 1;
		}

	}
	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == 'X'&& ' ' == board[2][i])
		{
			board[2][i] = 'O';
			return 1;
		}
		if (board[1][i] == board[2][i] && board[1][i] == 'X'&& ' ' == board[0][i])
		{
			board[0][i] = 'O';
			return 0;
		}
		if (board[0][i] == board[2][i] && board[0][i] == 'X'&& ' ' == board[1][i])
		{
			board[1][i] = 'O';
			return 1;
		}

	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == 'X'&&' ' == board[2][2])
	{
		board[2][2] = 'O';
		return 1;
	}
	if (board[0][0] == board[2][2] && board[2][2] == 'X'&&' ' == board[1][1])
	{
		board[1][1] = 'O';
		return 1;
	}
	if (board[2][2] == board[1][1] && board[1][1] == 'X'&&' ' == board[0][0])
	{
		board[0][0] = 'O';
		return 1;
	}
	if (board[0][2] == board[2][0] && board[2][0] == 'X'&&' ' == board[1][1])
	{
		board[1][1] = 'O';
		return 1;
	}
	if (board[0][2] == board[1][1] && board[1][1] == 'X'&&' ' == board[2][0])
	{
		board[2][0] = 'O';
		return 1;
	}
	if (board[1][1] == board[2][0] && board[2][0] == 'X'&&' ' == board[0][2])
	{
		board[0][2] = 'O';
		return 1;
	}
//若上述都未执行,则判断棋盘中间位置是否有落子,是的话,则落子四角之一,否的话,则落子中间位置
	if (' ' == board[1][1])
	{
		board[1][1] = 'O';
		return 1;
	}
	else
	{
		if (' ' == board[0][0])
		{
			board[0][0] = 'O';
			return 1;
		}
		if (' ' == board[0][2])
		{
			board[0][2] = 'O';
			return 0;
		}
		if (' ' == board[2][0])
		{
			board[2][0] = 'O';
			return 1;
		}
		if (' ' == board[2][2])
		{
			board[2][2] = 'O';
			return 1;
		}
	}
	//若上述语句都未执行,则随机落子
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (' ' == board[x][y])
		{
			board[x][y] = 'O';
			break;
		}
	}
}

这就是刚才解释的电脑落子函数

如果你实在见玩家可怜可以改为普通模式

//void CompuerMove(char board[ROW][COL], int row, int col)
//{
//	while (1)
//	{
//		int x = rand() % 3;
//		int y = rand() % 3;
//		if (' ' == board[x][y])
//		{
//			board[x][y] = 'O';
//			break;
//		}
//	}
//}
/判断棋盘是否满了
int IsFull(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++)
		{
			if (board[i][j] == ' ')
			{		
				return 0;
			}
		}
	}
	return 1;
}
//判断输,赢,平局
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	if (1 == IsFull(board, ROW, COL))
	{
		return 'd';
	}
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
		{
			return board[i][1];
		}
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
		{
			return board[1][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
	{
		return board[1][1];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
	{
		return board[1][1];
	}
	return ' ';
}//游戏函数
void game()
{
	char board[ROW][COL] = { 0 };
	char ret = '0';
	InitBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);
	do
	{
		printf("玩家走:\n");
		PlayMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);

		if (IsWin(board, ROW, COL) != ' ')
		{
			break;
		}
		printf("电脑走:\n");
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = IsWin(board, ROW, COL);

	} while (ret == ' ');
	if ('d' == IsWin(board, ROW, COL))
	{
		printf("平局\n");
	}
	if ('O' == IsWin(board, ROW, COL))
	{
		printf("电脑赢了!");
	}
	if ('X' == IsWin(board, ROW, COL))
	{
		printf("恭喜你!你赢了!\n");
	}
}

接下来就是主函数了

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

//游戏进入选项
void menu()
{
	printf("************************\n");
	printf("****   1.开始游戏   ****\n");
	printf("****   0.退出游戏   ****\n");
	printf("************************\n");
}
//主函数
int main()
{
	int input = 0;
	do
	{
		srand((unsigned int)time(NULL));
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
			{
					  game();
					  break;
			}
			case 0:
			{
					  printf("游戏退出!\n");
					  break;
			}
			default:
			{
					   printf("输入错误,请重新输入!\n");
					   break;
			}
		}
	} while (input);
	system("pause");
	return 0;
}


好了,整体代码就是这样,代码有点挫,有待优化,请见谅!!!

猜你喜欢

转载自blog.csdn.net/lxy_zzZ/article/details/83025548