弹指间计算机协会 2020做游戏学编程:井字棋

编程入门 行业动态 更新时间:2024-10-08 22:52:34

弹指间计算机<a href=https://www.elefans.com/category/jswz/34/1765638.html style=协会 2020做游戏学编程:井字棋"/>

弹指间计算机协会 2020做游戏学编程:井字棋

目录

  • 双人对战
    • 总体流程
    • 初始化棋盘
    • 输出棋盘
    • 落子
    • 判断棋盘是否已满
    • 判断胜利方
    • 主函数
  • 人机对战
    • 电脑整体逻辑
    • 电脑找三连
    • 电脑防止人三连
    • 按优先级落子
  • 完整代码

双人对战

总体流程

0.初始化
1.展示棋盘
2.玩家1落子
3.展示棋盘
4.判断是否胜利,若胜利,跳到9
5.玩家2落子
6.展示棋盘
7.判断是否胜利,若胜利,跳到9
8.若无人胜利,回到1
9.若已有人胜利,则回到0或结束。

初始化棋盘

void init_board(char arr[3][3]) {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {arr[i][j] = ' ';}}
}

输出棋盘

void display_board(char arr[3][3]) {system("cls");for (int i = 0; i < 3; i++) {printf(" %c|%c |%c\n", arr[i][0], arr[i][1], arr[i][2]);if (i < 2)printf("--|--|--");printf("\n");}
}

落子

void player_chess(char arr[3][3]) {int x,y;while (1) {printf("请输入你所要下棋的坐标:");scanf("%d%d", &x, &y);x--;y--;if (arr[x][y] == ' ' && x < 3 && y < 3) {arr[x][y] = 'X';break;}else {printf("这个位置已经被占或在格子之外,请重新下棋。\n");continue;}}
}

判断棋盘是否已满

int check_full(char arr[3][3]) {for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++)if (arr[i][j] == ' ')return 0;return 1;
}

判断胜利方

char check_win(char arr[3][3]) {int i = 0;int ret = 0;for (i = 0; i < 3; i++)if ((arr[i][0] == arr[i][1]) && (arr[i][2] == arr[i][1]))return arr[i][0];for (i = 0; i < 3; i++)if ((arr[0][i] == arr[1][i]) && (arr[2][i] == arr[1][i]))return arr[0][i];if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))return arr[0][0];if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))return arr[2][0];ret = check_full(arr);if (ret == 1)return 'q';return ' ';
}

主函数

			char arr[3][3] = { 0 };char ret=0;init_board(arr);do {display_board(arr);player_chess(arr);display_board(arr);if (check_win(arr) != ' ') {ret = check_win(arr);break;}player2_chess(arr);display_board(arr);				ret = check_win(arr);} while (ret == ' ');display_board(arr);if (ret == 'X')printf("玩家1赢的游戏\n");else if (ret == 'O')printf("玩家2赢的游戏\n");else if (ret == 'q')printf("游戏平局\n");

人机对战

电脑整体逻辑

1.电脑找三连
2.电脑防止人三连
3.电脑按优先级落子。中心点优先级>角>边

电脑找三连

	int countx,count0,pos0=-1;for (int i = 0; i < 3; i++) {countx = 0; count0 = 0; pos0 = -1;for (int j = 0; j < COL; j++) {if (arr[i][j] == 'O')countx++;if (arr[i][j] == ' ') {count0++;pos0 = j;}}if (countx == 2 && count0 == 1) {arr[i][pos0] = 'O';return;}}countx = 0; count0 = 0; pos0 = -1;for (int i = 0; i < 3; i++) {countx = 0; count0 = 0; pos0 = -1;for (int j = 0; j < 3; j++) {if (arr[j][i] == 'O')countx++;if (arr[j][i] == ' ') {count0++;pos0 = j;}}if (countx == 2 && count0 == 1) {arr[pos0][i] = 'O';return;}}countx = 0; count0 = 0; pos0 = -1;for (int i = 0; i < 3; i++) {if (arr[i][2 - i] == 'O')countx++;if (arr[i][2 - i] == ' ') {count0++;pos0 = i;}}if (countx == 2 && count0 == 1) {arr[pos0][2 - pos0] = 'O';return;}

