【小遊戲】三子棋

【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;
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章