前言
3*3格子上进行的连珠游戏,先明确制作这个游戏所需要的内容,首先要有一个游戏入口,然后是棋盘,接着是玩家走和电脑走,最后是输赢判断
凭借之前所学的内容,我们已经足够有能力做出井字棋这款游戏,快试一下!(有点尴尬)
一、游戏入口
void menu()
{
printf("#########################\n");
printf("#####1.play 0.eixt#####\n");
printf("#########################\n");
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
} while (input);
}
这里使用的循环语句do while来做游戏的入口,一个很巧妙的地方,当输入的input不为0时就不会结束,当输入0之后,do while判断为假,将会结束程序。
二、初始化棋盘
我们先要在头文件部分定义棋盘的大小
.h文件中
#define ROW 3
#define COL 3
初始化一个棋盘,需要棋盘board,大小row和col
void InitBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
三、打印棋盘
打印棋盘需要棋盘board,大小row和col
void DisplayBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
就会得到一个标准的井字棋棋盘
四、玩家移动
void PlyaerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y); x,y代表玩家下的坐标
if (x > 0 && x <= row && y> 0 && y <= col && board[x-1][y-1] == ' ') x和y需要限制在3*3棋盘的范围内
{
board[x - 1][y - 1] = '#'; 这里玩家放置的标志为 #
break;
}
else if(x > 0 && x <= row && y> 0 && y <= col && board[x-1][y-1] != ' ')
{
printf("该坐标已被占用\n");
}
else
{
printf("该坐标违法\n");
}
}
}
五、电脑移动
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % 3; 需要用到随机数,模3得到的结果只会是0 1 2
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '*'; 电脑走的标志为 *
break;
}
}
}
六、判断输赢
判断是否平局,排查是否有空位置
int is_win(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
判断是否输赢
char IsWin(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
横的连成线
if (board[i][1] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][1];
}
竖的连成线
else if (board[1][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[1][i];
}
}
对角线连成线
if (board[1][1] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
return board[1][1];
}
else if (board[1][1] != ' ' && board[2][0] == board[1][1] && board[1][1] == board[0][2])
{
return board[1][1];
}
判断是否平局
else if (is_win(board, row, col))
{
return 'q';
}
else
{
return 'c';
}
}
七、完整代码
game.h头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InitBoard(char board[ROW][COL],int row ,int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlyaerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
game.c文件
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void PlyaerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
if (x > 0 && x <= row && y> 0 && y <= col && board[x-1][y-1] == ' ')
{
board[x - 1][y - 1] = '#';
break;
}
else if(x > 0 && x <= row && y> 0 && y <= col && board[x-1][y-1] != ' ')
{
printf("该坐标已被占用\n");
}
else
{
printf("该坐标违法\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
int is_win(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
if (board[i][1] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][1];
}
else if (board[1][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[1][i];
}
}
if (board[1][1] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
return board[1][1];
}
else if (board[1][1] != ' ' && board[2][0] == board[1][1] && board[1][1] == board[0][2])
{
return board[1][1];
}
else if (is_win(board, row, col))
{
return 'q';
}
else
{
return 'c';
}
}
test.c文件
#include"game.h"
void game()
{
char board[ROW][COL] = { 0 };
char ret;
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
while (1)
{
PlyaerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret == '#')
{
printf("玩家赢\n");
break;
}
if (ret == 'q')
{
printf("平局\n");
break;
}
ComputerMove(board, ROW, COL);
ret = IsWin(board, ROW, COL);
DisplayBoard(board, ROW, COL);
if (ret == '*')
{
printf("电脑赢\n");
break;
}
if (ret == 'q')
{
printf("平局\n");
break;
}
}
}
void menu()
{
printf("#########################\n");
printf("#####1.play 0.eixt#####\n");
printf("#########################\n");
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
} while (input);
}