c小游戏-三子棋
三子棋小游戏
经过几天学习,为了将之前学习的知识加以运用,于是写了一个简单的三子棋。
在写之前,先将游戏实现流程梳理一遍,
按照我们平常的游戏经验,进入游戏后,首先得有菜单,可以让玩家知道如何进入游戏。
在进入游戏后,需要一个3*3的棋盘。游戏一开始,棋盘内的内容需要初始化为空格
将棋盘打印出来后,等待玩家下棋后,电脑在接着下。在每一步下棋后,都需要确认游戏是否已出现胜负或者和棋。
在确认棋盘内还有空格,且没有出现三字连线的情况,那就要再重复玩家下棋,确认棋盘,电脑下棋,确认棋盘,直到出现胜负为止。
胜负确认后,再重新打印菜单,确认是否重新开始游戏。
分析完流程后,便可以开始写三子棋了。
#include<stdio.h>
#include<windows.h>
#define ROW 3
#define COW 3
#include<stdlib.h>
#include<time.h>
void Initboard(char board[ROW][COW], int row, int cow);
void Print(char board[ROW][COW], int row, int cow);
void Playchess(char board[ROW][COW], int row, int cow);
void computer(char board[ROW][COW], int row, int cow);
char Is`win(char board[ROW][COW], int row, int cow);
先将游戏的菜单页面给出。在打印菜单前顺便将屏幕清屏。
void menu()
{
system("cls");
printf("\n************************************\n");
printf("*************1 开始游戏*************\n");
printf("*************0 退出游戏*************\n");
printf("************************************\n");}`
菜单打印完后,便要由玩家选择是否开始游戏了
int main()
{int n;
do
{
menu();
scanf("%d", &n);
switch (n)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误");
break;
}
} while (n); //通过玩家选择的值,确定是否进入游戏。或者退出游戏。
在进入游戏后。就要进入游戏主体,而三子棋的游戏思路就是玩家下棋,判断胜负,电脑下棋,判断胜负,每一次下完棋后,都将棋盘当前画面打印,那么用代码表示就是:
void game()
{
char a;
char board[ROW][COW] = { 0 };
Initboard(board, ROW, COW);
system("cls");
Print(board, ROW, COW);
while (1)
{
Playchess(board, ROW, COW);
a = Iswin(board, ROW, COW);
if (a == 'a')
{
printf("和局\n");
break;
}
else if (a == '*')
{
printf("玩家胜");
break;
}
else if (a == '#')
{
printf("电脑胜");
break;
}
Print(board, ROW, COW);
computer(board, ROW, COW);
Print(board, ROW, COW);
a = Iswin(board, ROW, COW);
if (a == 'a')
{
printf("和局\n");
break;
}
else if (a == '*')
{
printf("玩家胜");
break;
}
else if (a == '#')
{
printf("电脑胜");
break;
}
}
printf("按任意键继续\n");
getch();
}
现在为止已经将大致的逻辑写清,只剩将每个函数的内容补充。
首先是创建一个3* 3的棋盘。也就是一个3*3的二维数组,再将数组内容全部初始化为空格’ ’;
void Initboard(char board[ROW][COW], int row, int cow)//初始化棋盘
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
board[i][j] = ' ';
}
}
}
初始化好之后,自然要将棋盘打印出来,这样才能让用户选择坐标。
void Print(char board[ROW][COW], int row, int cow)//打印棋盘
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
printf(" %c ", board[i][j]);
if (j != cow - 1)//在棋盘打印到最后一排时不打印 ’|’
{
printf("|");
}
}
printf("\n");
for (j = 0; j < cow; j++)
{
if (i < row - 1)
{
printf("---");
if (j < cow - 1)
{
printf("|");
}
}
}printf("\n");
}
}
打印完棋盘后,需要用户输入坐标下棋,那我们就写一个下棋函数
void Playchess(char board[ROW][COW], int row, int cow)//玩家下棋
{
int x = 0, y = 0;
while (1)
{
printf("请输入坐标:>\n");
scanf("%d%d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= cow)
{
if (board[x-1][y-1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标重复!");
}
}
else
{
printf("输入错误!\n");
}
}
}
每下完一步,游戏就有可能出现胜负,或者棋盘已被下满的情况,所以我们要再写一个函数确认。
char deuce(char board[ROW][COW], int row, int cow)//判断棋盘是否还要空位
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
if (board[i][j] == ' ')
{
return 'C';
}
}
}
return 'a';
}
char Iswin(char board[ROW][COW], int row, int cow)//判断游戏是否出现胜利条件或者棋盘是否还有空位
{
int i;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][1];
}
else if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] || board[2][0] == board[1][1] && board[0][2])
{
return board[1][1];
}
return(deuce(board, row, cow));//当遍历完没有出现胜利条件,便判断棋盘内是否还有空位。
}
通过函数返回的值进行确认。
while (1)
{
Playchess(board, ROW, COW);
a = Iswin(board, ROW, COW);
if (a == 'a')
{
printf("和局\n");
break;
}
else if (a == '*')
{
printf("玩家胜");
break;
}
else if (a == '#')
{
printf("电脑胜");
break;
}
如果游戏继续,那就回到玩家下棋,再进行循环,直到出现胜负或者和局break跳出后再结束循环,回到菜单界面询问是否进入下次游戏。
到此,一个三子棋便新鲜出炉了。但是在这个三子棋中,判断胜利的代码是锁死只能判断3*3的棋盘,如果棋盘大小改变,那代码又要重新修改,不过今天的任务便是先出这样一份三字棋便可。
感谢大佬观看到这。如果代码中有哪些不足之处也请大家多多指出。

浙公网安备 33010602011771号