三子棋的想法和建立:
三子棋的想法思路:
1、首先,我第一个想到的是先打印出一个棋盘(input_board),棋盘上面必须有空位置以便下棋,需要一个如下的棋盘:
2、棋盘总共有9个空,所以要用行和列来确定具体要落子的哪个位置,就要引出二维数组的想法,棋盘中的每一个格子都应该有一个数组的位置,并且应该把每一位数组初始为“空格”(dispaly),更接近现实(这里我引入了两个函数:input_board和display)。
3、下来就是开始游戏了,首先应该给玩家一个选择界面(menu)是否进行游戏。
4、开始游戏,玩家先走(man_paly),玩家根据坐标(行:1,2,3;列:1,2,3)进行选择,然后标记,占用空格,并打印出来。然后电脑走(computer_paly),随机走,但应该解决已被占用的位置,因为想不到高大上的办法,所以我用了if语句,排除该位置是否有标记,没有标记的话,再落子。
5、判断棋盘是否满了(is_full),最后判断输赢(cheak_win)。
game.h:
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <windows.h>
#include<time.h>
#define ROW 3
#define COL 3
void dispaly(char arr1[ROW][COL], int row, int col);
void input_board(char arr1[ROW][COL], int row, int col);
void man_paly(char arr1[ROW][COL], int row, int col);
void computer_paly(char arr1[ROW][COL], int row, int col);
int is_full(char arr1[ROW][COL], int row, int col);
int cheak_win(char arr1[ROW][COL], int row, int col);
#endif __GAME_H__
text.c:
void game()
{
char arr1[ROW][COL] = { 0 };
dispaly(arr1, ROW, COL);
input_board(arr1, ROW, COL);
while (1)
{
man_paly(arr1, ROW, COL);
int ret = is_full(arr1, ROW, COL);
if (ret == 0)
{
input_board(arr1, ROW, COL);
break;
}
else
computer_paly(arr1, ROW, COL);
input_board(arr1, ROW, COL);
int a = cheak_win(arr1, ROW, COL);
if (a == 1)
{
printf("玩家获胜\n");
break;
}
else if (a == 0)
{
printf("电脑获胜\n");
break;
}
}
printf("游戏结束");
}
void menu()
{
printf("**************************\n");
printf("**** 欢迎来到三子棋 ****\n");
printf("**** 1. paly ****\n");
printf("**** 0. exit ****\n");
printf("**************************\n");
}
int main()
{
do
{
menu();
printf("请选择:");
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出\n");
break;
default:
printf("输入错误,请重新输入:");
break;
}
} while (1);
system("pause");
return 0;
}
game.c:
void dispaly(char arr1[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr1[i][j] = ' ';
}
}
}
void input_board(char arr1[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
printf("------------------------\n");
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", arr1[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
for (j = 0; j < row; j++)
{
if (i < row - 1)
{
printf("--- ");
}
}
printf("\n");
}
}
void man_paly(char arr1[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
while (1)
{
printf("请输入坐标:\n");
scanf("%d %d", &i, &j);
if (i >= 1 && i <= 3 && j >= 1 && j <= 3)
{
if (arr1[i - 1][j - 1] == ' ')
{
arr1[i - 1][j - 1] = 'X';
break;
}
else
{
printf("该位置被占\n");
}
}
else
{
printf("输入有误\n");
}
}
}
void computer_paly(char arr1[ROW][COL], int row, int col)
{
while (1)
{
srand((unsigned int)time(NULL));
int i = rand() % row;
int j = rand() % col;
if (arr1[i][j] == ' ')
{
arr1[i][j] = 'O';
break;
}
}
}
int is_full(char arr1[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr1[i][j] == 'X'&&arr1[i][j] == 'O')
{
return 0;
}
else
{
return 1;
}
}
}
}
int cheak_win(char arr1[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr1[0][0] == 'X'&&arr1[0][1] == 'X'&&arr1[0][2] == 'X' ||
arr1[1][0] == 'X'&&arr1[1][1] == 'X'&&arr1[1][2] == 'X' ||
arr1[2][0] == 'X'&&arr1[2][1] == 'X'&&arr1[2][2] == 'X' ||
arr1[0][0] == 'X'&&arr1[1][1] == 'X'&&arr1[2][2] == 'X' ||
arr1[2][0] == 'X'&&arr1[1][1] == 'X'&&arr1[0][2] == 'X')
{
return 1;
}
if (arr1[0][0] == 'O'&&arr1[0][1] == 'O'&&arr1[0][2] == 'O' ||
arr1[1][0] == 'O'&&arr1[1][1] == 'O'&&arr1[1][2] == 'O' ||
arr1[2][0] == 'O'&&arr1[2][1] == 'O'&&arr1[2][2] == 'O' ||
arr1[0][0] == 'O'&&arr1[1][1] == 'O'&&arr1[2][2] == 'O' ||
arr1[2][0] == 'O'&&arr1[1][1] == 'O'&&arr1[0][2] == 'O')
{
return 0;
}
}
}
}
这个游戏没有解决电脑堵人的问题,只是随机走空位,如有大佬无意看见,希望简单告知,我将感激不敬。
我是一个初学者,这是我的第一个博客,里面有很多不足与漏洞,如果读者发现,欢迎来批评改错,谢谢。