大家小时候在生活中也玩过三子棋的游戏吧,大概规则就是,在一个3X3的方格上每次下一步棋,当下完每一行或每一列连成连续的三个子时就为获胜,斜着的三个字也算获胜,下面就讲一讲,我对实现这个小游戏整体的代码思路,这里我们预先要建造一个头文件game.h 一个game.c ,一个主函数代码test.c
1.目录
设计一个目录,让玩家进入游戏,这里我们写个menu()函数,同时,给个switch语句让玩家进入界面后选择。
void menu()//菜单
{
printf("***************************\n");
printf("*****1.play 0.exit*********\n");
printf("***************************\n");
}
do
{
menu();
printf("请选择->\n");
scanf("%d",&input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
default:
{
printf("输入错误\n");
break;
}
}
} while (input);
2,棋盘的初始化和打印
既然要下游戏,那我就要创建一个棋盘的界面来供玩家下棋,这里设计一个棋盘,同时看起来要是空的3X3的格子供玩家和电脑下棋,这里我们写两个函数,让board这个二维数组每个格子初始化成空格,同时为了方便我们后续改成四子棋或者五子棋,这里的数组大小,我们统一用定义好的ROW 和COL 来代替3 3,这样后续修改只需修改ROW 和 COL的值,这里注意DisplayBoard函数里有个if(i < row - 1)目的是为了让末尾的最后一行减少分割行和数组。效果就是这样的,
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (i < row)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//打印数组信息
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");//打印分割行
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
}
3玩家下棋
玩家下棋需要判断下棋的位置是否为空格,或者被其他占用,所以这里使用两个IF语句
void PlayMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋");
printf("请输入坐标");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,不能下棋\n");
}
}
else
{
printf("输入坐标违法\n");
}
}
}
4.电脑下棋
电脑下棋就比较简单了,给个循环检测哪里有空格就在哪里下棋'#'
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
5判断胜利
这里是小游戏的整体核心,因为这里涉及到四个点
1.玩家赢
2.电脑赢了
3.平局
4.继续下棋
这里我们假设,玩家赢了return '*',电脑赢了return '#',平局return 'Q',继续下棋return 'c'这四个判断条件
5.1这里判断玩家赢和电脑赢,要判断每一行是否有一样的字符,以及每一列有共同的字符,同时还要对应对角线是否有一样的字符,同时这些字符不等于空格,在后面我们还要判断平局和是否继续下棋的情况,这里写个判断是否占满格子的函数来判断后两个是否平局和是否继续下棋, 判断函数代码如下
char JudgeWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col-1; j++)
{
if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
{
if (j == col - 2)
{
return board[i][j];//判断谁赢
}
}
}
}
int j = 0;
for (j = 0; j < col; j++)
{
int i = 0;
for (i = 0; i < row-1; i++)
{
if (board[i][j] == board[i+1][j] && board[i][j] != ' ')
{
if (i == row - 2)
{
return board[i][j];
}
}
}
}
int x = 0;
for (x = 0; x < row-1; x++)
{
if (board[x][x] == board[x + 1][x + 1] && board[x][x] != ' ')
{
if (x == row - 2)
{
return board[x][x];
}
}
}
int p = 0;
int n = col-1;
while(1)
{
if (board[p][n] == board[p + 1][n - 1] && board[p][n] != ' '&& p<=row-2 && n>=1)
{
if (p == row - 2 && n == 1)
{
return board[p][n];
}
p++;
n--;
}
else
{
break;
}
}
if (isfull(board, row, col))
{
return 'Q';
}
return 'c';
}
int isfull(char board[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 (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
6.输出结果
上面说了输出四种情况的字符,那我们主函数写起来就很简单了,四个判断条件并且输出棋盘结果
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);//初始化棋盘
DisplayBoard(board, ROW, COL);//打印棋盘
//玩家下棋了
while (1)
{
PlayMove(board, ROW, COL);//玩家下棋
ret = JudgeWin(board, ROW, COL);//判断是否赢了
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);//打印棋盘
ComputerMove(board, ROW, COL);//电脑下棋
ret =JudgeWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);//打印棋盘
}
if (ret == '*')
{
printf("玩家赢了\n");
}
else if (ret == '#')
{
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
DisplayBoard(board, ROW, COL);//打印棋盘
}
7.最终梳理
最后我们这个小游戏就写完了,梳理一下,下面是三个文件对应的代码
game.h
#pragma once
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
#include<stdlib.h>
#include<time.h>
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char JudgeWin(char board[ROW][COL], int row, int col);
game.c
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (i < row)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//打印数组信息
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");//打印分割行
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
}
void PlayMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋");
printf("请输入坐标");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,不能下棋\n");
}
}
else
{
printf("输入坐标违法\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int isfull(char board[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 (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char JudgeWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col-1; j++)
{
if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
{
if (j == col - 2)
{
return board[i][j];//判断谁赢
}
}
}
}
int j = 0;
for (j = 0; j < col; j++)
{
int i = 0;
for (i = 0; i < row-1; i++)
{
if (board[i][j] == board[i+1][j] && board[i][j] != ' ')
{
if (i == row - 2)
{
return board[i][j];
}
}
}
}
int x = 0;
for (x = 0; x < row-1; x++)
{
if (board[x][x] == board[x + 1][x + 1] && board[x][x] != ' ')
{
if (x == row - 2)
{
return board[x][x];
}
}
}
int p = 0;
int n = col-1;
while(1)
{
if (board[p][n] == board[p + 1][n - 1] && board[p][n] != ' '&& p<=row-2 && n>=1)
{
if (p == row - 2 && n == 1)
{
return board[p][n];
}
p++;
n--;
}
else
{
break;
}
}
if (isfull(board, row, col))
{
return 'Q';
}
return 'c';
}
test.c
#include"game.h"
void menu()//菜单
{
printf("***************************\n");
printf("*****1.play 0.exit*********\n");
printf("***************************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);//初始化棋盘
DisplayBoard(board, ROW, COL);//打印棋盘
//玩家下棋了
while (1)
{
PlayMove(board, ROW, COL);//玩家下棋
ret = JudgeWin(board, ROW, COL);//判断是否赢了
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);//打印棋盘
ComputerMove(board, ROW, COL);//电脑下棋
ret =JudgeWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);//打印棋盘
}
if (ret == '*')
{
printf("玩家赢了\n");
}
else if (ret == '#')
{
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
DisplayBoard(board, ROW, COL);//打印棋盘
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择->\n");
scanf("%d",&input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
default:
{
printf("输入错误\n");
break;
}
}
} while (input);
return 0;
}