用C语言编写的“井”字游戏。
遇到的一个报错:
具体原因well_border数组本质是指针类型,指向的是首元素的地址,如果用int或char 来接收显然不合适,以至于在引用下列定义的int类型的变量时候产生错误——表达式必须包含指向对象的指针类型,但他具有类型"int",解决的办法也很简单,在传参时用数组well_border[row][line]接收。
#include "game.h"
//游戏
void game(void)
{
char well_border[row][line] = { 0 };
//棋盘
for (int i = 0; i < row; i++)
{
for (int j = 0; j < line; j++)
{
well_border[i][j] = ' ';
}
}
printf("********************\n");
printf("**人vs电脑输入:>1**\n");
printf("**人vs 人输入:>2**\n");
printf("********************\n");
int k = 0;
scanf_s("%d", &k);
printf("游戏开始\n");
//清空屏幕
system("cls");
border(well_border);
//开始下棋
if (k == 2)
{
int count = 0;
while (1)
{
player1(well_border);
border(well_border);
count++;
if (count >= 5)
{
if (!verdict(well_border))
{
break;
}
}
player2(well_border);
border(well_border);
count++;
if (count >= 5)
{
if (!verdict(well_border))
{
break;
}
}
}
printf("游戏结束");
}
else
{
int count = 0;
while (1)
{
player1(well_border);
border(well_border);
count++;
if (count >= 5)
{
if (!verdict(well_border))
{
break;
}
}
computer(well_border);
border(well_border);
count++;
if (count >= 5)
{
if (!verdict(well_border))
{
break;
}
}
}
printf("游戏结束");
}
}
//棋盘
void border(char well_border[row][line])
{
int i = 0;
for (i = 0; i < row; i++)
{
for (int j = 0; j < line; j++)
{
printf(" %c ", well_border[i][j]);
if (j != line - 1)
{
printf("|");
}
}
printf("\n");
if (i != row - 1)
{
for (int j = 0; j < line; j++)
{
printf("---");
if (j != line - 1)
{
printf("+");
}
}
}
printf("\n");
}
}
//玩家1
void player1(char well_border[row][line])
{
while (1)
{
printf("玩家1请输入坐标x y\n");
int x = 0;
int y = 0;
scanf_s("%d %d", &x, &y);
if ((x >= 1 && x <= row + 1) && (y >= 1 && y <= line + 1))
{
if (well_border[x - 1][y - 1] == ' ')
{
well_border[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标已经被占用,请重新输入\n");
}
}
else
{
printf("输入错误");
}
}
}
//玩家2
void player2(char well_border[row][line])
{
while (1)
{
printf("玩家2请输入坐标x y\n");
int x = 0;
int y = 0;
scanf_s("%d %d", &x, &y);
if ((x >= 1 && x <= row + 1) && (y >= 1 && y <= line + 1))
{
if (well_border[x - 1][y - 1] == ' ')
{
well_border[x - 1][y - 1] = '#';
break;
}
else
{
printf("坐标已经被占用,请重新输入\n");
}
}
}
}
//电脑
void computer(char well_border[row][line])
{
printf("电脑正在输入坐标x y\n");
while (1)
{
int x = rand() % row;
int y = rand() % line;
if ((x >= 0 && x <= row ) && (y >= 0 && y <= line ))
{
if (well_border[x][y] == ' ')
{
well_border[x][y] = '#';
break;
}
}
}
}
//判断输赢
int verdict(char well_border[row][line])
{
//判断行
for (int i = 0; i < row; i++)
{
if ((i + 2) < row )
{
if ((well_border[i][i] == well_border[i][i + 1]) && (well_border[i][i] == well_border[i][i + 2]))
{
return 0;
}
}
}
//判断列
for (int i = 0; i < row; i++)
{
if ((i + 2) < line )
{
if ((well_border[i][i] == well_border[i + 1][i]) && (well_border[i][i] == well_border[i + 2][i]))
{
return 0;
}
}
}
//判断主斜线
for (int i = 0; i < row; i++)
{
if ((i + 2) <= (line - 1))
{
if ((well_border[i][i] == well_border[i + 1][i + 1]) && (well_border[i][i] == well_border[i + 2][i + 2]))
{
return 0;
}
}
}
//判断副斜线
if ((well_border[2][0] == well_border[1][1]) && (well_border[3][1] == well_border[0][3]))
{
return 0;
}
return 1;
}
#include "game.h"
int main()
{
srand((unsigned int)time(NULL));
begain:
printf("***********************\n");
printf("***开始游戏请输入:>1***\n");
printf("***退出游戏请输入:>2***\n");
printf("***********************\n");
int start = 0;
scanf_s("%d", &start);
switch (start)
{
case 1:
{
game();
break;
}
case 2:
{
printf("即将退出游戏\n");
break;
}
default:
{
printf("输入错误,请重新输入\n");
goto begain;
}
}
return 0;
}
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define row 3
#define line 3
void game(void);
void border(char well_border[row][line]);
void player1(char well_border[row][line]);
void player2(char well_border[row][line]);
int verdict(char well_border[row][line]);
void computer(char well_border[row][line]);