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