使用了两个.c和一个.h,因能力问题,代码还有很大缺陷,电脑玩家不够智能,望各位大神指导。
main.c
#include"game.h"
char Game_Date[ROW][COL] = { 0 }; //游戏数据
int S_Date[4][3][3] = { 0 };
//开始游戏
void game()
{
char dedide;
//游戏数据初始化
DateInit(Game_Date, ROW, COL);
//游戏界面
display(Game_Date,ROW,COL);
while (1)
{
//玩家下棋
GamePlayer(Game_Date, ROW, COL);
//判断输赢 * # 平局:Q 继续:T
dedide = Game_Win(Game_Date, ROW, COL);
if (dedide != 'T')
break;
//电脑下棋
GameDisplayer(Game_Date, S_Date, ROW, COL);
//游戏界面
display(Game_Date, ROW, COL);
//判断输赢 * # 平局:Q 继续:T
dedide = Game_Win(Game_Date, ROW, COL);
if (dedide != 'T')
break;
}
if (dedide == '*')
printf("玩家胜利!\n");
else if (dedide == '#')
printf("电脑胜利!\n");
else if (dedide == 'Q')
printf("平局!\n");
}
//主函数
int main()
{
int n=3;
while (n != 2)
{
printf("***1开始游戏:***\n");
printf("***2退出游戏:***\n");
printf("**3游戏制作者:**\n");
printf("请输入你的选择:");
scanf("%d", &n);
switch (n)
{
case 1:
//开始游戏
game();
break;
case 2:
printf("退出游戏\n");
break;
case 3:
printf("制作人:xxx;\n回车返回主界面\n");
gets();
gets();
break;
default:
printf("输入错误,请重新输入\n");
}
}
return 0;
}
**
## game.c
**
#include"game.h"
//游戏初始化
//游戏数据函数及其长宽
void DateInit(char Game_Date[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
Game_Date[i][j] = ' ';
}
//游戏界面加载
//游戏数据函数及其长宽
void display(char Game_Date[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", Game_Date[i][j]);
if (j != 2)
printf("|");
}
printf("\n");
for (j = 0; j < col; j++)
{
if (i < row - 1)
{
printf("___");
if (j != 2)
printf("|");
}
}
printf("\n");
}
}
//游戏输入判断
int PlayerDedide(char Game_Date[ROW][COL], int m, int n)
{
if (m == 0 || m > 3 || n == 0 || n > 3)
{
printf("输入错误,请重新输入:\n");
return 1;
}
else
{
if (Game_Date[m - 1][n - 1] != ' ')
{
printf("该地址已有棋子,请重新输入\n");
return 1;
}
else
{
Game_Date[m - 1][n - 1] = '*';
return 0;
}
}
}
//玩家下棋
//游戏数据函数及其长宽
void GamePlayer(char Game_Date[ROW][COL], int row, int col)
{
int i=1;
int m, n;
while (i)
{
printf("请输入下棋坐标:");
scanf("%d %d", &m, &n);
i = PlayerDedide(Game_Date, m, n);
}
}
//S_Date初始化
void S_DateInit(int S_Date[4][3][3])
{
int i, j, f;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
{
for (f = 0; f < 3; f++)
{
S_Date[i][j][f] = 0;
}
}
}
}
//判断相连的三个棋子的状态
void GameDisplayerDate(char Game_Date[ROW][COL], int S_Date[4][3][3], int row, int col)
{
int i, j;
S_DateInit(S_Date);
//行
for (i = 0; i < row; i++)
{
for (j = 0; j < 3; j++)
{
switch (Game_Date[i][j])
{
case '*':
S_Date[0][i][0]++;
break;
case '#':
S_Date[0][i][1]++;
break;
case ' ':
S_Date[0][i][2]++;
break;
}
}
}
//列
for (i = 0; i < col; i++)
{
for (j = 0; j < 3; j++)
{
switch (Game_Date[j][i])
{
case '*':
S_Date[1][i][0]++;
break;
case '#':
S_Date[1][i][1]++;
break;
case ' ':
S_Date[1][i][2]++;
break;
}
}
}
//对角线'\'
for (i = 0; i < row - 2; i++)
{
for (j = 0; j < 3; j++)
{
switch (Game_Date[i+j][i+j])
{
case '*':
S_Date[2][i][0]++;
break;
case '#':
S_Date[2][i][1]++;
break;
case ' ':
S_Date[2][i][2]++;
break;
}
}
}
//对角线'/'
for (i = row-1; i > 1; i--)
{
for (j = 0; j < 3; j++)
{
switch (Game_Date[i - j][j])
{
case '*':
S_Date[3][i][0]++;
break;
case '#':
S_Date[3][i][1]++;
break;
case ' ':
S_Date[3][i][2]++;
break;
}
}
}
}
//电脑下棋
//游戏数据函数及其长宽
void GameDisplayer(char Game_Date[ROW][COL], int S_Date[3][3][3], int row, int col)
{
srand((unsigned int)time(0));
int m, n;
int i, j, f=0;
GameDisplayerDate(Game_Date, S_Date, row, col);
打印判断数据
//int t;
//for (i = 0; i < 4; i++)
//{
// for (j = 0; j < 3; j++)
// {
// for (t = 0; t < 3; t++)
// printf("%d\t", S_Date[i][j][t]);
// printf("\n");
// }
//}
//首选2,2
if (Game_Date[1][1] == ' ')
{
f = 1;
Game_Date[1][1] = '#';
}
//行 判断#:1
if(f!=1)
for (i = 0; i < row; i++)
{
if(S_Date[0][i][1] == 2 && S_Date[0][i][2] == 1)
for (j = 0; j < 3; j++)
{
if (Game_Date[i][j] == ' ')
{
Game_Date[i][j] = '#';
f = 1;
break;
}
}
if (f == 1)
break;
}
//列 判断#:1
if (f != 1)
for (i = 0; i < col; i++)
{
if ( S_Date[1][i][1] == 2 && S_Date[1][i][2] == 1)
for (j = 0; j < 3; j++)
{
if (Game_Date[j][i] == ' ')
{
Game_Date[j][i] = '#';
f = 1;
break;
}
}
if (f == 1)
break;
}
//对角线'\'判断#:1
if (f != 1)
for (i = 0; i < col; i++)
{
if ( S_Date[2][i][1] == 2 && S_Date[2][i][2] == 1)
for (j = 0; j < 3; j++)
{
if (Game_Date[j][j] == ' ')
{
Game_Date[j][j] = '#';
f = 1;
break;
}
}
if (f == 1)
break;
}
//对角线'/'判断#:1
if (f != 1)
for (i = row - 1; i > 1; i--)
{
if (S_Date[3][i][1] == 2 && S_Date[3][i][2] == 1)
for (j = 0; j < 3; j++)
{
if (Game_Date[i-j][j] == ' ')
{
Game_Date[i-j][j] = '#';
f = 1;
break;
}
}
}
//行 判断*:0
if (f != 1)
for (i = 0; i < row; i++)
{
if (S_Date[0][i][0] == 2 && S_Date[0][i][2] == 1)
for (j = 0; j < 3; j++)
{
if (Game_Date[i][j] == ' ')
{
Game_Date[i][j] = '#';
f = 1;
break;
}
}
if (f == 1)
break;
}
//列 判断*:0
if (f != 1)
for (i = 0; i < col; i++)
{
if ( S_Date[1][i][0] == 2 && S_Date[1][i][2] == 1)
for (j = 0; j < 3; j++)
{
if (Game_Date[j][i] == ' ')
{
Game_Date[j][i] = '#';
f = 1;
break;
}
}
if (f == 1)
break;
}
//对角线'\'判断*:0
if (f != 1)
for (i = 0; i < col; i++)
{
if (S_Date[2][i][0] == 2 && S_Date[2][i][2] == 1)
for (j = 0; j < 3; j++)
{
if (Game_Date[j][j] == ' ')
{
Game_Date[j][j] = '#';
f = 1;
break;
}
}
if (f == 1)
break;
}
//对角线'/'判断*:0
if (f != 1)
for (i = row - 1; i > 1; i--)
{
if (S_Date[3][i][0] == 2 && S_Date[3][i][2] == 1)
for (j = 0; j < 3; j++)
{
if (Game_Date[i - j][j] == ' ')
{
Game_Date[i - j][j] = '#';
f = 1;
break;
}
}
}
while (f != 1)
{
m = rand() % 3;
n = rand() % 3;
if (Game_Date[m][n] == ' ')
{
f = 1;
Game_Date[m][n] = '#';
}
}
}
//判断平局 平局:0 非:1
int tie(char Game_Date[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (Game_Date[i][j] == ' ')
return 1;
}
}
return 0;
}
//判断输赢 * # 平局:Q 继续:T
//游戏数据函数及其长宽
char Game_Win(char Game_Date[ROW][COL], int row, int col)
{
int i, j;
//行 列
for (i = 0; i < row; i++)
{
for (j = 0; j < col-2; j++)
{
if ((Game_Date[i][j] == Game_Date[i][j + 1] && Game_Date[i][j] == Game_Date[i][j + 2]) && Game_Date[i][j] != ' ')
return Game_Date[i][j];
}
}
for (i = 0; i < col; i++)
{
for (j = 0; j < row-2; j++)
{
if ((Game_Date[j][i] == Game_Date[j+1][i] && Game_Date[j][i] == Game_Date[j+2][i]) && Game_Date[j][i] != ' ')
return Game_Date[j][i];
}
}
//对角线
for (i = 0; i < row-2; i++)
{
if (Game_Date[i][i] == Game_Date[i + 1][i + 1] && Game_Date[i][i] == Game_Date[i + 2][i + 2] && Game_Date[i][i] != ' ')
return Game_Date[i][i];
if (Game_Date[i][i+2] == Game_Date[i + 1][i + 1] && Game_Date[i][i+2] == Game_Date[i + 2][i] && Game_Date[i][i+2] != ' ')
return Game_Date[i][i+2];
}
if (tie(Game_Date, row, col))
return 'T';
else
return 'Q';
}
**
game.h
**
#pragma once
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3 //长
#define COL 3 //宽
//游戏初始化
//游戏数据函数及其长宽
void DateInit(char Game_Date[ROW][COL], int row, int col);
//游戏界面加载
//游戏数据函数及其长宽
void display(char Game_Date[ROW][COL], int row, int col);
//玩家下棋
//游戏数据函数及其长宽
void GamePlayer(char Game_Date[ROW][COL], int row, int col);
//电脑下棋
//游戏数据函数及其长宽
void GameDisplayer(char Game_Date[ROW][COL], int S_Date[4][3][3], int row, int col);
//判断输赢 * # 平局:Q 继续:T
//游戏数据函数及其长宽
char Game_Win(char Game_Date[ROW][COL], int row, int col);
//判断相连的三个棋子的状态
void GameDisplayerDate(char Game_Date[ROW][COL], int S_Date[4][3][3], int row, int col);
运行结果:
开始界面
***1开始游戏:***
***2退出游戏:***
**3游戏制作者:**
请输入你的选择:
输入1:
| |
___|___|___
| |
___|___|___
| |
请输入下棋坐标:1 1
* | |
___|___|___
| # |
___|___|___
| |
请输入下棋坐标:
结果:
平局!
电脑胜利!
玩家胜利!
如果觉得博主写的还过眼,请给个小小的赞支持一下下