最后判断是否胜利的那个函数为了可以判断4,5.....字棋而写的有点冗余(毕竟实力不允许)。
游戏中所有使用到的头文件和函数的声明:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//注:行必须等于列
#define ROW 3
#define LOW 3
void Menu(void); //目录
void Game(void); //游戏主程序
void PrintChess(char(*chess)[LOW], int row, int low); //打印游戏棋盘
void Init(char(*chess)[LOW], int row, int low); //初始化棋盘
void PutChess(char(*chess)[LOW], int x, int y, int est); //est为1表示玩家行动,为0表示电脑行动
void PeoChess(char(*chess)[LOW]);//玩家行动
void CompuChess(char(*chess)[LOW]);//电脑行动
//'*'玩家胜
//'#'电脑胜
//'c'继续游戏
//'s'平局
char WinChess(char(*chess)[LOW]);//判断是否胜利
游戏主程序 :
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
int main()
{
int a = 0;
srand(time(NULL)); //随机数种子
do //游戏主循环
{
Menu(); //打印一个简易的菜单
printf("请选择-> ");
scanf("%d", &a);
switch (a)
{
case 1:
Game(); //游戏主程序
break;
case 0:
printf("成功退出!\n");
break;
default:
printf("非法输入!请重新输入:\n");
break;
}
} while (a != 0);
return 0;
}
void Game(void)
{
char result = 0;
char chess[ROW][LOW] = { 0 }; //存储玩家和电脑的行动记录
Init(chess, ROW, LOW); //初始化棋盘
PrintChess(chess, ROW, LOW); //打印游戏棋盘
while (1) //游戏主循环
{
PeoChess(chess); //玩家行动
PrintChess(chess, ROW, LOW);
result = WinChess(chess);
if (result != 'c')
{
break;
}
CompuChess(chess); //电脑行动
PrintChess(chess, ROW, LOW);
result = WinChess(chess);
if (result != 'c')
{
break;
}
}
switch (result)
{
case '*':
printf("玩家胜利!\n");
break;
case '#':
printf("电脑胜利!\n");
break;
case 's':
printf("平局!\n");
break;
}
}
游戏中所有的函数实现:
#include "game.h"
void Menu(void)
{
printf("****************************\n");
printf("******** 1.开始游戏 ********\n");
printf("******** 0.退出游戏 ********\n");
printf("****************************\n");
}
void PrintChess(char(*chess)[LOW], int row, int low)
{
for (int i = 0; i < row; i++)
{
//打印棋盘格子
for (int j = 0; j < low; j++)
{
printf(" %c ", chess[i][j]);
if (j < low - 1)
{
printf("|");
}
}
printf("\n");
//行与行之间的分割线
if (i < row - 1)
{
for (int j = 0; j < low; j++)
{
printf("---");
if (j < low - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
void Init(char(*chess)[LOW], int row, int low)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < low; j++)
{
chess[i][j] = ' ';
}
}
}
void PutChess(char(*chess)[LOW], int x, int y, int est)
{
if (est == 1)
{
chess[x][y] = '*';
}
else
{
chess[x][y] = '#';
}
}
void PeoChess(char(*chess)[LOW])
{
int x = 0; //玩家行动输入的坐标
int y = 0;
printf("玩家行动:\n请输入坐标(用空格分隔):");
while (1)
{
scanf("%d%d", &x, &y);
if ((x >= 1 && x <= ROW && chess[x-1][y-1] == ' ') && (y >= 1 && y <= LOW))
{
PutChess(chess, x-1, y-1, 1);
break;
}
else
{
printf("非法输入!请重新输入:");
}
}
}
void CompuChess(char(*chess)[LOW])
{
printf("电脑行动:\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % 3;
y = rand() % 3;
if ((x >= 0 && x <= ROW-1 && chess[x][y] == ' ') && (y >= 0 && y <= LOW-1))
{
PutChess(chess, x, y, 0);
break;
}
}
}
char WinChess(char(*chess)[LOW])
{
int comp = 0;//判断电脑胜利
int peop = 0;//判断玩家胜利
for (int j = 0; j < ROW; j++)//判断行胜利
{
comp = 0;
peop = 0;
for (int i = 0; i < LOW; i++)
{
if (chess[j][i] == '#')
{
comp++;
}
if (chess[j][i] == '*')
{
peop++;
}
if (comp == ROW)
{
return '#';
}
if (peop == ROW)
{
return '*';
}
}
}
for (int j = 0; j < LOW; j++)//判断列胜利
{
comp = 0;
peop = 0;
for (int i = 0; i < ROW; i++)
{
if (chess[i][j] == '#')
{
comp++;
}
if (chess[i][j] == '*')
{
peop++;
}
if (comp == ROW)
{
return '#';
}
if (peop == ROW)
{
return '*';
}
}
}
comp = 0;
peop = 0;
for (int j = 0; j < ROW; j++)//判断对角线胜利
{
if (chess[j][j] == '#')
{
comp++;
}
if (chess[j][j] == '*')
{
peop++;
}
if (comp == ROW)
{
return '#';
}
if (peop == ROW)
{
return '*';
}
}
comp = 0;
peop = 0;
for (int j = 0, i = LOW-1; j < ROW && i >= 0; j++, i--)//判断对角线胜利
{
if (chess[j][i] == '#')
{
comp++;
}
if (chess[j][i] == '*')
{
peop++;
}
if (comp == ROW)
{
return '#';
}
if (peop == ROW)
{
return '*';
}
}
for (int j = 0; j < LOW; j++)//判断是否继续游戏
{
for (int i = 0; i < ROW; i++)
{
if (chess[i][j] == ' ')
{
return 'c';
}
}
}
return 's';
}
//'*'玩家胜
//'#'电脑胜
//'c'继续游戏
//'s'平局