为提高编程能力,写了一个简单的三子棋游戏,采取多文件形式,写的比较low,游戏难度在于让电脑赢,欢迎各位前辈指导,有误之处请指正,谢谢!
以下是程序源代码:
头文件模块(game.h):
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
enum OPTION
{
EXIT,
PLAY
};
void Init_TableBoard(char TableBoard[ROW][COL], int row, int col);
void Meau();
void game(char TableBoard[ROW][COL], int row, int col);
void Tableboard_Display(char TableBoard[ROW][COL], int row, int col);
void PlayerMove(char TableBoard[ROW][COL], int row, int col);
int Is_Win(char TableBoard[ROW][COL], int row, int col);
int Is_full(char TableBoard[ROW][COL], int row, int col);
void ComputerMove(char TableBoard[ROW][COL], int row, int col);
void Reverse_TableBoard(char TableBoard[ROW][COL], int row, int col);
#endif // !__GAME_H__
源文件模块:
game.c:
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void Init_TableBoard(char TableBoard[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
TableBoard[i][j] = ' ';
}
}
}
void Display(char TableBoard[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 ", TableBoard[i][j]);
}
printf("\n");
}
}
void Meau()
{
printf("**************************\n");
printf("*** 1.PLAY 0.EXIT ***\n");
printf("**************************\n");
}
void game(char TableBoard[ROW][COL], int row, int col)
{
srand((unsigned int)time(NULL));
int ret1 = 0;// 接收判断谁赢函数的返回值 1-表示玩家赢 0-表示电脑赢 -1—表示尚未分出胜负
int ret2 = 0;// 接收判断棋盘满没满函数的返回值 0-表示没满 1-表示满了(平局)
Tableboard_Display(TableBoard, row, col);
while (1)
{
PlayerMove(TableBoard, row, col);
Tableboard_Display(TableBoard, row, col);
ret1 = Is_Win(TableBoard, row, col);
if (ret1 == 1)
{
printf("您赢了\n");
break;
}
else if (ret1 == 0)
{
printf("电脑赢了\n");
break;
}
ret2 = Is_full(TableBoard, row, col);
if (ret2 == 1)
{
printf("平局\n");
break;
}
ComputerMove(TableBoard, row, col);
Tableboard_Display(TableBoard, row, col);
ret1 = Is_Win(TableBoard, row, col);
if (ret1 == 1)
{
printf("您赢了\n");
break;
}
else if (ret1 == 0)
{
printf("电脑赢了\n");
break;
}
ret2 = Is_full(TableBoard, row, col);
if (ret2 == 1)
{
printf("平局\n");
break;
}
}
}
void Tableboard_Display(char TableBoard[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf(" %c |", TableBoard[i][j]);
}
else
{
printf(" %c ", TableBoard[i][j]);
}
}
printf("\n");
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf("___|");
}
else
{
printf("___ ");
}
}
printf("\n");
}
else
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf(" %c |", TableBoard[i][j]);
}
else
{
printf(" %c ", TableBoard[i][j]);
}
}
printf("\n");
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf(" |");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
}
void PlayerMove(char TableBoard[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("该您走\n");
printf("请输入坐标:");
while (1)
{
scanf("%d%d", &x, &y);
if (x > 0 && x < 4 && y > 0 && y < 4 && (TableBoard[x - 1][y - 1] == ' '))
{
TableBoard[x - 1][y - 1] = 'X';
break;
}
else
{
printf("坐标非法,请重新输入:");
}
}
}
int Is_Win(char TableBoard[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if ((TableBoard[i][0] == TableBoard[i][1]) && (TableBoard[i][0] == TableBoard[i][2]) && (TableBoard[i][0] == 'X'))
return 1;
else if ((TableBoard[i][0] == TableBoard[i][1]) && (TableBoard[i][0] == TableBoard[i][2]) && (TableBoard[i][0] == '0'))
return 0;
}
for (j = 0; j < col; j++)
{
if ((TableBoard[0][j] == TableBoard[1][j]) && (TableBoard[0][j] == TableBoard[2][j]) && (TableBoard[0][j] == 'X'))
return 1;
else if((TableBoard[0][j] == TableBoard[1][j]) && (TableBoard[0][j] == TableBoard[2][j]) && (TableBoard[0][j] == '0'))
return 0;
}
if ((TableBoard[0][0] == TableBoard[1][1]) && (TableBoard[0][0] == TableBoard[2][2]) && (TableBoard[0][0] == 'X'))
return 1;
else if ((TableBoard[0][0] == TableBoard[1][1]) && (TableBoard[0][0] == TableBoard[2][2]) && (TableBoard[0][0] == 'X'))
return 0;
return -1;
}
int Is_full(char TableBoard[ROW][COL], int row, int col)
{
int i = 0;
int flag = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (TableBoard[i][j] == ' ')
{
flag = 1;
return 0;
}
}
}
return 1;
}
void ComputerMove(char TableBoard[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走:\n");
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (TableBoard[x][y] == ' ')
{
TableBoard[x][y] = '0';
printf("坐标:(%d %d)\n", x+1, y+1);
break;
}
}
}
void Reverse_TableBoard(char TableBoard[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
TableBoard[i][j] = ' ';
}
}
}
测试模块
test.c:
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int main()
{
char TableBoard[ROW][COL] = { 0 };
int input = 0;
Init_TableBoard(TableBoard, ROW, COL);
do
{
Meau();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case EXIT:
break;
case PLAY:
game(TableBoard, ROW, COL);
break;
default:
printf("选择非法,请重新选择\n");
Reverse_TableBoard(TableBoard, ROW, COL);
}
} while (input);
system("Pause");
return 0;
}
欢迎指正,谢谢!