【小游戏】三子棋

【C语言】实现最简单的三子棋

无人工智能,界面简单,手动输入坐标X X

代码如下 环境:VS2015

game.h

#pragma once
#ifndef __GAME_H__
#define __GAME_H__

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

#define ROW 3
#define COL 3

void init_board(char board[ROW][COL], int row, int col);    //棋盘数组初始化
void display_board(char board[ROW][COL], int row, int col); //棋盘封装显示
void player_board(char board[ROW][COL], int row, int col);  //棋手下棋
void comp_board(char board[ROW][COL], int row, int col);    //机器下棋
int jud_win(char board[ROW][COL], int row, int col);        //判断输赢
int jud_full(char board[ROW][COL], int row, int col);       //判断下满


#endif //__GAME_H__

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init_board(char board[ROW][COL], int row, int col)    //棋盘数组初始化
{
	memset(board, ' ', ROW*COL*sizeof(char));      //初始化为空格
}
void display_board(char board[ROW][COL], int row, int col) //棋盘封装显示
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		printf(" %c | %c | %c \n",
			board[i][0], board[i][1], board[i][2]);
		if (i != 2)
			printf("---|---|---\n");
	}
}
void player_board(char board[ROW][COL], int row, int col) //棋手下棋
{
	int x = 0;
	int y = 0;
ret:
	printf("请输入坐标:>");
	scanf("%d%d", &x, &y);
	x = x - 1;
	y = y - 1;
	if (((x >= 0) && (x <= 2)) && ((y >= 0) && (y <= 2)))
	{
		if (board[x][y] == ' ')
		{
			board[x][y] = '0';
		}
		else
		{
			printf("输入有误,");
			goto ret;
		}
	}
	else
	{
		printf("输入有误,");
      goto ret;
	}
	system("cls");
	display_board(board, ROW, COL);
	if (jud_win(board, ROW, COL) == 1)//判断输赢...
	{
		printf("很强大!你赢了~\n");
	}
	else if (jud_win(board, ROW, COL) == 3)
	{
		printf("呵呵~下平了..\n");
	}
	else comp_board(board, ROW, COL);
}
void comp_board(char board[ROW][COL], int row, int col) //机器下棋
{
	srand((unsigned int)time(NULL));    //求随机数
	while(1)
	{
		int x = rand() % 3;             //随机数取模3
		int y = rand() % 3;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'X';
			break;
		}
	}
	system("cls");
	printf("电脑已下:>\n");
	display_board(board, ROW, COL);
	if (jud_win(board, ROW, COL) == 2)//判断输赢...
	{
		printf("呵呵~你输了=。=\n");
	}
	else if (jud_win(board, ROW, COL) == 3)
	{
		printf("呵呵~下平了..\n");
	}
	else player_board(board, ROW, COL);
}
int jud_win(char board[ROW][COL], int row, int col)//判断输赢
{
	int i = 0;
	for (i = 0; i < row; i++)          //玩家行判断
	{
		if ((board[i][0]) == (board[i][1]) && (board[i][1]) == (board[i][2]) && (board[i][0]) == '0')
			return 1;
	}
	for (i = 0; i < row; i++)         //机器行判断
	{
		if ((board[i][0]) == (board[i][1]) && (board[i][1]) == (board[i][2]) && (board[i][0]) == 'X')
			return 2;
	}
	for (i = 0; i < col; i++)        //玩家列判断
	{
		if ((board[0][i]) == (board[1][i]) && (board[1][i]) == (board[2][i]) && (board[0][i]) == '0')
			return 1;
	}
	for (i = 0; i < col; i++)        //机器列判断
	{
		if ((board[0][i]) == (board[1][i]) && (board[1][i]) == (board[2][i]) && (board[0][i]) == 'X')
			return 2;
	}
	if ((board[0][0]) == (board[1][1]) && (board[1][1]) == (board[2][2]) && (board[0][0]) == '0')
		return 1;                  //玩家斜判断
	if ((board[0][2]) == (board[1][1]) && (board[1][1]) == (board[2][0]) && (board[0][2]) == '0')
		return 1;
	if ((board[0][0]) == (board[1][1]) && (board[1][1]) == (board[2][2]) && (board[0][0]) == 'X')
		return 2;                //机器斜判断
	if ((board[0][2]) == (board[1][1]) && (board[1][1]) == (board[2][0]) && (board[0][2]) == 'X')
		return 2;
	if(jud_full(board, ROW, COL))return 3;
}
int jud_full(char board[ROW][COL], int row, int col)   //判断下满
{
	int x = 0;
	int y = 0;
	for (x = 0; x < row; x++)
	{
		for (y = 0; y < col; y++)
			if (board[x][y] == ' ')
				return 0;
	}
	return 1;
}


test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("***********************\n");
	printf("****1.play 0.exit******\n");
	printf("***********************\n");
}
void menu2()
{
	printf("***********************\n");
	printf("****1.先下 2.后下******\n");
	printf("***********************\n");
}
void game()
{
	int j = 0;
	srand((unsigned int)time(NULL));
	//int a = rand() % 2;
	char board[ROW][COL];
	init_board(board, ROW, COL);//棋盘数组初始化
	menu2();                    //先后选择
	printf("请选择:>");
	scanf("%d", &j);
	switch (j)
	{
	case 1:
		system("cls");
		printf("你的棋子为'0':>\n");
		display_board(board, ROW, COL);//棋盘封装
		player_board(board, ROW, COL);//棋手下...
		break;
	case 2:
		system("cls");
		comp_board(board, ROW, COL);//电脑下...
		break;
	default:printf("输入有误");
		break;
	}
	//display_board(board, ROW, COL);//棋盘封装
}
int main()
{
	int i = 0;
	//srand((unsigned int)time(NULL)); 
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &i);
		switch (i)
		{
		case 1:
			system("cls");
			game();
			break;
		case 0:
			system("cls");
			printf("****GAME OVER****\n");
			break;
		default:
			printf("输入有误,请重新输入。");
			break;
		}
	} while (i != 0);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_32672481/article/details/69945413