文章目录:
一:定义函数,打印游戏菜单。
二:宏定义打印棋盘,以及创建新文件以及头文件,例:game.c和game.h
1:定义函数初始化棋盘
2:定义函数打印棋盘以及分割线(重难点)
三:玩家下棋
四:电脑下棋
五:判断输赢(重难点)
六:代码全析总结
一、打印菜单
-
相信大家在打单机游戏的时候,肯定会看到一个菜单(目录),也就是在刚刚进入游戏的时候看到的选项,需要玩家输入数字进行选择
-
选择1(进入游戏)
-
选择0(退出游戏)
-
void venu() { printf("---------------------------\n"); printf("---1:开始游戏 2:结束游戏\n"); printf("---------------------------\n"); }
在主函数内进行游戏规划以及实现代码框架
在函数中会叫用rand()和srand()函数以及time()函数,注意记得调用其头文件:
#include<stdlib.h>以及#include<time.h>头文件,同时注意格式和运行的逻辑顺序
int main()
{
//打印游戏菜单
srand((unsigned int)time(NULL));
int input = 0;
do
{
venu();
printf("请输入数字\n");
scanf("%d", &input);
switch (input)
{//实现game游戏函数
case 1:game(); break;
case 0:printf("结束游戏\n"); break;
default:printf("输入错误,请重新输入\n"); break;
}
} while (input);
return 0;
}
二、棋盘打印
因为棋盘类似于一个二维数组,所以用一个二维数组来接收下的棋子的“字符”;
1:定义函数初始化棋盘
void Initboard(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; j++)
{
board[i][j] = ' ';
}
}
}
2:定义函数打印棋盘以及分割线(重难点)
为了格式美观,会将最后一列的格式线进行删除。
当for在行循环中进行到最后一行和一列时,注意:此时的行格式线和列格式线都要进行删除
void playboard(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;j++)
{
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
//控制行变化,不打印row最后一行
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
//控制不打印col最后一列
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
三:玩家下棋
那就是玩家(也就是你自己)下一步,然后电脑在下一步,直到谁赢,输,平局,所以无论在你下完一步后还是在电脑下完一步后,都要判断这局游戏的输赢,但是判断三字棋局的输赢,除了三字连成线,也就是横三条,竖三条,斜两条,可表示输赢,还有如果棋子下完了棋盘还没有分出胜负,那就是平局,其他情况就继续下棋。
用函数 Playgame();表示玩家下一步棋子,用字符‘*’表示,使用玩家输入的值,然后判断该坐标是否被占用,如果被占用则再次输入值进行填充表格
void playgame(char board[Row][Col], int row, int col)
{
int x = 0, y = 0;
while (1)
{ 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");
}
}
}
四:电脑下棋
使用Computergame()函数; 表示电脑下一步棋,用字符‘#’表示,在使用rand()函数,使电脑生成随机值,然后判断该坐标是否被占用,如果被占用则再次随机生成值进行填充表格。
void computergame(char board[Row][Col], int row, int col)
{
int x = 0, y = 0;
printf("电脑下棋\n");
while (1)
{ x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x ][y ] = '#';
break;
}
}
}
五:判断输赢(重难点)
再完成一个函数 Iswin();判断棋局输赢,需要一个返回值,如果玩家赢返回‘’;如果输返回‘#’,平局返回‘Q’,继续则返回‘C’
char iswin(char board[Row][Col], int row, int col)
{int i = 0, j = 0,count=0,flag=1;
//判断行是否相同
for (i = 0; i < row; i++)
{
if (board[i][0] == ' ')
continue;
count = 0;
for (j = 0; j < col-1; j++)
{
if (board[i][j] == board[i][j + 1])
count++;
}
if(count==row-1)
return board[i][0];
}
//判断列是否相同
for (i = 0; i < col; i++)
{
if (board[0][i] == ' ')
continue;
count = 0;
for (j = 0; j < row - 1; j++)
{
if (board[j][i] == board[j + 1][i])
count++;
}
if(count==col-1)
return board[0][j];
}
//判断主对角线是否相同
count = 0;
for (i = 0; i < row-1; i++)
{
if (board[0][0] == ' ')
break;
if (board[i][i] == board[i + 1][i + 1])
count++;
if (count == row-1)
return board[i][i];
}
//判断次对角线是否相同
count = 0;
for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--)
{
if (board[0][col-1] == ' ')
break;
if (board[i][j] == board[i+1][j-1])
count++;
if (count == row - 1)
return board[i][j];
}
//判断是否和棋
count = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 'c';
else
count++;
}
}
if (count == (row * col))
return 'Q';
}
六:代码全析总结
第一部分:主函数 例:源.c
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//打印菜单
void venu()
{
printf("---------------------------\n");
printf("---1:开始游戏 2:结束游戏\n");
printf("---------------------------\n");
}
void game()
{
char board[Row][Col] = { 0 };
//1:给board字符数组覆空格初始值
Initboard(board, Row,Col);
//2:打印表格
playboard(board, Row, Col);
char ret = 0;
while (1)
{//玩家下棋
playgame(board, Row, Col);
playboard(board, Row, Col);
//判断谁赢
ret=iswin(board, Row, Col);
if (ret != 'c')
break;
//电脑下棋
computergame(board, Row, Col);
playboard(board, Row, Col);
ret=iswin(board, Row, Col);
if (ret != 'c')
break;
}
if (ret == '*')
printf("玩家赢了\n");
else if (ret == '#')
printf("电脑赢了\n");
else
printf("和棋了\n");
}
int main()
{
//打印游戏菜单
srand((unsigned int)time(NULL));
int input = 0;
do
{
venu();
printf("请输入数字\n");
scanf("%d", &input);
switch (input)
{//实现game游戏函数
case 1:game(); break;
case 0:printf("结束游戏\n"); break;
default:printf("输入错误,请重新输入\n"); break;
}
} while (input);
return 0;
}
第二部分:实现三子棋的游戏头文件
#pragma once
#define Row 3
#define Col 3
//覆初始值
void Initboard(char board[Row][Col], int row, int col);
//打印表格
void playboard(char board[Row][Col], int row, int col);
//玩家下棋
void playgame(char board[Row][Col], int row, int col);
void computergame(char board[Row][Col], int row,int col);
char iswin(char board[Row][Col], int row, int col);
第三部分:(核心)游戏代码的实现
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
void Initboard(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; j++)
{
board[i][j] = ' ';
}
}
}
void playboard(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;j++)
{
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
//控制行变化,不打印row最后一行
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
//控制不打印col最后一列
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
void playgame(char board[Row][Col], int row, int col)
{
int x = 0, y = 0;
while (1)
{ 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 computergame(char board[Row][Col], int row, int col)
{
int x = 0, y = 0;
printf("电脑下棋\n");
while (1)
{ x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x ][y ] = '#';
break;
}
}
}
char iswin(char board[Row][Col], int row, int col)
{int i = 0, j = 0,count=0,flag=1;
//判断行是否相同
for (i = 0; i < row; i++)
{
if (board[i][0] == ' ')
continue;
count = 0;
for (j = 0; j < col-1; j++)
{
if (board[i][j] == board[i][j + 1])
count++;
}
if(count==row-1)
return board[i][0];
}
//判断列是否相同
for (i = 0; i < col; i++)
{
if (board[0][i] == ' ')
continue;
count = 0;
for (j = 0; j < row - 1; j++)
{
if (board[j][i] == board[j + 1][i])
count++;
}
if(count==col-1)
return board[0][j];
}
//判断主对角线是否相同
count = 0;
for (i = 0; i < row-1; i++)
{
if (board[0][0] == ' ')
break;
if (board[i][i] == board[i + 1][i + 1])
count++;
if (count == row-1)
return board[i][i];
}
//判断次对角线是否相同
count = 0;
for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--)
{
if (board[0][col-1] == ' ')
break;
if (board[i][j] == board[i+1][j-1])
count++;
if (count == row - 1)
return board[i][j];
}
//判断是否和棋
count = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 'c';
else
count++;
}
}
if (count == (row * col))
return 'Q';
}
最后真诚的祝愿每一位代码人都能够实现~~~~