电脑防止人三连

	int countx,count0,pos0=-1;for (int i = 0; i < 3; i++) {countx = 0; count0 = 0; pos0 = -1;for (int j = 0; j < COL; j++) {if (arr[i][j] == 'X')countx++;if (arr[i][j] == ' ') {count0++;pos0 = j;}}if (countx == 2 && count0 == 1) {arr[i][pos0] = 'O';return;}}countx = 0; count0 = 0; pos0 = -1;for (int i = 0; i < 3; i++) {countx = 0; count0 = 0; pos0 = -1;for (int j = 0; j < 3; j++) {if (arr[j][i] == 'X')countx++;if (arr[j][i] == ' ') {count0++;pos0 = j;}}if (countx == 2 && count0 == 1) {arr[pos0][i] = 'O';return;}}countx = 0; count0 = 0; pos0 = -1;for (int i = 0; i < 3; i++) {if (arr[i][2 - i] == 'X')countx++;if (arr[i][2 - i] == ' ') {count0++;pos0 = i;}}if (countx == 2 && count0 == 1) {arr[pos0][2 - pos0] = 'O';return;}

按优先级落子

if (arr[1][1] == ' ') {arr[1][1] = 'O';return;}if (arr[0][2] == ' ') {arr[0][2] = 'O';return;}if (arr[2][0] == ' ') {arr[2][0] = 'O';return;}if (arr[0][0] == ' ') {arr[0][0] = 'O';return;}if (arr[2][2] == ' ') {arr[2][2] = 'O';return;}if (arr[0][1] == ' ') {arr[0][1] = 'O';return;}if (arr[1][0] == ' ') {arr[1][0] = 'O';return;}if (arr[1][2] == ' ') {arr[1][2] = 'O';return;}if (arr[2][1] == ' ') {arr[2][1] = 'O';return;}

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
int check_full(char arr[ROW][COL]);
void init_board(char arr[ROW][COL]) {for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {arr[i][j] = ' ';}}
}void display_board(char arr[ROW][COL]) {system("cls");for (int i = 0; i < ROW; i++) {printf(" %c|%c |%c\n", arr[i][0], arr[i][1], arr[i][2]);if (i < 2)printf("--|--|--");printf("\n");}
}void player_chess(char arr[ROW][COL]) {int x = 0;int y = 0;while (1) {printf("请输入你所要下棋的坐标:");scanf("%d%d", &x, &y);x--;y--;if (arr[x][y] == ' ' && x < ROW && y < ROW) {arr[x][y] = 'X';break;}else {printf("这个位置已经被占或在格子之外,请重新下棋。\n");continue;}}
}void player2_chess(char arr[ROW][COL]) {int x = 0;int y = 0;while (1) {printf("请输入你所要下棋的坐标:,\n先输入纵轴坐标后横轴坐标\n取值范围1~3");scanf("%d%d", &x, &y);x--;y--;if (arr[x][y] == ' ' && x < ROW && y < ROW) {arr[x][y] = 'O';break;}else {printf("这个位置已经被占或在格子之外,请重新下棋。\n");continue;}}
}void computer_chess(char arr[ROW][COL]) {int countx,count0,pos0=-1;for (int i = 0; i < 3; i++) {countx = 0; count0 = 0; pos0 = -1;for (int j = 0; j < COL; j++) {if (arr[i][j] == 'O')countx++;if (arr[i][j] == ' ') {count0++;pos0 = j;}}if (countx == 2 && count0 == 1) {arr[i][pos0] = 'O';return;}}for (int i = 0; i < 3; i++) {countx = 0; count0 = 0; pos0 = -1;for (int j = 0; j < 3; j++) {if (arr[j][i] == 'O')countx++;if (arr[j][i] == ' ') {count0++;pos0 = j;}}if (countx == 2 && count0 == 1) {arr[pos0][i] = 'O';return;}}countx = 0; count0 = 0; pos0 = -1;for (int i = 0; i < 3; i++) {if (arr[i][i] == 'O')countx++;if (arr[i][i] == ' ') {count0++;pos0 = i;}}countx = 0; count0 = 0; pos0 = -1;for (int i = 0; i < 3; i++) {if (arr[i][2 - i] == 'O')countx++;if (arr[i][2 - i] == ' ') {count0++;pos0 = i;}}if (countx == 2 && count0 == 1) {arr[pos0][2 - pos0] = 'O';return;}for (int i = 0; i < 3; i++) {countx = 0; count0 = 0; pos0 = -1;for (int j = 0; j < COL; j++) {if (arr[i][j] == 'X')countx++;if (arr[i][j] == ' ') {count0++;pos0 = j;}}if (countx == 2 && count0 == 1) {arr[i][pos0] = 'O';return;}}for (int i = 0; i < 3; i++) {countx = 0; count0 = 0; pos0 = -1;for (int j = 0; j < 3; j++) {if (arr[j][i] == 'X')countx++;if (arr[j][i] == ' ') {count0++;pos0 = j;}}if (countx == 2&& count0 == 1) {arr[pos0][i] = 'O';	return;}}countx = 0; count0 = 0; pos0 = -1;for (int i = 0; i < 3; i++) {if (arr[i][i] == 'X')countx++;if (arr[i][i] == ' ') {count0++;pos0 = i;}}if (countx == 2 && count0 == 1) {arr[pos0][pos0] = 'O';return;}countx = 0;count0 = 0; pos0 = -1;for (int i = 0; i < 3; i++) {if (arr[i][2-i] == 'X')countx++;if (arr[i][2-i] == ' ') {count0++;pos0 = i;}}if (countx == 2 && count0 == 1) {arr[pos0][2-pos0] = 'O';return;}if (arr[1][1] == ' ') {arr[1][1] = 'O';return;}if (arr[0][2] == ' ') {arr[0][2] = 'O';return;}if (arr[2][0] == ' ') {arr[2][0] = 'O';return;}if (arr[0][0] == ' ') {arr[0][0] = 'O';return;}if (arr[2][2] == ' ') {arr[2][2] = 'O';return;}if (arr[0][1] == ' ') {arr[0][1] = 'O';return;}if (arr[1][0] == ' ') {arr[1][0] = 'O';return;}if (arr[1][2] == ' ') {arr[1][2] = 'O';return;}if (arr[2][1] == ' ') {arr[2][1] = 'O';return;}
}int check_full(char arr[ROW][COL]) {int i = 0;int j = 0;for (i = 0; i < ROW; i++)for (j = 0; j < COL; j++)if (arr[i][j] == ' ')return 0;return 1;
}char check_win(char arr[ROW][COL]) {int i = 0;int ret = 0;for (i = 0; i < ROW; i++)if ((arr[i][0] == arr[i][1]) && (arr[i][2] == arr[i][1]))return arr[i][0];for (i = 0; i < COL; i++)if ((arr[0][i] == arr[1][i]) && (arr[2][i] == arr[1][i]))return arr[0][i];if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))return arr[0][0];if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))return arr[2][0];ret = check_full(arr);if (ret == 1)return 'q';return ' ';
}int main() {char arr[ROW][COL] = { 0 };int input = 1;while (input) {printf("请选择是否开始游戏:\n");printf("1:玩家先手,电脑后手\n2:玩家后手,电脑先手\n3:双人对战,\n0:结束游戏");scanf("%d", &input);switch (input) {case 3: {char ret = 0;init_board(arr);do {display_board(arr);player_chess(arr);display_board(arr);if (check_win(arr) != ' ') {ret = check_win(arr);break;}player2_chess(arr);ret = check_win(arr);} while (ret == ' ');display_board(arr);if (ret == 'X')printf("玩家1赢的游戏\n");else if (ret == 'O')printf("玩家2赢的游戏\n");else if (ret == 'q')printf("游戏平局\n");}break;case 2: {char ret = 0;init_board(arr);do {display_board(arr);computer_chess(arr);display_board(arr);if (check_win(arr) != ' ') {ret = check_win(arr);break;}player_chess(arr);ret = check_win(arr);} while (ret == ' ');display_board(arr);if (ret == 'X')printf("玩家赢的游戏\n");else if (ret == 'O')printf("电脑赢的游戏\n");else if (ret == 'q')printf("游戏平局\n");}break;case 1: {char ret = 0;init_board(arr);do {display_board(arr);player_chess(arr);display_board(arr);if (check_win(arr) != ' ') {ret = check_win(arr);break;}computer_chess(arr);ret = check_win(arr);} while (ret == ' ');display_board(arr);if (ret == 'X')printf("玩家赢的游戏\n");else if (ret == 'O')printf("电脑赢的游戏\n");else if (ret == 'q')printf("游戏平局\n");}break;case 0:break; break;default:;}}system("pause");return 0;
}

更多推荐

弹指间计算机协会 2020做游戏学编程:井字棋

本文发布于:2024-02-19 19:35:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765626.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:协会   计算机   弹指间   游戏   井字棋

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!