问题很多啊!!!!!!!!!!!!!!!!
1.玩家和电脑无法输出数值的原因仅仅是“‘*’”中多打了一个空格(无语)
2.函数的数组传参忘记加”[]“,导致程序一直报错
3.game.c中判断棋盘中落子是否已满的函数返回类型是int而不是char
4.game.c中void game里判断平局的条件,两个if(ret != ‘j’ )不能省,否则会导致“当棋盘落子已满,玩家/电脑才获胜的情况时,棋盘无法重新刷新”;而且不能将判断输赢的语句写在ret!=j的判断语句里面,会导致平局情况时无法输出结果
5.判断输赢情况的函数中一开始忘加for语句,导致变量无法改变
#include "game.h"
int board_full(char board[h][l], int hang, int lie)
{
int x = 0;
int y = 0;
for (x = 0; x < hang; x++)
{
for (y = 0; y < lie; y++)
{
if (board[x][y] == ' ')
{
return 0;//棋子没满
}
}
}
return 1;//棋盘已满
}
char panduan(char board[h][l], int hang, int lie)//*玩家获胜,#电脑获胜,p平局,j继续
{
int x = 0;
int y = 0;
for (x = 0; x < hang; x++)//横3行
{
if (board[x][0] == board[x][1] && board[x][0] == board[x][2] && board[x][0] != ' ')
{
return board[x][0];
}
}
for ( y = 0; y < lie; y++)//竖3列
{
if (board[0][y] == board[1][y] && board[0][y] == board[2][y] && board[0][y] != ' ')
{
return board[0][y];
}
}
if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')//对角线
return board[0][0];
if (board[2][0] == board[1][1] && board[2][0] == board[0][2] && board[2][0] != ' ')
return board[2][0];
if (1 == board_full(board, h, l))
{
return 'p';
}
return 'j';
}
void computer(char board[h][l], int hang, int lie)
{
int x = 0;
int y = 0;
printf("电脑下棋:\n");
while (1)
{
x = rand() % hang;
y = rand() % lie;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
void user(char board[h][l], int hang, int lie)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入你要填的坐标:");
scanf("%d%d", &x, &y);
printf("\n玩家下棋:\n");
if (x >= 1 && x <= hang && y >= 1 && y <= lie)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该坐标已被占用!\n");
}
}
else
{
printf("坐标不合法,请重新输入:\n");
}
}
}
void board_display(char board[h][l],int hang,int lie)
{
int i = 0;
int j = 0;
for ( i = 0; i < hang; i++)
{
for ( j = 0; j < lie; j++)//打印“ | | ”,共3行
{
printf(" %c ", board[i][j]);
if (j < lie - 1)
{
printf("|");
}
}
printf("\n");
if (i < hang - 1)
{
for ( j = 0; j < lie; j++)//打印“---|---|---”,共2行
{
printf("---");
if (j < lie - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
void board_menu(char board[h][l], int hang, int lie)
{
int i = 0;
int j = 0;
for ( i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
board[i][j] = ' ';
}
}
}
void game()
{
char board[h][l] = { 0 };
char ret = 0;
board_menu(board, h, l);//初始化棋盘
board_display(board, h, l);//打印棋盘
while (1)//开始下棋
{
user(board, h, l);//玩家
board_display(board, h, l);
ret = panduan(board, h, l);
if (ret != 'j')
{
break;
}
computer(board, h, l);//电脑
board_display(board, h, l);
ret = panduan(board, h, l);
if (ret != 'j')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢!\n");
}
else if (ret == '#')
{
printf("电脑赢!\n");
}
else
{
printf("平局!\n");
}
}
#include "game.h"
void menu()
{
printf("\n************************************\n");
printf("************************************\n");
printf("************ 0.exit ***************\n");
printf("************ 1.play ***************\n");
printf("************************************\n");
printf("************************************\n");
}
int main()
{
srand((unsigned int)time(NULL));
int i = 0;
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &i);
switch (i)
{
case 0:
printf("退出游戏!\n");
break;
case 1:
printf("开始游戏!初始棋盘如下:\n");
game();
break;
default:
printf("输入错误!\n");
break;
}
} while (i);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#define h 3
#define l 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game();
void board_menu(char board[h][l], int hang, int lie);
void board_display(char board[h][l], int hang, int lie);
void user(char board[h][l], int hang, int lie);
void computer(char board[h][l], int hang, int lie);
char panduan(char board[h][l], int hang, int lie);
int board_full(char board[h][l], int hang, int lie);