目录
2)之后就是做选择了,我们需要switch来帮助判断,if也可以
4)接下来就是打印棋盘了,棋盘格式自定,行,列和胜利时的棋子数的定义建议用宏定义,可以参考我的
5) 接下来实现人下棋,实际就是给数组赋值(不为空,并且位于数组里面)
6)然后就是电脑下棋,用随机值赋值(要为空并且属于数组里面),随机值的设定可以参考我的文章
一.思路分享(源码在最后)
首先从main函数开始
1)我们首先要打印菜单,可以参考我的菜单
void menu() {
printf("******************\n");
printf("***** 1.开始 *****\n");
printf("***** 0.退出 *****\n");
printf("******************\n");
}
因为我们可能要玩多局,所以,我们需要循坏报括它
2)之后就是做选择了,我们需要switch来帮助判断,if也可以
int choose;
do {
menu();
scanf("%d", &choose);
switch (choose) {
case 0:
printf("正在退出\n");
break;
case 1:game();
break;
default:
printf("没有这个输入选项,请重新输入\n");
}
} while (choose);
3)选择游戏之后我们就要开始写游戏的细节了
游戏首先需要棋盘,和棋子,棋子我建议用二维数组代替,一开始用空白格填充,那我们就需要一个函数初始化函数,初始化函数只要一个循坏嵌套就行了,参数需要数组和数组大小就能实现
void init(char arr[Row][Col], int row, int col) {
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
arr[i][j] = ' ';
}
4)接下来就是打印棋盘了,棋盘格式自定,行,列和胜利时的棋子数的定义建议用宏定义,可以参考我的
#define Row 10//改变棋盘行数
#define Col 10//改变棋盘列数
#define Times 5//改变胜利棋子数
void menu1(char arr[Row][Col], int row, int col) {
int i, j;
for (j = 0; j < row; j++) {
for (i = 0; i < col; i++) {
printf(" %c ", arr[j][i]);
if (i < row - 1)
printf("|");
}
printf("\n");
if(j<row-1)
for (i = 0; i < col; i++) {
printf("---");
if (i < col - 1)
printf("|");
}
printf("\n");
}
}
效果如下
5) 接下来实现人下棋,实际就是给数组赋值(不为空,并且位于数组里面)
void playmove(char arr[Row][Col], int row, int col) {
int x, y;
while (1) {
printf("玩家下棋->");
scanf("%d%d", &x, &y);
printf("\n");
if (x < row + 1 && y < col + 1 && arr[x-1][y-1] == ' ') {
arr[x-1][y-1] = '*';
break;
}
else printf("输入错误或者输入的位置已经被下过,请重新下棋\n");
}
}
6)然后就是电脑下棋,用随机值赋值(要为空并且属于数组里面),随机值的设定可以参考我的文章
void computermove(char arr[Row][Col], int row, int col) {
while (1) {
int x = rand() % row;
int y = rand() % col;
if (arr[x][y] == ' ') {
arr[x][y] = '#';
break;
}
}
}
因为每下一步棋电脑和人都可能赢了,所以我们每下一部棋多要判断并打印棋盘
判断代码:如果棋盘满了返回Q(平局),C(继续),*(人胜利),#(电脑胜利)
我分了六个部分判断是否有人赢
第一个部分判断是否每一行有足够相同字符
for (i = 0; i < row; i++) {
for (j = 0, flag = 0; j < col; j++) {
if (arr[i][j] == arr[i][count]&&arr[i][count]!=' ')
flag++;
else {
flag = 0;
count = j;
}
if (flag == times)return arr[i][j];
}
第二个部分检查每一列
for (i = 0; i < col; i++) {
for (j = 0, flag = 0; j < row; j++) {
if (arr[j][i] == arr[count][j] && arr[j][i] != ' ')
flag++;
else {
flag = 0;
count = j;
}
if (flag == times)return arr[i][j];
}
}
第三个部分
for (i=0; i < row; i++) {
flag = 0;
j = 0;
count = 0;
count1 = i;
k = i;
while (k < row && j < col) {
if (arr[k][j] == arr[count1][count]&& arr[count1][count]!=' ')
flag++;
else {
flag = 0;
count = j;
count1 = k;
}
if (flag == times)return arr[count1][count];
k++;
j++;
}
}
第四个部分
for (i = 0; i < row; i++) {
flag = 0;
j = 0;
count = col-1;
count1 = i;
k = i;
while (k < row && j < col) {
if (arr[k][j] == arr[count1][count]&&arr[k][j]!=' ')
flag++;
else {
flag = 0;
count = j;
count1 = k;
}
if (flag == times)return arr[count1][count];
k++;
j--;
}
}
第五个部分
for (i = 0, j = col - 1; j > 0; j--) {
flag = 0;
i = 0;
count = j;
count1 = 0;
k = j;
while (k < col && i<row) {
if (arr[i][k] == arr[count1][count]&& arr[count1][count]!=' ')
flag++;
else {
flag = 0;
count = k;
count1 = i;
}
if (flag == times)return arr[count1][count];
k--;
i++;
}
}
第六个部分
for (i = 0,j=0; j < col; j++) {
flag = 0;
i = 0;
count = j;
count1 = i;
k = j;
while (i < row && k < col) {
if (arr[i][k] == arr[count1][count]&&arr[i][k]!=' ')
flag++;
else {
flag = 0;
count = k;
count1 = i;
}
if (flag == times)return arr[count1][count];
k++;
i++;
}
}
7)最后遍历一次即可判断完成
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
if (arr[i][j] != ' ')count++;
else break;
if (count == row * col)return 'Q';
else return 'C';
8)最后串联在一起
void game() {
char c='C';
int result = 1;
char arr[Row][Col];
init(arr, Row, Col);
menu1(arr, Row, Col);
while (c=='C') {
playmove(arr, Row, Col);
menu1(arr, Row, Col);
c = iswin(arr, Row, Col, Times);
if (c != 'C')break;
computermove(arr, Row, Col);
menu1(arr, Row, Col,Times);
c = iswin(arr, Row, Col, Times);
}
if (c == '*')printf("玩家胜利\n");
else if (c == '#')printf("电脑胜利\n");
else printf("平局\n");
}
二.展示源码
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define Row 10//改变棋盘行数
#define Col 10//改变棋盘列数
#define Times 5//改变胜利棋子数
void menu();
void game();
void init(char arr[Row][Col], int row, int col);
void menu1(char arr[Row][Col], int row, int col);
void playmove(char arr[Row][Col], int row, int col);
void computermove(char arr[Row][Col], int row, int col);
char iswin(char arr[Row][Col], int row, int col,int times);
int main() {
srand((unsigned int)time(NULL));
int choose;
do {
menu();
scanf("%d", &choose);
switch (choose) {
case 0:
printf("正在退出\n");
break;
case 1:game();
break;
default:
printf("没有这个输入选项,请重新输入\n");
}
} while (choose);
return 0;
}
void menu() {
printf("******************\n");
printf("***** 1.开始 *****\n");
printf("***** 0.退出 *****\n");
printf("******************\n");
}
void game() {
char c='C';
int result = 1;
char arr[Row][Col];
init(arr, Row, Col);
menu1(arr, Row, Col);
while (c=='C') {
playmove(arr, Row, Col);
menu1(arr, Row, Col);
c = iswin(arr, Row, Col, Times);
if (c != 'C')break;
computermove(arr, Row, Col);
menu1(arr, Row, Col,Times);
c = iswin(arr, Row, Col, Times);
}
if (c == '*')printf("玩家胜利\n");
else if (c == '#')printf("电脑胜利\n");
else printf("平局\n");
}
void init(char arr[Row][Col], int row, int col) {
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
arr[i][j] = ' ';
}
void menu1(char arr[Row][Col], int row, int col) {
int i, j;
for (j = 0; j < row; j++) {
for (i = 0; i < col; i++) {
printf(" %c ", arr[j][i]);
if (i < row - 1)
printf("|");
}
printf("\n");
if(j<row-1)
for (i = 0; i < col; i++) {
printf("---");
if (i < col - 1)
printf("|");
}
printf("\n");
}
}
void playmove(char arr[Row][Col], int row, int col) {
int x, y;
while (1) {
printf("玩家下棋->");
scanf("%d%d", &x, &y);
printf("\n");
if (x < row + 1 && y < col + 1 && arr[x-1][y-1] == ' ') {
arr[x-1][y-1] = '*';
break;
}
else printf("输入错误或者输入的位置已经被下过,请重新下棋\n");
}
}
void computermove(char arr[Row][Col], int row, int col) {
while (1) {
int x = rand() % row;
int y = rand() % col;
if (arr[x][y] == ' ') {
arr[x][y] = '#';
break;
}
}
}
char iswin(char arr[Row][Col], int row, int col, int times) {
int i, flag = 0, j, count = 0, k, count1;
for (i = 0; i < row; i++) {
for (j = 0, flag = 0; j < col; j++) {
if (arr[i][j] == arr[i][count]&&arr[i][count]!=' ')
flag++;
else {
flag = 0;
count = j;
}
if (flag == times)return arr[i][j];
}
count = 0;
for (i = 0; i < col; i++) {
for (j = 0, flag = 0; j < row; j++) {
if (arr[j][i] == arr[count][j] && arr[j][i] != ' ')
flag++;
else {
flag = 0;
count = j;
}
if (flag == times)return arr[i][j];
}
}
}
for (i=0; i < row; i++) {
flag = 0;
j = 0;
count = 0;
count1 = i;
k = i;
while (k < row && j < col) {
if (arr[k][j] == arr[count1][count]&& arr[count1][count]!=' ')
flag++;
else {
flag = 0;
count = j;
count1 = k;
}
if (flag == times)return arr[count1][count];
k++;
j++;
}
}
for (i = 0; i < row; i++) {
flag = 0;
j = 0;
count = col-1;
count1 = i;
k = i;
while (k < row && j < col) {
if (arr[k][j] == arr[count1][count]&&arr[k][j]!=' ')
flag++;
else {
flag = 0;
count = j;
count1 = k;
}
if (flag == times)return arr[count1][count];
k++;
j--;
}
}
for (i = 0, j = col - 1; j > 0; j--) {
flag = 0;
i = 0;
count = j;
count1 = 0;
k = j;
while (k < col && i<row) {
if (arr[i][k] == arr[count1][count]&& arr[count1][count]!=' ')
flag++;
else {
flag = 0;
count = k;
count1 = i;
}
if (flag == times)return arr[count1][count];
k--;
i++;
}
}
for (i = 0,j=0; j < col; j++) {
flag = 0;
i = 0;
count = j;
count1 = i;
k = j;
while (i < row && k < col) {
if (arr[i][k] == arr[count1][count]&&arr[i][k]!=' ')
flag++;
else {
flag = 0;
count = k;
count1 = i;
}
if (flag == times)return arr[count1][count];
k++;
i++;
}
}
count = 0;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
if (arr[i][j] != ' ')count++;
else break;
if (count == row * col)return 'Q';
else return 'C';
}
最后收工。
感谢大家的浏览,欢迎点赞收藏