判断游戏结果处还没有进行扩展
main.c:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "game.h"
void menu()
{
printf("*****************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
printf("*****************************\n");
}
int main()
{
srand((unsigned int)time(NULL)); //使用时间戳作为随机数的生成起点
int selection = 0;
do
{
//menu
menu();
//input selection
printf("please input your selection:>");
scanf("%d", &selection);
switch (selection)
{
case 1:
printf("play game\n");
play_game();
break;
case 0:
printf("exit\n");
break;
default:
printf("selection is error\n\n");
break;
}
//输入1,玩游戏
//输入0,退出
//输入其他,选择错误,选择错误后,再次打印菜单
} while (selection);
return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
#include <stdlib.h>
#include <stdio.h>
//初始化棋子,将每一个棋子都初始化为一个空格
void board_init(char board[ROW][COLUMN], int row, int column)
{
//row
for (int i = 0; i < row; i++)
{
//column
for (int j = 0; j < column; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘,包括线条和棋子
void display_board(char board[ROW][COLUMN], int row, int column)
{
//row
for (int i = 0; i < row; i++)
{
//打印棋子、棋子与棋子之间的竖线
for (int j = 0; j < column; j++)
{
printf(" %c ", board[i][j]);
if (j < (column - 1))
{
printf("|");
}
}
printf("\n");
//打印行与行之间的分割线
if (i < (column - 1))
{
for (int j = 0; j < column; j++)
{
printf("---");
if (j < (column - 1))
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家下棋
void PlayerMove(char board[ROW][COLUMN], int row, int column)
{
while (1)
{
printf("玩家下棋,格式:1 1\n");
printf("左上角位置的坐标为1 1,请输入:>");
int x = 0; //coordinate of row
int y = 0; //coordinate of column
scanf("%d %d", &x, &y);
//坐标合法性判断,如果合法,跳出循环,否则继续输入
if ((1 <= x) && (x <= row) && (1 <= y) && (y <= row)) //坐标是否在棋盘范围内
{
if (board[x - 1][y - 1] == ' ') //坐标位置是否是空的
{
board[x - 1][y - 1] = '*'; //放一个*进去
break;
}
else
{
printf("坐标已被占用,请选择其他位置\n");
}
}
else
{
printf("Input is illegal, please input again\n");
}
}
}
//电脑下棋
//电脑随机生成坐标,如果这个坐标是空的,就在那里下,符号为#
void ComputerMove(char board[ROW][COLUMN], int row, int column)
{
printf("Computer play:>\n");
while (1)
{
int x = 0; //row coordinate
int y = 0; //column coordinate
x = rand() % row; //x can be 0, 1, 2
y = rand() % column;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//四种情况
// 游戏还没有结束:> 0
// 玩家赢:> 1
// 电脑赢:> 2
// 平局(棋盘满了):> 3
int JudgeWhoWin(char board[ROW][COLUMN], int row, int column)
{
int ReturnValue = 0; //默认游戏还没有结束
//判断row行
for (int i = 0; i < row; i++)
{
if ((board[i][0] == board[i][1]) && (board[i][0] == board[i][2]) && (board[i][0] != ' ')) //如果这一行相等,而且不是空格
{
if (board[i][0] == '*') //玩家赢
{
ReturnValue = 1;
}
else if (board[i][0] == '#') //电脑赢
{
ReturnValue = 2;
}
}
}
//判断column列
for (int i = 0; i < column; i++)
{
if ((board[0][i] == board[1][i]) && (board[0][i] == board[2][i]) && (board[0][i] != ' ')) //如果这一列相等,而且不是空格
{
if (board[0][i] == '*') //玩家赢
{
ReturnValue = 1;
}
else if (board[0][i] == '#') //电脑赢
{
ReturnValue = 2;
}
}
}
//判断两个对角线
if ((board[0][0] == board[1][1]) && (board[0][0] == board[2][2]) && (board[1][1] != ' ')) //如果捺对角线相等,而且不是空格
{
if (board[1][1] == '*') //玩家赢
{
ReturnValue = 1;
}
else if (board[1][1] == '#') //电脑赢
{
ReturnValue = 2;
}
}
if ((board[0][2] == board[1][1]) && (board[0][2] == board[2][0]) && (board[1][1] != ' ')) //如果撇对角线相等,而且不是空格
{
if (board[1][1] == '*') //玩家赢
{
ReturnValue = 1;
}
else if (board[1][1] == '#') //电脑赢
{
ReturnValue = 2;
}
}
//没有人赢,判断是不是平局,看里面还有没有空格
int DogfullFalg = 1; //默认是平局
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
if (board[i][j] == ' ') //如果有空格,不是平局,跳出循环
{
DogfullFalg = 0;
break;
}
}
}
if (DogfullFalg == 1)
{
ReturnValue = 3;
}
return ReturnValue;
}
void play_game()
{
int JudgeWhoWinFlag = 0; //判断谁赢的标志位,0-继续,1-玩家赢,2-电脑赢,3-平局
char board[ROW][COLUMN] = { 0 }; //创建一个3*3的二维数组,用于存放每个位置上的符号
board_init(board, ROW, COLUMN); //初始化二维数组,初始化棋子,让它的每个元素都是空格
display_board(board , ROW, COLUMN); //打印棋盘
while (1)
{
PlayerMove(board, ROW, COLUMN); //玩家下棋
display_board(board, ROW, COLUMN); //重新打印棋盘
//判断输赢
JudgeWhoWinFlag = JudgeWhoWin(board, ROW, COLUMN); //判断谁赢,返回一个标志为
if (JudgeWhoWinFlag != 0) //如果标志为不是 0-继续,就跳出死循环
{
break;
}
ComputerMove(board, ROW, COLUMN); //电脑下棋
display_board(board, ROW, COLUMN); //重新打印棋盘
//判断输赢
JudgeWhoWinFlag = JudgeWhoWin(board, ROW, COLUMN); //判断谁赢,返回一个标志为
if (JudgeWhoWinFlag != 0) //如果标志为不是 0-继续,就跳出死循环
{
break;
}
}
if (JudgeWhoWinFlag == 1) //根据标志位,打印不同的文本提示
{
printf("Player Win\n");
}
else if(JudgeWhoWinFlag == 2)
{
printf("Computer Win\n");
}
else if(JudgeWhoWinFlag == 3)
{
printf("Dogfall______Draw The Game\n");
}
}
game.h
我在game.h只放了外部可能会用到的东西
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#define ROW 3
#define COLUMN 3
void play_game();