一.我们写一个游戏小程序,希望吧能够再玩过一局之后,可以选择继续游戏或者退出,所以我们先写一个循环让程序可以持续的运行起来。
在这里我们选择do while循环,它与while循环相比会无条件的运行一次符合我们对游戏的要求。
然后我们在循环内添加一个菜单
到这一步之后我们需要添加一个分支选项,输入0程序结束,输入1进入游戏模块,输入这两个以外的内容重新输入。
在这里我们利用c语言中0为假非0为真的特性,让n=0时结束循环。
此时一个基础的菜单我们就写好了
二.游戏的实现
1.三子棋首先我们需要一个棋盘
二维数组符合我们对棋盘的要求,所以我们可以定第一个二维数组来作为我们的棋盘。
void game()
{
char board[ROW][COL];
}
其中row和col是我们在头文件中定义的一个宏,此举是为了方便后面的更改。例如我需要一个15x15的棋盘我只需要在头文件中将宏改为15即可,此处我们的col,row为3。
2.棋盘的初始化
此时我们创建了一个二维数组,我们需要对其进行初始化。鉴于初始棋盘的需要我们要将数组元素全部初始化为空。
void init_board(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 printf_board(char board[ROW][COL], int row, int col)
{
int i, j = 0;
for (i = 0; i < row; i++)
{
int s = 0;
for (s = 0; s < row-1; s++)
{
printf(" |");
}
printf("\n");
for (j = 0; j < col; j++)
{
if (j == (col - 1))
{
printf(" %c ",board[i][j]);
break;
}
printf(" %c |", board[i][j]);
}
printf("\n");
if (i == row-1)
break;
for (s = 0; s < row; s++)
{
if (s == (col - 1))
{
printf("---");
break;
}
printf("---|");
}
printf("\n");
}
}
打印一个符合自己需求的棋盘,无需太过纠结
3.首先是玩家下棋函数
void play_chess(char board[ROW][COL], int row, int col)
{
int i, j = 0;
while (1)
{
scanf("%d%d", &i, &j);
if (i <= row && j <= col && i > 0 && j > 0 && board[i-1][j-1] == ' ')
{
board[i-1][j-1] = 'X';
break;
}
else
printf("坐标非法请重新输入");
}
}
4.电脑下棋函数
当然你也可以再加一个二号玩家下期函数,此处我们以电脑下棋函数进行介绍,当然由于篇幅问题我们不对其进行优化,仅做介绍
void computer_board(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
printf_board(board, ROW, COL);
}
5.判断输赢
首先要先判断棋盘是否已满。
如果未满我们从数组的左上角开始遍历,当识别到有棋子的格子时让它忘下,右,斜右下方三个方向进行识别看是否有三个棋子
当识别到有三个棋子时说明执该棋子的玩家获胜我们将棋子符号返回就知道谁胜利了
如果遍历完整个数组之后都未发现则说明无人胜利,游戏继续,注意避免越界。
int whether_full(char board[ROW][COL], int row, int col)//判断棋盘是否已满,已满返回1,还存在空位返回0
{
int i,j=0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char whether_win(char board[ROW][COL], int row, int col)
{
int fu=whether_full(board, row, col);
int i = 0;
int j = 0;
for (i = 0; i < row; i++)//判断输赢部分
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
{
int s = i;
int k = j;
int tem = 1;
while (s++ < row)//判断纵向
{
if (board[s][j] == board[i][j])
tem++;
if (tem == pieces)
return board[i][j];
}
tem = 1;
while (k++ < col)//判断横向
{
if (board[i][k] == board[i][j])
tem++;
if (tem == pieces)
return board[i][j];
}
s,k = 0;
tem = 1;
while (s++ < row && k++ < col)//斜向
{
if (board[s][k] == board[i][j])
tem++;
if (tem == pieces)
return board[i][j];
}
}
}
}
if (fu)
{
printf("本局平局\n");
return 'f';
}
}
整体代码
头文件部分play.h
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
#define pieces 3
void init_board(char board[ROW][COL],int row ,int col);//初始化棋盘
void printf_board(char board[ROW][COL], int row, int col);//打印棋盘
void player_chess(char board[ROW][COL],int row, int col);//下棋
void computer_board(char board[ROW][COL], int row, int col);//电脑下棋
char whether_win(char board[ROW][COL], int row, int col);//判断输赢
游戏函数模块play.c
#include "play.h"
void init_board(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 printf_board(char board[ROW][COL], int row, int col)
{
int i, j = 0;
for (i = 0; i < row; i++)
{
int s = 0;
for (s = 0; s < row-1; s++)
{
printf(" |");
}
printf("\n");
for (j = 0; j < col; j++)
{
if (j == (col - 1))
{
printf(" %c ",board[i][j]);
break;
}
printf(" %c |", board[i][j]);
}
printf("\n");
if (i == row-1)
break;
for (s = 0; s < row; s++)
{
if (s == (col - 1))
{
printf("---");
break;
}
printf("---|");
}
printf("\n");
}
}
void player_chess(char board[ROW][COL], int row, int col)
{
int i, j = 0;
while (1)
{
scanf("%d%d", &i, &j);
if (i <= row && j <= col && i > 0 && j > 0 && board[i-1][j-1] == ' ')
{
board[i-1][j-1] = 'X';
printf_board(board, ROW, COL);
break;
}
else
printf("坐标非法请重新输入>:");
}
}
void computer_board(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
printf_board(board, ROW, COL);
}
int whether_full(char board[ROW][COL], int row, int col)
{
int i,j=0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char whether_win(char board[ROW][COL], int row, int col)
{
int fu=whether_full(board, row, col);
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
{
int s = i;
int k = j;
int tem = 1;
while (s++ < row)//判断纵向
{
if (board[s][j] == board[i][j])
tem++;
if (tem == pieces)
return board[i][j];
}
tem = 1;
while (k++ < col)//判断横向
{
if (board[i][k] == board[i][j])
tem++;
if (tem == pieces)
return board[i][j];
}
s = i;
k = j;
tem = 1;
while (s++ < row && k++ < col)//斜向
{
if (board[s][k] == board[i][j])
tem++;
if (tem == pieces)
return board[i][j];
}
}
}
}
if (fu)
{
printf("本局平局\n");
return 'f';
}
return 0;
主函数部分test.c
#include "play.h"标签:例来,int,棋小,++,游戏吧,board,printf,col,row From: https://blog.51cto.com/u_15572441/5780271
void mean()
{
printf("**************************\n");
printf("********* 0.退出 ********\n");
printf("******* 1.开始游戏 ****\n");
printf("**************************\n");
}
void game()
{
char board[ROW][COL];
init_board(board, ROW, COL);
printf_board(board, ROW, COL);
char ch = whether_win(board, ROW, COL);
while (1)
{
printf("请输入下棋坐标>:");
player_chess(board, ROW, COL);
ch = whether_win(board, ROW, COL);
if (ch == '#' || ch == 'X' || ch == 'f')
break;
computer_board(board, ROW, COL);
ch = whether_win(board, ROW, COL);
if (ch == '#' || ch == 'X' || ch == 'f')
break;
}
if (ch == '#')
printf("电脑获得胜利\n");
else if (ch == 'X')
printf("恭喜玩家获得了胜利\n");
printf_board(board, ROW, COL);
}
int main()
{
int n = 0;
srand((unsigned int)time(NULL));
do
{
mean();
scanf("%d", &n);
switch (n)
{
case 0:
break;
case 1:
game();
break;
default:
printf("请选择正确的选项\n");
break;
}
} while (n);
return 0;
}